Die Eingabeaufforderung wird in Tkinter unendlich oft geöffnet
In meiner vorherigen Frage- Funktion grab_set (), die in tkinter nicht funktioniert , hat mir Flavio Moraes einen Code vorgeschlagen.
Als ich versuchte, es in meinen Hauptcode zu implementieren, wurde ein Fehler angezeigt, den ich hier aufgezeichnet habe: https://youtu.be/qQyeTmbdqT0
Hier ist ein Teil dieses Codes, der genau den gleichen Fehler erzeugt:
from tkinter import *
def login():
#ALL GIFs etc.
top.resizable(0, 0)
top.title("IDLE for MySQL- Login")
top.geometry("1080x720")
submit_button = Button(top,
text="Login", fg="#FFFFFF", bd=4, bg="#000000", width=8, font=("Helvetica", 18), command=check).place(
x=410,
y=400)
quit_button = Button(top,
text="Quit", fg="#FFFFFF", bd=4, bg="#000000", width=8, font=("Helvetica", 18), command=exit).place(
x=550,
y=400)
def check():
global nlabel, top
#user = _id.get() [_id = Entry]
#passw = _p.get() [_p = Entry]
global mydb, c
while True:
try:
"""
mydb = mysql.connector.connect(
host="localhost",
user=user,
password=passw
)
c = mydb.cursor(buffered=True)"""
raise TypeError #Any error just to produce a "Wrong Password" Effect
except:
inc = Toplevel()
inc.wait_visibility()
inc.grab_set_global()
inc.focus_set()
inc.geometry("300x100")
msg = Label(inc,
text="Incorrect User ID/ Password", font=("Helvetica", 12)).place(
x=10,
y=15)
button1 = Button(inc,
text="Ok", bg="#FFFFFF", bd=3, fg="#000000", font=("Helvetica", 18), command=closepop).place(
x=190,
y=55)
button2 = Button(inc,
text="Exit", bg="#FFFFFF", bd=3, fg="#000000", font=("Helvetica", 18), command=exit).place(
x=240,
y=55)
else:
break
def closepop():
global inc
inc.grab_release()
inc.destroy()
top = Tk()
login()
top.mainloop()
Soweit ich weiß, besteht das Problem darin, dass jedes Mal, wenn der Code nach dem Kennwort sucht, unabhängig davon, welche Taste vom Benutzer gedrückt wird oder nicht. Ich habe sogar versucht, es in einer Schleife zu stoßen, aber das hat auch nicht funktioniert.
Antworten
Die while TrueSchleife ist eine Endlosschleife, und innerhalb der Schleife wird ein Fehler ausgelöst, der zur Ausführung des exceptBlocks führt. Da Sie die Schleife nicht ordnungsgemäß verlassen, geschieht dies weiterhin. Es ist nicht klar, was Sie mit dem Code versuchen, aber das ist das Problem. Eine mögliche Lösung besteht darin, after()die Funktion eine bestimmte Zeit in ms zu wiederholen. Wie root.after(5000,check)dies wird ausgeführt , check()nachdem 5000 ms (5 sec).