如何使用按钮在Tkinter窗口中绘制标签?

时间:2015-05-14 07:35:37

标签: python button tkinter label

我希望点击按钮时应显示标签,然后开始下载。但在下面这种情况下,框架会卡住,比如如果下载需要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()

1 个答案:

答案 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()并确保您还将变量作为参数传递。