1
votes

mauvais nom de chemin de fenêtre python

mon code fonctionnait bien avant d'ajouter un bloc de code def startcheck (self): et je ne suis pas sûr de ce qui ne va pas. s'il vous plaît dites-moi ce que je fais mal, merci. voici ce qu'il dit:

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()

voici une petite partie de mon code:

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"


0 commentaires

3 Réponses :


-2
votes

Il y a plusieurs problèmes:

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)


1 commentaires

Cela ressemble plus à une diatribe contre la qualité du code qu'à une tentative de répondre à la question.



3
votes

Quelques éléments vous permettront d'être opérationnel:

  • ajoutez self.frame = master comme première ligne de votre méthode __init__
  • changez command = self.startcheck () en command = self.startcheck , l'argument de commande attend un appelable (alors qu'avec les parenthèses, il a déjà été appelé)
  • L'extrait n'a pas de classe Question1 mais j'imagine que c'est ailleurs dans votre code
  • devrait utiliser self.name.get () == "" au lieu de == None qui ne devrait jamais être vrai comme StringVar.get () < / code> renvoie une chaîne. L'autre moyen plus concis de le faire est d'utiliser: if self.name.get (): {true condition} else {false condition} . Cela tire parti de la véracité de python où la chaîne vide est évaluée à False

0 commentaires

0
votes

Il y a en effet plusieurs choses que vous devez corriger. Le premier et le plus important est que vous vous référez plusieurs fois à self.frame qui n'existe pas car votre classe n'est pas héritée de tk.Frame . Ci-dessous, j'ai corrigé votre code en utilisant master au lieu de self.frame:

# Obviously it throws an error when arriving at Question1

De plus, command = self.startcheck () ne fonctionnera pas à cause des parenthèses (il appelle le fonction, plutôt que de le spécifier comme fonction de rappel). Ci-dessus, j'ai passé maître aux fonctions, mais à la place, vous pouvez également inclure self.master = master dans __init __ () puis vous référer à self.master au lieu. Dans ce cas, vous n'avez pas à passer master en paramètre.

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()


0 commentaires