【问题标题】:Positional Argument Error: Classes and Tkinter位置参数错误:类和 Tkinter
【发布时间】:2017-08-10 11:24:51
【问题描述】:

所以我正在测试 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()

点击“播放”按钮时,出现此错误:

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 编程很陌生。任何帮助都会很棒。

【问题讨论】:

    标签: python python-3.x tkinter tk


    【解决方案1】:

    您会收到该错误,因为当您定义 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()
    

    【讨论】:

    • 感谢您抽出宝贵时间帮助我 :)。会将我的代码与您的编辑进行比较,以便从错误中吸取教训。
    • 不客气。如果你不明白我为什么做这件事或那件事,请告诉我。 @Tweakforce_LG
    • 我不明白为什么会出现此错误:'NoneType' 对象没有属性'destroy'。除非我在 self.Button 上使用 pack() 而不是实际的按钮,然后才将其变为变量
    • 抱歉,我提示错误 - “'NoneType' 对象没有属性 'destroy'。”。 - 如果我通过将 .pack() 放在按钮末尾来打包按钮,而不是在将按钮定义为 self.button 后将其打包在下面,则会发生这种情况。感谢@Billal BEGUERADJ 的帮助
    • command=self.Play(Master) 您在开头段落中提出的建议无疑是错误的。这将立即调用Play并将None分配给command属性。
    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 2017-03-18
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多