Python Tkinter 隐藏窗口
这是我的代码:
import tkinter
import tkinter.messagebox as tkmessagebox
from tkinter import *
def Top_Withdraw(top):
top.withdraw()
Reaction()
def Reaction():
top2 = Tk()
B0 = Label(top2, text = "LOGGED IN", fg = "green", bg = "black", bd = 8)
B0.pack()
B1 = tkinter.Button(top2, text = "Character Creator")
B1.pack(side = LEFT)
B2 = tkinter.Button(top2, text = "Saved Characters")
B2.pack(side = RIGHT)
def Reaction2():
A7 = Label(top, text = "Password saved.")
A7.pack(side = BOTTOM)
def Character_Creator():
top3 = Tk()
C0 = Label(top3, text = "CHARACTER CREATOR", bd = 8)
C0.pack()
def Login(top):
A0 = Label(top, text = "WELCOME TO HORSEGARN", fg = "red", bd = 8)
A0.pack(side = TOP)
A1 = Label(top, text = "Username")
A1.pack()
A2 = Entry(top, bd = 3)
A2.pack()
A3 = Label(top, text = "Password")
A3.pack()
A4 = Entry(top, show = "*", bd = 3)
A4.pack()
A5 = tkinter.Button(top, text = "Log In", command = Top_Withdraw(top))
A5.pack()
var = IntVar()
A6 = tkinter.Checkbutton(top, text = "Remember password", variable = var, command = Reaction2)
A6.pack()
top = Tk()
Login(top)
我用这段代码想要在点击名为“A5”的按钮时,最小化一个叫“top”的窗口,使用的是“top.withdraw”这个命令。但是当我运行程序时,不知道为什么它并没有从函数Login(top)开始,而是直接跳到了Reaction()。
从逻辑上讲,程序应该是先从Login(top)开始,然后只有在点击名为A5的按钮时,才会转到Reaction(),对吧?我实在搞不懂为什么它会立刻跳到Reaction()。
我尝试过在Login()、Reaction()里定义“top”,也尝试把它定义为全局变量,但都没有用。我是不是不应该使用withdraw?
1 个回答
1
你的代码里还有一些其他的小错误。不过针对你提到的问题,主要有两个关键点。
首先,这行代码实际上是执行了命令,因为你给它传递了参数。Tkinter希望命令的参数是实例,而不是直接调用。所以在这里你传递的是一个调用,这就导致它执行了这个调用。这就是为什么它会运行那个Top_Withdraw方法:
A5 = tkinter.Button(top, text = "Log In", command = Top_Withdraw(top))
要解决这个问题,可以使用lambda。如果你需要给按钮的方法传递参数,就得像这样使用lambda:
A5 = tkinter.Button(top, text = "Log In", command = lambda: Top_Withdraw(top))
另外,你的程序根本不会运行,因为你没有把根窗口放进主循环里。所以一定要在最后一行加上这个:
top.mainloop()
这样你的程序就能正常运行,并且在你点击登录按钮时“消失”,正如你所要求的。不过我建议你可以考虑改进一些地方,比如你的导入部分。你实际上导入了三次tkinter,但用的方式都不一样,最后在方法中调用时也用不同的方式。此外,你可能还想把这些代码放到一个类里面。这只是我的一点建议。