在添加代码块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()
确实有很多事情需要纠正。首先也是最重要的一点是,您多次引用了
self.frame
,但它并不存在,因为您的类不是从tk.Frame
继承的。下面我使用master
而不是self.frame修复了您的代码:另外,command=self.startcheck()由于括号(它调用函数,而不是将其指定为回调函数)而不起作用。 上面我将master传递给函数,但您也可以在
__init__()
中包含self.master = master
,然后改为引用self.master
。在这种情况下,您不必将master作为参数传递有几件事可以让你振作起来:
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存在多个问题:
首先你必须理解Event-driven_programming
读^{}
读why-is-button-parameter-command-executed-when-declared
PyLint报告,相应地修复:
相关问题 更多 >
编程相关推荐