프롬프트가 Tkinter에서 무한히 열립니다.

Nov 13 2020

tkinter에서 작동하지 않는 이전 질문 grab_set () 함수 에서 Flavio Moraes가 코드를 제안했습니다.

기본 코드에서 구현하려고 할 때 여기에 기록한 오류가 발생했습니다. https://youtu.be/qQyeTmbdqT0

다음은 정확히 동일한 오류 를 생성하는 코드입니다 .

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

내가 이해 한 바에 따르면 문제는 사용 여부에 관계없이 코드가 암호를 확인할 때마다 암호를 확인한다는 것입니다. 나는 그것을 루프로 맞대려고 시도했지만 작동하지 않았습니다.

답변

2 CoolCloud Nov 14 2020 at 08:38

while True루프는 무한 루프와 루프 내부에은 실행으로 이어질 것입니다 오류, 제기 except블록을하고 제대로 루프의 탈옥하지 때문에 일어나는에 유지합니다. 코드로 무엇을하려고하는지 명확하지 않지만 이것이 문제입니다. 한 가지 잠재적 인 해결책은 after()ms 단위로 주어진 시간 동안 함수를 반복하는 것을 사용 하는 것입니다. 와 같이 5000ms (5 초) 후에 root.after(5000,check)실행됩니다 check().