为什么我的tkinter窗口只有在创建时才起作用?

时间:2018-11-22 13:52:07

标签: python tkinter

创建此模块时,我首先使tkinter窗口(全局所有设置)均按预期工作。我可以运行该模块,然后窗口工作,从输入字段中获取输入并显示欢迎或错误消息。但是,当我将它们放入函数中时,它停止正常工作,如图所示。 全局创建窗口时的外观,其中按钮和输入起作用:

https://gyazo.com/ffcb16416b8a971c09bfa60ee9367bbd

在函数内部创建后的外观:

https://gyazo.com/c8858a2793befafa41e71d1099f021d3

错误消息立即弹出,然后是带有输入字段但不包含按钮的主窗口。

这是我在函数内创建窗口和设置的代码:

def userSign(userEntry):
    userId = userEntry.get()
    if userId.isdigit() == True and len(userId) == 4:
        welcomeWindow = tkinter.Tk()
        welcomeWindow.title("Welcome")
        welcomeWindow.geometry("200x50")
        welcome = tkinter.Label(master=welcomeWindow, text="Welcome "+userId,font=("Helvetica", 18, "bold"))
        welcome.grid()
        welcomeWindow.mainloop()
    else:
        errorWindow = tkinter.Tk()
        errorWindow.title("ERROR")
        errorWindow.geometry("500x50")
        error = tkinter.Label(master=errorWindow, text="ERROR: "+userId +" DOES NOT MEET CRITERIA", font=("Helvetica", 18, "bold"))
        error.grid()
        userId=""
        errorWindow.mainloop()      

def show():
    window = tkinter.Tk()
    window.title("Sign In")
    window.geometry("250x100")

    signInPrompt = tkinter.Label(master = window, text = "Enter your ID to sign in")
    signInPrompt.grid(column=0,row=2)

    userEntry = tkinter.Entry(master = window)
    userEntry.grid(column=0,row=4)

    enterButton = tkinter.Button(master = window, text="Sign in", command=userSign(userEntry))
    enterButton.grid(column=0,row=6)

    window.mainloop()

如何获取它,以便在函数内部创建窗口时可以正常工作,因为该模块需要由其他主模块调用。

1 个答案:

答案 0 :(得分:0)

您正在创建Tk()的两个实例,这是个坏主意。而是将Toplevel()用于其他窗口。

在函数内部创建变量或窗口小部件时,名称在本地范围内,在函数外部不可用。当函数结束时,它们将被垃圾回收。

此外,正如@fhdrsdg指出的那样,按钮命令中存在问题。