Python Tkinter 隐藏窗口

0 投票
1 回答
3509 浏览
提问于 2025-04-18 10:29

这是我的代码:

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,但用的方式都不一样,最后在方法中调用时也用不同的方式。此外,你可能还想把这些代码放到一个类里面。这只是我的一点建议。

撰写回答