python tkinter多线程问题

我写了个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()

img

根据描述还原代码,需要有多强的想象能力,才能回答你这个问题。