在尝试使用tkinter的mainloop多线程时遇到了这个问题。如果我不尝试使用多线程,一切都会正常,但是如果我这样做,则会给我一个错误。
我正在实现该类,以在特定游戏中获取和设置角色坐标,并且此部分有效,但是应用程序不允许我退出。我尝试将self.root.protocol的第二个参数设置为self.on_quit()和self.on_quit(self),但这只是立即执行。
class PositionGUI:
EXIT_FLAG = False
def __init__(self, process: DSProcess):
self.root = Tk()
self.root.protocol("WM_DELETE_WINDOW", self.on_quit)
...
Thread(target=self.update, args=(self, process)).start()
self.root.mainloop()
def update(self, process: DSProcess):
while not self.EXIT_FLAG:
...
def on_quit(self):
self.EXIT_FLAG = True
self.root.destroy()
class DarkShell(DSProcess):
def __init__(self):
super(DarkShell, self).__init__()
...
Thread(target=PositionGUI.__init__, args=(PositionGUI, self)).start()
退出方法应该为更新功能设置一个标志,以完成并关闭应用程序的这一部分,但是相反,它给了我这个错误: “ TypeError:on_quit()缺少1个必需的位置参数:'self'”
答案 0 :(得分:1)
如果您甚至真的需要线程,Tkinter就必须位于主线程中(大多数情况下,您通常没有解决方法)
您的EXIT_FLAG = False
未定义为类属性,因此无法调用self.EXIT_FLAG
。
与其使用from tkinter import *
来代替import tkinter as tk
,这将防止任何重叠的导入引起错误。
因此,没有什么我可以实际测试的方法,我只能猜测您遇到的实际问题,但是以这个示例为例,让我知道是否有帮助。
import tkinter as tk
from threading import Thread
class PositionGUI(tk.Tk):
def __init__(self, process: DSProcess):
super().__init__()
self.protocol("WM_DELETE_WINDOW", self.on_quit)
self.EXIT_FLAG = False
...
Thread(target=self.update, args=(self, process)).start()
self.mainloop()
def update(self, process: DSProcess):
while not self.EXIT_FLAG:
pass
def on_quit(self):
self.EXIT_FLAG = True # note that this line does nothing useful
self.root.destroy()