我希望在单击按钮上显示标签,然后下载应启动。但是在下面的情况下,框架被卡住了,说如果下载需要10分钟,它就会卡住,并且该标签仅在10之后显示。
def call():
test1()
test2()
def test1():
button.pack_forget()
label.pack()
def test2():
"script to start download which might take 10 min"
frame=Tk()
frame.pack()
button=Button(frame,text="clickme",command=call)
label=Label(frame,text="downloading...Please wait")
button.pack()
frame.mainloop()
.pack_forget()
有时可能会有些麻烦。就我个人而言,我更喜欢将所有东西都包装到一种次级主机框架中,这是Tk()
窗口中唯一的直接孩子,所有内容都是次主机框架的孩子。
似乎您还忘记了将变量传递给call()
,然后将变量传递给test1
。由于您的标签和按钮是局部变量而不是全局变量,因此您将无需将它们传递到例程而无法绘制或销毁它们。要在TKINTER按钮命令系统的约束中执行此操作,您需要使用函数lambda:
(如下所示)。
因此,在您的代码中,类似的内容:
from tkinter import *
def Call(frame, mainframe, label):
test1(frame, mainframe, label)
test2()
def test1(frame, mainframe, label)
mainframe.destroy()
mainframe = Frame(frame)
label.pack()
def test2()
print("Only here so the program can be copied straight from SO")
#Blegh, download stuff
frame = Tk()
mainframe = Frame(frame) #This is the sub-master frame
button = Button(mainframe, text="clickme", command=lambda:Call(frame, mainframe, label) #Using lambda here allows you to pass parameters to the definition within Tkinters buttons command restraints
label = Label(mainframe, text="downloading . . . Please wait")
button.pack()
frame.mainloop()
此代码将以按下按钮擦除屏幕上的按钮并打包要打包的标签,如果您出于任何原因保留按钮,则仅通过添加行来修改 test1()
button.pack()
并确保您也将变量作为参数传递。