неверное имя пути к окну python - PullRequest
1 голос
/ 21 июня 2020

мой код работал нормально, прежде чем я добавил блок кода 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()

Ответы [ 3 ]

3 голосов
/ 21 июня 2020

Некоторые вещи помогут вам начать работу:

  • add self.frame = master в качестве первой строки вашего __init__ метода
  • замените command=self.startcheck() на command=self.startcheck, аргумент команды ожидает вызываемый (тогда как в круглых скобках он уже был вызван)
  • Фрагмент не имеет класса Question1, но я полагаю, что это где-то еще в вашем коде
  • должен используйте self.name.get() == "" вместо == None, что никогда не должно быть истинным, поскольку StringVar.get() возвращает строку. Другой более краткий способ сделать это - использовать: if self.name.get(): {true condition} else {false condition}. Это использует преимущество правдивости python, когда пустая строка оценивается как False
0 голосов
/ 21 июня 2020

Есть действительно несколько вещей, которые вам нужно исправить. Первое и самое важное - вы несколько раз ссылаетесь на 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 () не будет работать из-за круглых скобок (он вызывает функцию, а не указывает ее как функция обратного вызова). Выше я передал мастер функциям, но вместо этого вы также можете включить self.master = master в __init__(), а затем вместо этого обратиться к self.master. В этом случае вам не нужно передавать master в качестве параметра.

# Obviously it throws an error when arriving at Question1
0 голосов
/ 21 июня 2020

Есть несколько проблем:

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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...