代码:
import tkinter as tk from tkinter import ttk from PIL import Image, ImageTk import requests import json class MovieSearcher(tk.Tk): def __init__(self): super().__init__() self.title("短剧搜索---微信公众号:蓝胖子之家") self.geometry("1250x850") self.configure(bg="#1c1c1c") # 图片显示 self.image_frame = tk.Frame(self, bg="#1c1c1c") self.image_frame.pack(pady=20) self.image_label = tk.Label(self.image_frame, bg="#1c1c1c") self.image_label.pack() # 加载并显示图片 image = Image.open("lpz.png") image = image.resize((120, 100), Image.ANTIALIAS) photo = ImageTk.PhotoImage(image) self.image_label.configure(image=photo) self.image_label.image = photo # 输入框和搜索按钮 self.search_frame = tk.Frame(self, bg="#1c1c1c") self.search_frame.pack(pady=10) self.search_entry = tk.Entry(self.search_frame, font=("Courier", 14), bg="#333333", fg="#00ff00", insertbackground="#00ff00") self.search_entry.pack(side=tk.LEFT, padx=10) self.search_button = tk.Button(self.search_frame, text="搜索", command=self.search_movies, font=("Courier", 12), bg="#00ff00", fg="#1c1c1c") self.search_button.pack(side=tk.LEFT) # 分页控件 self.page_frame = tk.Frame(self, bg="#1c1c1c") self.page_frame.pack(pady=10) self.prev_button = tk.Button(self.page_frame, text="上一页", command=self.load_prev_page, font=("Courier", 12), bg="#00ff00", fg="#1c1c1c") self.prev_button.grid(row=0, column=0, padx=10) self.page_entry = tk.Entry(self.page_frame, width=5, font=("Courier", 12), bg="#333333", fg="#00ff00", insertbackground="#00ff00") self.page_entry.grid(row=0, column=1, padx=10) self.page_label = tk.Label(self.page_frame, text="/ 1 页", font=("Courier", 12), bg="#1c1c1c", fg="#00ff00") self.page_label.grid(row=0, column=2, padx=10) self.page_go_button = tk.Button(self.page_frame, text="跳转", command=self.go_to_page, font=("Courier", 12), bg="#00ff00", fg="#1c1c1c") self.page_go_button.grid(row=0, column=3, padx=10) self.next_button = tk.Button(self.page_frame, text="下一页", command=self.load_next_page, font=("Courier", 12), bg="#00ff00", fg="#1c1c1c") self.next_button.grid(row=0, column=4, padx=10) # 数据展示区域 self.movie_frame = tk.Frame(self, bg="#1c1c1c") self.movie_frame.pack(fill=tk.BOTH, expand=True, pady=10) self.movie_canvas = tk.Canvas(self.movie_frame, bg="#1c1c1c", highlightthickness=0) self.movie_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) self.movie_scrollbar = ttk.Scrollbar(self.movie_frame, orient=tk.VERTICAL, command=self.movie_canvas.yview) self.movie_scrollbar.pack(side=tk.RIGHT, fill=tk.Y) self.movie_canvas.configure(yscrollcommand=self.movie_scrollbar.set) self.movie_canvas.bind('<Configure>', lambda e: self.movie_canvas.configure(scrollregion=self.movie_canvas.bbox("all"))) self.movie_window = self.movie_canvas.create_window((0, 0), window=tk.Frame(self.movie_canvas, bg="#1c1c1c"), anchor="nw") self.current_page = 1 self.total_pages = 1 def search_movies(self): keyword = self.search_entry.get() self.load_movies(keyword, self.current_page) def load_movies(self, keyword, page): url = f"https://api.djcat.sbs/api/movies?page={page}&limit=10&name={keyword}" response = requests.get(url) data = json.loads(response.text) self.total_pages = (data["data"]["total"] + 9) // 10 self.page_label.configure(text=f"/ {self.total_pages} 页") self.page_entry.delete(0, tk.END) self.page_entry.insert(0, str(self.current_page)) for widget in self.movie_canvas.winfo_children(): widget.destroy() for movie in data["data"]["rows"]: movie_frame = tk.Frame(self.movie_canvas, bg="#333333") movie_frame.pack(fill=tk.X, padx=20, pady=10) movie_name = tk.Label(movie_frame, text=movie["name"], font=("Courier", 14), bg="#333333", fg="#00ff00") movie_name.pack(side=tk.LEFT) movie_link = tk.Button(movie_frame, text="打开", command=lambda link=movie["link"]: self.open_movie(link), font=("Courier", 12), bg="#00ff00", fg="#1c1c1c") movie_link.pack(side=tk.RIGHT) self.movie_canvas.configure(scrollregion=self.movie_canvas.bbox("all")) def load_prev_page(self): if self.current_page > 1: self.current_page -= 1 self.search_movies() def load_next_page(self): if self.current_page < self.total_pages: self.current_page += 1 self.search_movies() def go_to_page(self): try: page = int(self.page_entry.get()) if 1 <= page <= self.total_pages: self.current_page = page self.search_movies() except ValueError: pass def open_movie(self, link): import webbrowser webbrowser.open(link) if __name__ == '__main__': app = MovieSearcher() app.mainloop()
- 导入所需的模块:
tkinter
:用于创建GUI应用程序的库。ttk
:提供了一组更现代化的GUI控件。PIL
中的Image
和ImageTk
:用于处理和显示图像。requests
:用于发送HTTP请求和接收响应。json
:用于解析JSON数据。
- 创建
MovieSearcher
类,继承自tk.Tk
:- 初始化方法
__init__
设置应用程序的标题、大小和背景颜色。 - 创建图像显示区域的
Frame
和Label
,并加载并显示一张图片。 - 创建搜索输入框和搜索按钮。
- 创建分页控件,包括上一页、页码输入框、总页数和下一页按钮。
- 创建数据展示区域的
Frame
、Canvas
和滚动条。 - 初始化当前页和总页数为1。
- 初始化方法
- 定义
search_movies
方法:- 从搜索输入框获取关键词。
- 调用
load_movies
方法加载电影数据。
- 定义
load_movies
方法,用于加载电影数据:- 构建API请求的URL,其中包括关键词和当前页码。
- 发送HTTP请求并获取响应。
- 解析响应的JSON数据。
- 更新总页数和页码输入框的显示。
- 清空数据展示区域。
- 遍历电影数据,创建电影框架,包括电影名称和打开链接的按钮。
- 配置滚动区域并更新画布的大小。
- 定义
load_prev_page
方法,用于加载上一页的电影数据:- 如果当前页大于1,则将当前页减1,并调用
search_movies
方法重新加载电影数据。
- 如果当前页大于1,则将当前页减1,并调用
- 定义
load_next_page
方法,用于加载下一页的电影数据:- 如果当前页小于总页数,则将当前页加1,并调用
search_movies
方法重新加载电影数据。
- 如果当前页小于总页数,则将当前页加1,并调用
- 定义
go_to_page
方法,用于跳转到指定页码的电影数据:- 尝试将页码输入框中的内容转换为整数。
- 如果页码在有效范围内,则将当前页设置为指定页码,并调用
search_movies
方法重新加载电影数据。
- 定义
open_movie
方法,用于在浏览器中打开电影链接:- 导入
webbrowser
模块。 - 调用
webbrowser.open
方法打开指定链接。
- 导入
- 在
__main__
中创建MovieSearcher
实例,并调用mainloop
方法启动应用程序的事件循环。
运行效果:
后台回复短剧搜索获取文章工具
原文始发于微信公众号(蓝胖子之家):使用Python写全网短剧搜索工具
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论