import os from tkinter import * from tkinter import messagebox from tkinter import ttk import threading from doubanSpider.spider import get_subjectID as gID from doubanSpider.spider import run as run from doubanSpider.analysis import save_pics def put_name_to_listb1(): listb1.delete(0, END) movie = gID() l3.place(x=80, y=10) l3_var.set(f'正在搜索...') l3['background'] = 'yellow' i = 0 for name in movie: listb1.insert(i,name) i += 1 l3.place(x=80, y=10) l3_var.set(f'搜索完毕!') l3['background'] = 'green' def get_content(): # key_word = e1.get() select_path = c1.get() print(len(select_path)) # 1.再判断是否选择了磁盘 if len(select_path) == 1: # 2.判断所选路径是否存在 if not os.path.exists(select_path): # 3.判断是否在列表框选择了用户名 try: # 直接获取选中项目 global movie_name_selected movie_name_selected = listb1.get(listb1.curselection()) select_path = c1.get() + ':/DoubanContent/' + movie_name_selected + '/' l3.place(x=80, y=10) l3_var.set(f'正在爬取...') l3['background'] = 'yellow' run(movie_name_selected,select_path) l3.place(x=80, y=10) l3_var.set(f'爬取完毕!') l3['background'] = 'green' # 搜索后,但是没选择用户,会报TclError错误,此except就用来捕获这个异常 except TclError: messagebox.showwarning(title='警告', message='请选择一个电影!') l3.place(x=80, y=10) l3_var.set(f'请选择一个电影!') l3['background'] = 'red' # 获取当前选中项目(使用索引) else: messagebox.showwarning(title='警告', message='请检查路径!') l3.place(x=80, y=10) l3_var.set(f'请检查路径!') l3['background'] = 'red' else: messagebox.showwarning(title='警告', message='您未选择磁盘!') l3.place(x=80, y=10) l3_var.set(f'请检查是否选择了磁盘!') l3['background'] = 'red' def get_pics(): movie_name_selected = listb1.get(listb1.curselection()) select_path = c1.get() + ':/DoubanContent/' + movie_name_selected + '/' l3.place(x=80, y=10) l3_var.set(f'正在分析...') l3['background'] = 'yellow' save_pics(movie_name_selected, select_path) l3.place(x=80, y=10) l3_var.set(f'分析完毕!') l3['background'] = 'green' def open_disk(): disk = c1.get() big_dir = disk + ':/DoubanContent/' if len(disk) == 1: try: if not os.path.exists(big_dir): os.mkdir(big_dir) os.startfile(big_dir) except: messagebox.showwarning(title='警告', message='选中的磁盘不存在!') l3.place(x=80, y=10) l3_var.set(f'选中的磁盘不存在!') l3['background'] = 'red' else: messagebox.showwarning(title='警告', message='您未选中磁盘!') l3.place(x=80, y=10) l3_var.set(f'您未选中磁盘!') l3['background'] = 'red' def print_path(event): # 要使用完整的路径 global disk disk = c1.get() disk_path = c1.get() + ':/' if len(disk) == 1: if os.path.exists(disk_path): messagebox.showinfo(title='提示', message=f'文件将存储到:{disk}:/DoubanContent目录下') else: messagebox.showerror(title='错误', message='选定磁盘不存在!') l3.place(x=80, y=10) l3_var.set(f'选中的磁盘不存在!') l3['background'] = 'red' else: messagebox.showwarning(title='警告', message='请先选定磁盘!') l3.place(x=80, y=10) l3_var.set(f'请先选定磁盘!') l3['background'] = 'red' def window_quit(): ret = messagebox.askyesno(title='提示', message='是否要退出?') if ret: window.destroy() window.quit() def escape(event): window_quit() def thread_movie(func, *args): t = threading.Thread(target=func, args=args) t.setDaemon(True) t.start() if __name__ == '__main__': window = Tk() width = 600 height = 240 screenWidth = window.winfo_screenwidth() # 获取显示区域的宽度 screenHeight = window.winfo_screenheight() # 获取显示区域的高度 left = (screenWidth - width) / 2 top = (screenHeight - height) / 2 window.geometry("%dx%d+%d+%d" % (width, height, left, top)) window.resizable(0, 0) window.title('豆瓣影评简单分析软件') l1 = ttk.Label(window, text='运行状态:') l1.place(x=13, y=10) l3_var = StringVar() l3 = ttk.Label(window, background='yellow', textvar=l3_var) l3.place(x=80, y=10) l3_var.set('还没搜索') l1 = ttk.Label(window, text='本软件用于爬取豆瓣电\n影影评信息并简单分析') l1.place(x=60, y=60) l4 = ttk.Label(window, text='磁盘:') l4.place(x=13, y=120,) disk_list = ['C', 'D', 'E', 'F', 'G', 'H', 'I'] c1 = ttk.Combobox(window, justify='center', state='readonly', width=17, value=disk_list) c1.bind('<>', print_path) c1.place(x=80, y=120) b1 = ttk.Button(window, text='搜索', command=lambda: thread_movie(put_name_to_listb1,), width=7) b1.place(x=100, y=160) l5 = ttk.Label(window, text='豆瓣新片榜电影列表:') l5.place(x=250, y=10) lb1_var = StringVar() listb1 = Listbox(window, justify='center', listvariable=lb1_var, width=20, height=6) listb1.place(x=250, y=40, height=140) b2 = ttk.Button(window, text='开始爬取', command=lambda: thread_movie(get_content, ), width=7) b2.place(x=290, y=200) b3 = ttk.Button(window, text='打开文件夹', width=12, command=open_disk) b3.place(x=450, y=120) b3 = ttk.Button(window, text='退出', width=7, command=window_quit) b3.place(x=470, y=200) b4 = ttk.Button(window, text='分析数据', width=10, command=lambda: thread_movie(get_pics, )) b4.place(x=455, y=60) f1 = ttk.LabelFrame(window) f1.place(x=0, y=190) l6 = ttk.Label(f1, text='感谢您的使用!', foreground='red') l6.pack(anchor="w", fill=X) # 绑定esc键---退出 window.bind('', escape) # 加入主窗口销毁事件 window.protocol('WM_DELETE_WINDOW', window_quit) window.mainloop()