Positional Argument Error: Classes and Tkinter

Positional Argument Error: Classes and Tkinter

所以我正在测试 Tkinter 程序的一些代码,并希望有一个主菜单,然后是游戏本身。

我想将主菜单放在 __init__() 函数中,然后当按下按钮时,它会调用删除主菜单并加载新小部件的命令。为了测试,我只包含了 2 个按钮作为我的小部件,只是为了尝试这个想法。但是它出现了一个错误:

from tkinter import *
from tkinter import ttk

class Application:
    def __init__(self, master):
        But = ttk.Button(master, text = "Play", command = self.Play).pack()

    def Play(self, master):
        self.But.destroy()
        ttk.Button(master, text = "Test Button").pack()



def main():            

    root = Tk()
    Menu = Application(root)
    root.resizable(width=False, height=False)
    root.mainloop()

if __name__ == "__main__": main()

点击 "Play" 按钮时,出现以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\Python\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
TypeError: Play() missing 1 required positional argument: 'master'

我对使用 类 进行 tkinter 编程还很陌生。任何帮助都会很棒。

你得到那个错误是因为当你定义 Play() 函数时(在 def Play(self, master) 中)你已经指定了一个名为 master 的位置参数,它是强制性的但是当你使用相同的函数作为 ttk.Button 小部件的回调。这意味着您应该这样编码:lambda:self.Play(master)

一旦你这样做了,Python 解释器会通知你你在程序的其他地方犯了其他错误。因此,让我在 PEP8:

之后为您的程序提供最终解决方案
import tkinter as tk
from tkinter import ttk


class Application:

    def __init__(self, master):
        self.master = master
        self.button = ttk.Button(self.master, text = "play", command = self.play)
        self.button.pack()

    def play(self):
        self.button.destroy()
        self.new_button = ttk.Button(self.master, text = "Test Button")
        self.new_button.pack()


def main():  
    root = tk.Tk()
    Menu = Application(root)
    root.resizable(width=False, height=False)
    root.mainloop()


if __name__ == "__main__": 
   main()