我写了个gui,通过点击按钮调用多个函数爬虫,但是点击后页面就无反应,直到函数执行完毕。通过了解我知道需要用多线程解决,于是我找了个源码修改,将我的源码加入替换,但是还是出现无反应的情况。我发现当按钮调用一个简单的函数时可以正常执行,但是调用我的函数就会出现卡住的情况。
首先定义了一个class main( )
下面定义了一个def init(self) 里面定义了一系列变量并且global 用以被别的函数调用
init后面定义了一系列函数互相调用(这些函数不在init里)。
当按钮调用我的主函数时就会卡死,于是我写了个打印1到10000的函数,间隔1秒,当调用这个函数时gui界面正常。
请问是哪里出的问题?
通常,点击按钮起一个线程的话,会在线程启动后禁用该按钮,线程结束后取消按钮禁用。根据你的需求,我写了一个例子,仅供参考。有兴趣的话,也可以参考我的这篇博客:
import time, random
import threading
from tkinter import *
class MyApp(Tk):
"""继承Tk,创建自己的桌面应用程序类"""
def __init__(self):
"""构造函数"""
super().__init__()
self.title('下载任务管理器')
self.geometry('320x160')
#self.iconbitmap('res/Tk.ico')
self.info = StringVar() # 创建一个字符串变量对象
self.info.set('等待下载') # 置初值
label = Label(self, textvariable=self.info, font=("Arial Bold", 20)) # 将Label和整型变量对象关联
label.pack(side='left', expand='yes', fill='both', padx=5, pady=5)
self.btn = Button(self, text='点击开始', bg='#90F0F0')
self.btn.pack(side='right', anchor='center', fill='y', padx=5, pady=5)
self.btn.bind(sequence='<Button-1>', func=self.on_button) # 绑定事件和事件函数
def on_button(self, evt):
"""点击按钮事件的响应函数, evt是事件对象"""
if self.btn['state'] != 'disabled':
self.btn['state'] = 'disabled'
self.info.set('开始下载。。。')
args = list()
kwds = dict()
th = threading.Thread(target=self.func_threading, args=args, kwargs=kwds)
th.setDaemon(True)
th.start()
def func_threading(self, *args, **kwds):
"""线程函数,参数可随意设置。以下代码模拟多个下载任务"""
for task in ['url_1', 'url_2', 'url_3']:
time.sleep(random.random()*3+0.5) # 随机延时0.5~3.5秒,模拟单个站点下载
self.info.set('%s下载成功'%task)
self.info.set('下载完成')
self.btn['state'] = 'normal'
if __name__ == '__main__':
app = MyApp()
app.mainloop()
根据描述还原代码,需要有多强的想象能力,才能回答你这个问题。