当我使用tkinter调用update()方法而不是重写标签时,它只是在前一次调用下写入标签.我希望这可以重写前一行.
例如:
root=Tk()
while True:
w=Label(root, text = (price, time))
w.pack()
root.update()
Run Code Online (Sandbox Code Playgroud)
Bry*_*ley 11
你的问题很简单:当你这样做时while True,你会创建一个无限循环.该循环中的代码将一直运行,直到您强制程序退出.在该循环中,您将创建一个标签.因此,您将创建无限数量的标签.
如果要定期更新标签,请利用已经运行的无限循环 - 事件循环.您可以使用它after来安排将来调用的函数.该函数可以重新安排自己再次运行,保证它将运行直到程序退出.
这是一个简单的例子:
import Tkinter as tk
import time
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.clock = tk.Label(self, text="")
self.clock.pack()
# start the clock "ticking"
self.update_clock()
def update_clock(self):
now = time.strftime("%H:%M:%S" , time.gmtime())
self.clock.configure(text=now)
# call this function again in one second
self.after(1000, self.update_clock)
if __name__== "__main__":
app = SampleApp()
app.mainloop()
Run Code Online (Sandbox Code Playgroud)
课程BadRoot应该展示您遇到的问题。您可以注释掉对类的调用,以使用完整的工作示例进行验证。如果您按编写的方式运行代码,它将更新类中的标签GoodRoot。注释掉的第一行显示了用于更改标签中文本的替代语法。
from tkinter import Tk, Label
from time import sleep
from random import random
class BadRoot(Tk):
def __init__(self, price, time):
super().__init__()
self.labels = []
while True:
self.labels.append(Label(self, text=(price, time)))
self.labels[-1].pack()
self.update()
sleep(1)
class GoodRoot(Tk):
def __init__(self, callback):
super().__init__()
self.label = Label(self, text=str(callback()))
self.label.pack()
while True:
## self.label['text'] = str(callback())
self.label.configure(text=str(callback()))
self.update()
sleep(1)
if __name__ == '__main__':
## BadRoot('$1.38', '2:37 PM')
GoodRoot(random)
Run Code Online (Sandbox Code Playgroud)
原始代码的问题是每次循环都会创建一个新标签并将其打包到界面中。您真正想要做的只是编辑标签显示的文本,而不是用新标签替换标签。还有其他方法可以执行此操作,但此方法应该适合您。
| 归档时间: |
|
| 查看次数: |
36856 次 |
| 最近记录: |