pythontkinter收回

pythontkinter收回,python,tkinter,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

这是我的代码:

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)
使用此代码,当使用“top.draw”命令单击定义为“A5”的按钮时,我试图最小化定义为“top”的窗口。但是,当我尝试运行该程序时,由于某种原因,它不是从函数Login(顶部)开始,而是从Reaction()开始

从逻辑上看,程序不应该从Login(顶部)开始,并且只有在单击定义为A5的按钮时才移动到Reaction()?我一辈子都看不出它为什么会立即做出反应


我曾尝试在Login()内、Reaction()内以及作为全局变量定义“top”,但这些都不起作用。我应该不使用“撤消”吗?

您的代码中几乎没有其他错误。然而,与您所谈论的问题相对应,有两个主要问题

下一行实际运行该命令,因为您正在向它传递参数。Tkinter希望命令参数是实例,而不是调用。在这里,你给它传递了一个调用,让它运行这个调用。这就是为什么它会运行Top_draw方法:

A5 = tkinter.Button(top, text = "Log In", command = Top_Withdraw(top))
要解决此问题,请使用lambda。如果必须将参数传递给button方法,则必须使用lambda,如下所示:

A5 = tkinter.Button(top, text = "Log In", command = lambda: Top_Withdraw(top))
此外,您的程序将永远不会运行,因为您从未将根窗口放入主循环。因此,请务必在最后一行添加以下内容:

top.mainloop()

这将使您的程序启动并运行,并在您按要求点击登录按钮时使其“消失”。不过,我肯定会考虑改变一些东西,比如你们的进口货。实际上,您以不同的方式导入tkinter 3次,然后在方法中以不同的方式调用它们。此外,您可能需要考虑将所有这一切放入类中。只有我的2美分。

Tkinter希望
command
关键字参数是可调用的,因此通常提供的值是函数名或使用lambda表达式指定的匿名值,但也可以是任何可调用对象的实例。