Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我必须在另一个类中创建我的线程,以避免冻结我的Tkinter UI?_Python_Multithreading_Tkinter_Python Multithreading - Fatal编程技术网

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

Python 为什么我必须在另一个类中创建我的线程,以避免冻结我的Tkinter UI?,python,multithreading,tkinter,python-multithreading,Python,Multithreading,Tkinter,Python Multithreading,我有一个Tkinter应用程序,其中有一个按钮,调用一个函数。为了避免冻结UI,当这个函数处理时,我在它自己的线程中启动它 如果我在同一个类中生成线程,因为我调用的方法已经定义,我的UI仍然冻结。我能够解决这个问题的唯一方法是创建一个Threader类,其唯一目的是在新线程中调用函数 对于这个问题,我已尝试将我的应用程序类缩减为仅相关的内容,但如果您怀疑我削减了太多,请告诉我: from threader import Threader from threading import Thread

我有一个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
这是我的Threader类:

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


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

考虑一下这行代码:

Thread(target=self.my_func()).start()
在功能上,它与此完全相同:

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

目标
需要是对函数的引用:

Thread(target=self.my_func)

您是否尝试过在
线程(target=self.my_func).start()上删除
()
?@CoolCloud没有,似乎解决了我的问题。布莱恩·奥克利的回答甚至解释了原因。非常感谢。谢谢你,这解决了我的问题!你这样说似乎很明显。
Thread(target=self.my_func)