Nhắc mở vô số lần trong Tkinter
Trong Câu hỏi trước đây, hàm grab_set () của tôi không hoạt động trong tkinter , Flavio Moraes đã gợi ý cho tôi một mã.
Khi tôi cố gắng triển khai nó trong mã chính của mình, tôi đã gặp lỗi mà tôi đã ghi lại ở đây: https://youtu.be/qQyeTmbdqT0
Dưới đây là một phần của mã trong đó sản xuất một cách chính xác các lỗi tương tự:
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()
Theo những gì tôi hiểu, vấn đề là mỗi khi mã kiểm tra mật khẩu bất kể nút nào được nhấn bởi người sử dụng hay không. Tôi thậm chí đã thử dùng nó trong một vòng lặp, nhưng điều đó cũng không hoạt động.
Trả lời
Các while Truevòng lặp là một vòng lặp vô hạn và bên trong vòng lặp của bạn nâng cao một lỗi, mà sẽ dẫn đến thực hiện các exceptkhối, và kể từ khi bạn không đúng cách phá vỡ ra khỏi vòng lặp, nó vẫn tiếp tục xảy ra. Không rõ bạn đang cố gắng làm gì với mã, nhưng đây là vấn đề. Một giải pháp tiềm năng là sử dụng after()nó sẽ lặp lại chức năng trong một khoảng thời gian nhất định, tính bằng mili giây. Giống như root.after(5000,check), điều này sẽ thực thi check()sau 5000ms (5 giây).