这是一个非常简单的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()
答案 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←
进一步了解与此主题相关的控制变量。
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循环”并删除标签文本。只有这样我才能让它发挥作用。
问候,卢卡。