【问题标题】:Why do i have to create my thread in another class, to avoid freezing my Tkinter UI?为什么我必须在另一个类中创建我的线程,以避免冻结我的 Tkinter UI?
【发布时间】:2020-10-26 15:01:53
【问题描述】:

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

如果我在同一个类中生成线程,因为我正在调用的方法已定义,我的 UI 仍会冻结。我能够解决此问题的唯一方法是创建一个 Threader 类,其唯一目的是在新线程中调用一个函数。

我已尝试将我的 app 类缩减为仅针对此问题的相关内容,但如果您怀疑我删减了太多内容,请告诉我:

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

这是我的 Threader 类:

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()吗?
  • @CoolCloud 不,我没有,它似乎解决了我的问题。 Bryan Oakley 的回答甚至解释了原因。谢谢!

标签: python multithreading tkinter python-multithreading


【解决方案1】:

考虑这行代码:

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

功能上和这个完全一样:

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

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

target 必须是函数的引用

Thread(target=self.my_func)

【讨论】:

  • 谢谢,解决了我的问题!当你这样说时,它似乎很明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多