2017-10-03 2 views
2

zwei getrennte Fragen funktionieren haben mit meinem CodePython - tkinter Startreihe nicht erscheinen und vorbei nicht korrekt

Wer zuerst kommt, ich nicht die vierte Reihe meiner Gitter, erscheinen bekommen können, obwohl die fünfte bis erscheint gut angezeigt werden.

Zweitens meine passVal Funktion hält mir den Fehler geben:

passVal() takes 1 positional argument but 2 were given 

Ich habe versucht, die Dinge neu anordnen und es in einen String konvertiert und nichts scheint zu funktionieren.

Ich denke, es gibt eine Chance, es ist eine Sache, die das gleiche Problem verursacht, da sie beide um den gleichen Knopf zentriert sind, aber ich bin mir nicht sicher.

import tkinter 

class AccountCreation: 
    def __init__(self): 
     self.main = tkinter.Tk() 
     self.main.title("Account Creation") 

     self.topleftLabel = tkinter.Label(text="  ") 
     self.topleftLabel.grid(row=1,column=1) 
     self.botrightLabel = tkinter.Label(text="  ") 
     self.botrightLabel.grid(row=5,column=5) 

     self.promptLabel = tkinter.Label(text="Create a password with at least nine (9)\n characters that contains at least one digit, \n one uppercase, and one lowercase letter.\n\n") 
     self.promptLabel.grid(row=2,column=2,columnspan=2) 

     self.passLabel = tkinter.Label(text="Password:") 
     self.passLabel.grid(row=3,column=2) 
     self.passEntry = tkinter.Entry(width = 18, justify='right') 
     self.passEntry.grid(row=3,column=3) 

     self.enterButton = tkinter.Button(text="Enter", \ 
             command=self.passVal(self.passEntry.get())) 
     self.enterButton.grid(row=4,column=2) 
     self.cancelButton = tkinter.Button(text="Cancel", \ 
             command=self.cancel) 
     self.cancelButton.grid(row=4,column=3) 

     tkinter.mainloop() 

def passVal(pw): 
    if len(pw) < 9: 
     print ("no") 

def cancel(self): 
    self.main.destroy() 

my_gui = AccountCreation() 
+0

BTW Sie müssen keine Etiketten für den Abstand verwenden. Sie können das Padding dafür verwenden. –

+0

@BryanOakley, ich glaube nicht, dass diese Frage ein Duplikat des Artikels ist, auf den Sie verwiesen haben. Dieses Frageproblem hing mehr mit dem fehlenden 'self'-Argument in der' passVal'-Methode zusammen. Ja, es gab auch die Frage der Befehlsausführung bei init, aber das war nicht die Hauptfrage/das Hauptproblem. –

+0

@ Mike-SMT: fair genug. –

Antwort

2

Neben den inden Fragen Sie haben, alle Methoden in einer Klasse müssen Sie sich selbst als erstes Argument übergeben, wenn Sie spezielle Tags verwenden, das es sich um eine Stand-alone-Funktion machen kann.

Wechsel:

def passVal(pw): 

An:

def passVal(self, pw): 

Sie müssen auch den Befehl ändern auf Dich Enter-Taste lambda verwenden, um Python zu verhindern, dass die passVal Aufruf der Methode beim Start .

Wechsel:

command=self.passVal(self.passEntry.get()) 

An:

command=lambda: self.passVal(self.passEntry.get()) 

Es ist nicht wirklich eine Lambda hier verwenden müssen, oder auch das Argument von self.passEntry.get() übergeben. Sie können den Wert des Eingabefelds in der passVal()-Methode mithilfe von self.passEntry.get() anstelle von pw abrufen.

Wenn Sie dies ändern:

command=lambda: self.passVal(self.passEntry.get()) 

Um dies:

command=self.passVal 

Und:

def passVal(self, pw): 
    if len(pw) < 9: 
     print ("no") 

Um dies:

def passVal(self): 
    if len(self.passEntry.get()) < 9: 
     print ("no") 

Ihr Programm funktioniert gut und Sie können vermeiden, ein Lambda in Ihrem Befehl zu verwenden.

Hinweis: Sie brauchen keine Etiketten als Abstandshalter zu verwenden. Sie können padx und pady einfach in Ihrer Rasterplatzierung verwenden.

Werfen Sie einen Blick auf den Code unten:

import tkinter 

class AccountCreation: 
    def __init__(self): 
     self.main = tkinter.Tk() 
     self.main.title("Account Creation") 

     self.promptLabel = tkinter.Label(text="Create a password with at least nine (9)\n characters that contains at least one digit, \n one uppercase, and one lowercase letter.\n\n") 
     self.promptLabel.grid(row=2,column=2,columnspan=2,pady=(10,10)) 

     self.passLabel = tkinter.Label(text="Password:") 
     self.passLabel.grid(row=3,column=2) 
     self.passEntry = tkinter.Entry(width = 18, justify='right') 
     self.passEntry.grid(row=3,column=3) 

     self.enterButton = tkinter.Button(text="Enter", \ 
              command=self.passVal(self.passEntry.get())) 
     self.enterButton.grid(row=4,column=2) 
     self.cancelButton = tkinter.Button(text="Cancel", \ 
              command=self.cancel) 
     self.cancelButton.grid(row=4,column=3,pady=(10,10)) 

     tkinter.mainloop() 

    def passVal(self, pw): 
     if len(pw) < 9: 
      print ("no") 

    def cancel(self): 
     self.main.destroy() 

my_gui = AccountCreation() 

Beachten Sie, dass einfach mit pady=(10,10) wir an der Ober- und Unterseite des Widgets setzen Raum haben.

Verwandte Themen