当我使用带有tkinter的update()时,我的Label会写另一行而不是重写相同的文本

wDr*_*ter 6 python tkinter

当我使用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)


Noc*_*wer 1

课程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)

原始代码的问题是每次循环都会创建一个新标签并将其打包到界面中。您真正想要做的只是编辑标签显示的文本,而不是用新标签替换标签。还有其他方法可以执行此操作,但此方法应该适合您。

  • 不,如果我明白你在问什么,原始代码并没有更好。无论如何,当给刚开始学习 GUI 编程的人提供答案时,你不应该给出犯根本性错误的例子。至少,不能不解决副作用和缺点作为答案的一部分。 (4认同)