为什么我必须在另一个类中创建线程,以避免冻结我的Tkinter UI



我有一个Tkinter应用程序,其中有一个按钮,用于调用一个函数。为了避免在这个函数处理时冻结UI,我在它自己的线程中启动它。

如果我在同一个类中派生线程,就像我正在调用的方法被定义一样,我的UI仍然会冻结。我能够解决这个问题的唯一方法是创建一个Threader类,其唯一目的是在新线程中调用函数。

对于这个问题,我已经尝试减少我的应用程序类,只做相关的事情,但如果你怀疑我删除了太多,请告诉我:

from threader import Threader
from threading import Thread
from tkinter import ttk
import tkinter as tk

class App(tk.Tk):
def __init__(self):
...
self.run_btn=ttk.Button(self, text='Run', command=self.start_clicked, width=15)
self.Threader = Threader()
...

def start_clicked(self):
Thread(target=self.my_func()).start() # this freezes my ui 
# self.Threader.run_thread(self.my_func()) # this does not freeze my ui

def my_func(self):
# some logic

这是我的线程类:

from threading import Thread
class Threader:
def run_thread(self, name, func):
Thread(target=func).start()

在我的App类中,我在start_clicked函数中包含了我尝试生成线程的两种方法。第一个是冻结我的UI的,而注释掉的,我通过Threader类生成线程的,是没有的。

在我看来,应该没有区别,所以我不明白为什么一个有效,另一个无效。

考虑这行代码:

Thread(target=self.my_func()).start()

在功能上,它与此完全相同:

result = self.my_func()
Thread(target=result).start()

看到问题了吗?您正在当前线程中立即调用self.my_func()

target需要是函数的引用

Thread(target=self.my_func)

相关内容

  • 没有找到相关文章

最新更新