TypeError:on_quit()缺少1个必需的位置参数:'self'

时间:2019-09-05 11:30:53

标签: python tkinter

在尝试使用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'”

1 个答案:

答案 0 :(得分:1)

  1. 如果您甚至真的需要线程,Tkinter就必须位于主线程中(大多数情况下,您通常没有解决方法)

  2. 您的EXIT_FLAG = False未定义为类属性,因此无法调用self.EXIT_FLAG

  3. 与其使用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()