错误的窗口路径名python
在添加代码块之前,我的代码运行良好错误的窗口路径名python,python,tkinter,Python,Tkinter,在添加代码块之前,我的代码运行良好defstartcheck(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
defstartcheck(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"
存在多个问题:
- 首先你必须明白
- 阅读
- 阅读
- PyLint报告,相应地修复:
有几件事可以让你振作起来:
作为添加self.frame=master
方法的第一行\uuuuu init\uuuu
- 将
更改为command=self.startcheck()
,command参数需要一个可调用的(而括号中已经调用了它)command=self.startcheck
- 该代码段没有
类,但我想它在代码中的其他地方Question1
- 应该使用
而不是self.name.get()==“”
,因为==None
返回一个字符串,所以该值永远不会为真。另一种更简洁的方法是使用:StringVar.get()
。这利用了python的真实性,其中空字符串的计算结果为Falseif self.name.get():{true condition}else{false condition}
- 确实有很多事情需要纠正。首先也是最重要的一点是,您多次引用了
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传递给函数,但您也可以在中包含self.master=master
,然后改为引用self.master
。在这种情况下,您不必将master作为参数传递
# Obviously it throws an error when arriving at Question1
这读起来更像是对代码质量的咆哮,而不是试图回答问题。
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()
# Obviously it throws an error when arriving at Question1