python Tk在我设置后保留标签文本

时间:2012-08-18 20:39:11

标签: python tkinter

这是一个非常简单的Python Tk程序。我似乎无法阻止一个简单的问题,我确信我错过了一些简单的事情。

我做了一个标签:

myLabelText = StringVar()
myLabelText.set("Something kinda long")
myLabel = Label(frame, textvariable=myLabelText).pack()

后来在同一个程序中,我想更新该标签,说“Foo”......

myLabelText.set("Foo")
frame.update_idletasks()

标签现在看起来像“Fooething有点长” 目标是只有“Foo”并清除标签文本的其余部分。

我尝试将标签设置为一长串空格,但由于某种原因,不会清除该字段中的文本。这样做的正确方法是什么?


修改

这是一个演示我的问题的完整示例。

from Tkinter import *
import tkFileDialog, Tkconstants
import time
import urllib2

def main():
    " Controlling function "

    root = Tk()
    app = App(root)
    root.mainloop()

class App:
    " Class for this application "

    def __init__(self, master):

        # Setup the window
        frame = Frame(master, width=400, height=200)
        frame.pack()
        frame.pack_propagate(0)
        self.frame = frame
        self.master = master

        # Start Button
        self.button = Button(frame, text='Start', bg="#339933", height=3, width=10, command=self.start)
        self.button.pack()

        # Label
        self.operation_action_text = StringVar()
        self.operation_action_text.set("Waiting on user to click start...")
        self.operation_action = Label(frame, textvariable=self.operation_action_text)
        self.operation_action.pack()


    def start(self):
        " Change the label "

        # Do something and tell the user
        response = urllib2.urlopen('http://www.kennypyatt.com')
        json_string = response.read()
        self.operation_action_text.set("Something kinda long")
        self.frame.update_idletasks()
        time.sleep(2)

        # Do something else and tell the user
        response = urllib2.urlopen('http://www.kennypyatt.com')
        json_string = response.read()
        self.operation_action_text.set("ABCDEFGHI")
        self.frame.update_idletasks()
        time.sleep(2)

        # Do a third thing and tell the user
        response = urllib2.urlopen('http://www.kennypyatt.com')
        json_string = response.read()
        self.operation_action_text.set("FOO")
        self.frame.update_idletasks()

        return

main()

2 个答案:

答案 0 :(得分:2)

您要考虑做的第一件事就是分离:

myLabel = Label(frame, textvariable=myLabelText).pack()

进入

myLabel = Label(frame, textvariable=myLabelText)
myLabel.pack()

请阅读→this link←了解相关信息。


要更新Label的文字,您不需要control variable 您可以通过以下两种方式之一更改文本:

myLabel.configure(text='new text')

myLabel['text'] = 'new text'

您可以检查第二个示例→here←
进一步了解与此主题相关的控制变量。


更新Label小部件的文本不需要

update_idletasks() 我只是在使用窗口geometry时才发现需要使用它 其中一个例子是centering a window


基于编辑:

将根和应用程序创建为全局函数的局部变量是非常不正统的 根据{{​​3}}所见的结构尝试重写。

您需要避免将time.sleep()与tkinter app一起使用;因为它与事件循环冲突。尝试将您的单个方法拆分为多个方法,然后您可以在每个方法结束时使用Tk的after(milliseconds, method)方法,在x毫秒后正常移动到下一个方法。

我还考虑从您的方法中移除return

答案 1 :(得分:0)

我知道帖子已经过时但我找到了解决问题的方法。 这是一个解释解决方案的小代码:

global y
y=0
top=TopLevel()

def_newlabel():
  global y,od2,odpuni
  if y > 0:
    od2.destroy()
    odpuni.destroy()
  odpuni = Label(top, text="blablabla",bg="lightskyblue")
  odpuni.grid(row=7, column= 3, sticky="E")
  od2 = Label(top, text="blabla",bg="lightskyblue")
  od2.grid(row=7, column= 4, sticky="W")
  y=y+1

所以基本上,你所要做的就是让计数器失去功能,将它设置为0,当你到达def_newlabel()时。如果您的计数器大于0,它将首先检查。如果不是,它将继续程序。如果您已使用标签,则计数器将大于0并触发“IF循环”并删除标签文本。只有这样我才能让它发挥作用。

问候,卢卡。