解决tkinter卡死问题
时间:2023-01-27 02:30:00
参考https://blog.csdn.net/qq_41204464/article/details/86707216
核心思路:
1.引入threading库
import threading
2.在界面回调函数中添加装饰器
# 包装进线程(耗时操作) @staticmethod def thread_it(func, *args): t = threading.Thread(target=func, args=args) t.setDaemon(True) # 保护-即使主界面关闭,线程也会留在后台运行(不对!) t.start() # 启动 # t.join() # 阻塞--会卡死界面!
以我写的为基础tkinter做界面,然后百度关键词爬图程序。有日志调试,界面不卡
#!/usr/bin/env python #-*- coding:utf-8 -*- import os, sys import requests import base64 #引入编码库 import threading #开线程 from time import sleep if sys.version_info[0] == 2: from Tkinter import * from tkFont import Font from ttk import * #Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel from tkMessageBox import * #Usage:f=tkFileDialog.askopenfilename(initialdir='E:/Python') #import tkFileDialog #import tkSimpleDialog else: #Python 3.x from tkinter import * from tkinter.font import Font from tkinter.ttk import * from tkinter.messagebox import * #import tkinter.filedialog as tkFileDialog #import tkinter.simpledialog as tkSimpleDialog #askstring() class Application_ui(Frame): #此类只实现界面生成功能,具体事件处理代码在子类Application中。 def __init__(self, master=None): Frame.__init__(self, master) self.master.title(百度关键词爬图 by达神 V1.0.3') self.master.geometry('763x383') self.createWidgets() def createWidgets(self): self.top = self.winfo_toplevel() self.style = Style() self.Command2Var = StringVar(value=清空日志 self.style.configure('TCommand2.TButton', font=(宋体,9) self.Command2 = Button(self.top, text=清空日志, textvariable=self.Command2Var, command=self.Command2_Cmd, style='TCommand2.TButton') self.Command2.setText = lambda x: self.Command2Var.set(x) self.Command2.text = lambda : self.Command2Var.get() self.Command2.place(relx=0.356, rely=0.021, relwidth=0.096, relheight=0.065) self.Text6Var = StringVar(value='8') self.Text6 = Entry(self.top, textvariable=self.Text6Var, font=(宋体,9)) self.Text6.setText = lambda x: self.Text6Var.set(x) self.Text6.text = lambda : self.Text6Var.get() self.Text6.place(relx=0.157, rely=0.439, relwidth=0.075, relheight=0.065) self.Text5Font = Font(font=(宋体,9) self.Text5 = Text(self.top, fg='#FFFFFF', bg='#000000', font=self.Text5Font) self.Text5.place(relx=0.042, rely=0.606, relwidth=0.295, relheight=0.316) self.Text5.insert('1.0','说明:\n将图片关键字和爬取页数信息设置好后开\n始爬图。理论值一页30张图片,保存图片\n路径下的文件夹路径为\n爬最大页数30推荐设置10\n') self.Text4Font = Font(font=(黑体,9)) self.Text4 = Text(self.top, fg='#00FF00', bg='#000000', font=self.Text4Font) self.Text4.place(relx=0.356, rely=0.104, relwidth=0.63, relheight=0.859) self.Text4.insert('1.0','爬图日志by达神\n') self.Command1Var = StringVar(value=开始爬图 self.style.configure('TCommand1.TButton', font=(宋体,9)) self.Command1 = Button(self.top, text=开始爬图, textvariable=self.Command1Var, command=self.Command1_Cmd, style='TCommand1.TButton') self.Command1.setText = lambda x: self.Command1Var.set(x) self.Command1.text = lambda : self.Command1Var.get() self.Command1.place(relx=0.241, rely=0.439, relwidth=0.096, relheight=0.086) self.Text3Var = StringVar(value='1') self.Text3 = Entry(self.top, textvariable=self.Text3Var, font=(宋体,9)) self.Text3.setText = lambda x: self.Text3Var.set(x) self.Text3.text = lambda : self.Text3Var.get() self.Text3.place(relx=0.052, rely=0.439, relwidth=0.085, relheight=0.065) self.Text2Var = StringVar(value='10') self.Text2 = Entry(self.top, textvariable=self.Text2Var, font=(宋体,9)) self.Text2.setText = lambda x: self.Text2Var.set(x) self.Text2.text = lambda : self.Text2Var.get() self.Text2.place(relx=0.241, rely=0.23, relwidth=0.085, relheight=0.065) self.Text1Var = StringVar(value=口罩女 self.Text1 = Entry(self.top, textvariable=self.Text1Var, font=(宋体,9)) self.Text1.setText = lambda x: self.Text1Var.set(x) self.Text1.text = lambda : self.Text1Var.get() self.Text1.place(relx=0.052, rely=0.23, relwidth=0.159, relheight=0.065) self.Label4Var = StringVar(value=总轮数 self.style.configure('TLabel4.TLabel', anchor='w', foreground='#FF0000', font=(宋体,9) self.Label4 = Label(self.top, text=总轮数, textvariable=self.Label4Var, style='TLabel4.TLabel') self.Label4.setText = lambda x: self.Label4Var.set(x) self.Label4.text = lambda : self.Label4Var.get()
self.Label4.place(relx=0.168, rely=0.334, relwidth=0.064, relheight=0.065)
self.Label3Var = StringVar(value='图片保存路径')
self.style.configure('TLabel3.TLabel', anchor='w', foreground='#FF0000', font=('宋体',9))
self.Label3 = Label(self.top, text='图片保存路径', textvariable=self.Label3Var, style='TLabel3.TLabel')
self.Label3.setText = lambda x: self.Label3Var.set(x)
self.Label3.text = lambda : self.Label3Var.get()
self.Label3.place(relx=0.052, rely=0.334, relwidth=0.096, relheight=0.065)
self.Label2Var = StringVar(value='爬取页数')
self.style.configure('TLabel2.TLabel', anchor='w', foreground='#FF8000', font=('宋体',9))
self.Label2 = Label(self.top, text='爬取页数', textvariable=self.Label2Var, style='TLabel2.TLabel')
self.Label2.setText = lambda x: self.Label2Var.set(x)
self.Label2.text = lambda : self.Label2Var.get()
self.Label2.place(relx=0.241, rely=0.125, relwidth=0.106, relheight=0.065)
self.Label1Var = StringVar(value='关键字')
self.style.configure('TLabel1.TLabel', anchor='w', foreground='#0000FF', font=('宋体',9))
self.Label1 = Label(self.top, text='关键字', textvariable=self.Label1Var, style='TLabel1.TLabel')
self.Label1.setText = lambda x: self.Label1Var.set(x)
self.Label1.text = lambda : self.Label1Var.get()
self.Label1.place(relx=0.073, rely=0.125, relwidth=0.085, relheight=0.065)
class Application(Application_ui):
#这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
def __init__(self, master=None):
Application_ui.__init__(self, master)
def getManyPages(self,keyword, pages,now=0):
params = []
for i in range(30+30*pages*now, 30 * pages*(now+1) + 30, 30):
params.append({
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': 201326592,
'is': '',
'fp': 'result',
'queryWord': keyword,
'cl': 2,
'lm': -1,
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': -1,
'z': '',
'ic': 0,
'word': keyword,
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': 0,
'istype': 2,
'qc': '',
'nc': 1,
'fr': '',
'pn': i,
'rn': 30,
'gsm': '1e',
'1488942260214': ''
})
url = 'https://image.baidu.com/search/acjson'
urls = []
for i in params:
urls.append(requests.get(url, params=i,timeout=600000).json().get('data'))
return urls
def getImg(self,dataList, localPath):
if not os.path.exists(localPath): # 新建文件夹
os.mkdir(localPath)
x = 0
for list in dataList:
for i in list:
if list==dataList[-1] and i==list[-1]:
print("本轮下载完毕,5秒后检索下一轮")
self.Text4.insert(END, '本轮下载完毕,5秒后检索下一轮\n')
global now
print("当前已经进行完了第:%s轮" % (now + 1))
self.Text4.insert(END,"当前已经进行完了第:%s轮\n" % (now + 1))
sleep(5)
if now