错误的窗口路径名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=self.startcheck
    ,command参数需要一个可调用的(而括号中已经调用了它)
  • 该代码段没有
    Question1
    类,但我想它在代码中的其他地方
  • 应该使用
    self.name.get()==“”
    而不是
    ==None
    ,因为
    StringVar.get()
    返回一个字符串,所以该值永远不会为真。另一种更简洁的方法是使用:
    if self.name.get():{true condition}else{false condition}
    。这利用了python的真实性,其中空字符串的计算结果为False

    • 确实有很多事情需要纠正。首先也是最重要的一点是,您多次引用了
      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