【问题标题】:How do I use a button to draw a label in a Tkinter window?如何使用按钮在 Tkinter 窗口中绘制标签?
【发布时间】:2015-05-14 07:35:37
【问题描述】:

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

【问题讨论】:

  • 代码大麦的第一部分对 python 重新采样。每个函数定义都应该有def。如果代码不完整,很难提供帮助。

标签: python button tkinter label


【解决方案1】:

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

【讨论】:

  • 嗨@Ethan Field,在test1下,您正在破坏大型机,然后试图在被破坏的标签上打包标签??还是我错了??
  • 如果这个问题已经回答,请关闭它
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
相关资源
最近更新 更多