错误的窗口路径名python

2024-05-16 14:24:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在添加代码块def startcheck(self):之前,我的代码运行良好,我不确定它出了什么问题。请告诉我我做错了什么,谢谢。它是这样说的:

Traceback (most recent call last):
  File "C:/MathsQuiz/venv/test 2.py", line 138, in <module>
    instance = Starting(root)
  File "C:/MathsQuiz/venv/test 2.py", line 21, in __init__
    self.usercont = Button(self.frame, text="Continue", command=self.startcheck())
_tkinter.TclError: bad window path name ".!frame"

以下是我代码的一小部分:

class Starting:
    def __init__(self, master):
    self.master = master
                self.usern = Label(self.frame,text="Please enter a username:", font=("16"))
        self.usern.grid(row=1, padx=20, pady=20)
        self.userentry = Entry(self.frame, width=50)
        self.userentry.grid(row=2)
        self.name = StringVar()
        self.name.set(self.userentry.get())
        self.usercont = Button(self.frame, text="Continue", command=self.startcheck())
        self.usercont.grid(row=3)
    
    def startcheck(self):
        if self.name.get() == None:
            nameerror = Label(self.frame, text="Please enter a username")
            nameerror.grid(row=5)
        else:
            self.clear1()

    def clear1(self):
        self.frame.destroy()
        Question1(root)

if __name__ == "__main__":
   root = Tk()
   root.title = ("Maths Quiz")
   instance = Starting(root)
   root.mainloop()

Tags: 代码textnameselfmasterdefrootframe
3条回答

确实有很多事情需要纠正。首先也是最重要的一点是,您多次引用了self.frame,但它并不存在,因为您的类不是从tk.Frame继承的。下面我使用master而不是self.frame修复了您的代码:

from tkinter import *

class Starting:
    def __init__(self, master):
        self.usern = Label(master ,text="Please enter a username:", font=("16"))
        self.usern.grid(row=1, padx=20, pady=20)
        self.userentry = Entry(master, width=50)
        self.userentry.grid(row=2)
        self.name = StringVar()
        self.name.set(self.userentry.get())
        self.usercont = Button(master, text="Continue", command=lambda: self.startcheck(master))
        self.usercont.grid(row=3)
    
    def startcheck(self, master):
        if self.name.get() == None:
            nameerror = Label(master, text="Please enter a username")
            nameerror.grid(row=5)
        else:
            self.clear1(master)

    def clear1(self, master):
        master.destroy()
        Question1(root)

if __name__ == "__main__":
    root = Tk()
    root.title = ("Maths Quiz")
    instance = Starting(root)
    root.mainloop()

另外,command=self.startcheck()由于括号(它调用函数,而不是将其指定为回调函数)而不起作用。 上面我将master传递给函数,但您也可以在__init__()中包含self.master = master,然后改为引用self.master。在这种情况下,您不必将master作为参数传递

# Obviously it throws an error when arriving at Question1

有几件事可以让你振作起来:

  • add self.frame = master作为__init__方法的第一行
  • command=self.startcheck()更改为command=self.startcheck,命令参数需要一个可调用的(而括号中的参数已经被调用)
  • 该代码段没有Question1类,但我想它在代码中的其他地方
  • 应该使用self.name.get() == ""而不是== None,因为StringVar.get()返回字符串,所以== None永远不应该为真。另一种更简洁的方法是使用:if self.name.get(): {true condition} else {false condition}。这利用了python的真实性,其中空字符串的计算结果为False

存在多个问题:

question.py:1:0: W0401: Wildcard import tkinter (wildcard-import)
question.py:5:27: E1101: Instance of 'Starting' has no 'frame' member (no-member)
question.py:8:31: E1101: Instance of 'Starting' has no 'frame' member (no-member)
question.py:12:31: E1101: Instance of 'Starting' has no 'frame' member (no-member)
question.py:4:23: W0613: Unused argument 'master' (unused-argument)
question.py:16:11: C0121: Comparison to None should be 'expr is None' (singleton-comparison)
question.py:17:30: E1101: Instance of 'Starting' has no 'frame' member (no-member)
question.py:24:8: E1101: Instance of 'Starting' has no 'frame' member (no-member)
question.py:25:8: E0602: Undefined variable 'Question1' (undefined-variable)

相关问题 更多 >