我希望点击按钮时应显示标签,然后开始下载。但在下面这种情况下,框架会卡住,比如如果下载需要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()
答案 0 :(得分:0)
.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()
并确保您还将变量作为参数传递。