Когда я использую update () с tkinter, мой Label пишет другую строку вместо того, чтобы переписать тот же текст - PullRequest
5 голосов
/ 27 сентября 2011

Когда я вызываю метод update (), используя tkinter вместо перезаписи метки, он просто записывает метку под предыдущим вызовом. Я хотел бы для этого переписать поверх предыдущей строки.

Например:

root=Tk()
while True:
    w=Label(root, text = (price, time))
    w.pack()
    root.update()

Ответы [ 3 ]

9 голосов
/ 28 сентября 2011

Ваша проблема заключается в следующем: когда вы делаете 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()
2 голосов
/ 27 сентября 2011

номер

Я подозреваю, что, даже не увидев этого, в коде, написанном wDroter, есть по крайней мере пара недоразумений. В общем случае в хорошо структурированном коде Tkinter НЕ обязательно использовать update (). Вот небольшой пример, который иллюстрирует обновления текста метки:

import Tkinter
import time

def update_the_label():
    updated_text = time.strftime("The GM time now is %H:%M:%S.", time.gmtime())
    w.configure(text = updated_text)

root = Tkinter.Tk()
w = Tkinter.Label(root, text = "Hello, world!")
b = Tkinter.Button(root, text = "Update the label", command = update_the_label)
w.pack()
b.pack()

root.mainloop()

Запустите это. Нажать кнопку. Каждый раз, когда вы делаете это (пока ваши нажатия отличаются не менее чем на секунду), вы увидите текстовое обновление.

1 голос
/ 27 сентября 2011

Класс 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)

Проблема с вашим исходным кодом заключается в том, что новая метка создается и упаковывается в интерфейс каждый раз черезпетля.Что вы на самом деле хотите сделать, так это просто отредактировать текст, отображаемый надписью, вместо того, чтобы заменить метку новой.Есть и другие способы сделать это, но этот метод должен работать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...