Как обновлять метки в tkinter динамически?

Если у вас есть строгая политика безопасности содержимого, которая не позволяет @ vladimir-salguero ответить , вы можете использовать это (обратите внимание на сценарий nonce):


Просто добавьте следующее в ссылку на таблицу стилей: media="none" data-async="true". Вот пример:


Пример для jQuery:


0
задан feeling unwelcome 14 July 2018 в 00:52
поделиться

2 ответа

Вот более простой метод, который не включает потоки.

Держите счетчик и каждый второй вызов функции.

Обновление: Чтобы ответить на ваш вопрос в комментариях.

Это не застрянет в функции. некоторый цикл, который мешает нам достичь mainloop(), потому что этот код добавляет только команду, которая должна быть запущена в списке событий с регулярным интервалом в 1 секунду. То, что на самом деле происходит, - это метод after(), который добавит новое даже для запуска не раньше, чем через 1 секунду (1000 миллисекунд). Поскольку Tkinter управляется событиями, Tkinter будет обрабатывать каждый, даже в списке, как он приходит после каждого цикла mainloop().

import tkinter as tk

root = tk.Tk()
counter = 0

def change_text():
    global counter
    my_list = [".", "..", "...", ""]
    if counter != 3:
        l.config(text="Loading{}".format(my_list[counter]))
        counter += 1
        root.after(1000, change_text)
    else:
        l.config(text="Loading{}".format(my_list[counter]))
        counter = 0
        root.after(1000, change_text)

l = tk.Label(root, text = "")
l.pack()

change_text()
root.mainloop()
2
ответ дан Mike - SMT 17 August 2018 в 12:08
поделиться
  • 1
    Спасибо, Майк, код работает точно так, как мне бы хотелось, но есть одна вещь, которую я не понимаю. Не следует ли зацикливать код в цикле change_text() и, следовательно, не сможет выполнить root.mainloop(), чтобы создать окно. – Matt 13 July 2018 в 22:11
  • 2
    Вы когда-нибудь пробовали функцию itertools.cycle? – Novel 13 July 2018 в 23:17

Вот такой же ответ, как @ Mike-SMT, но с использованием функции цикла, чтобы сделать его намного опрятным.

import tkinter as tk
from itertools import cycle

root = tk.Tk()
my_list = cycle([".", "..", "...", ""])

def change_text():
    l.config(text="Loading{}".format(next(my_list)))
    root.after(1000, change_text)

l = tk.Label(root)
l.pack()

change_text()
root.mainloop()
2
ответ дан Novel 17 August 2018 в 12:08
поделиться
  • 1
    У меня для вас такой же вопрос, как и у Майка - как скрипт умеет выполнять root.mainloop(), так как он не должен застревать в бесконечном цикле change_test()? – Matt 13 July 2018 в 23:21
  • 2
    Mainloop - это бесконечный цикл, который постоянно проверяет, произошло ли событие, на которое ему нужно ответить. Он также проверяет список запланированных событий, чтобы увидеть, пришло ли время сделать одно из них. Функция after НЕ является циклом, все, что она делает, добавляет событие в список запланированных событий, в вашем случае он добавляет «в current_time + 1000 запустите функцию change_test». Затем он возвращается. Он не блокируется, как sleep. Когда mainloop видит, что время больше запланированного времени, оно запускает change_text, что, конечно же, вызывает еще одно дополнение к расписанию событий. – Novel 13 July 2018 в 23:31
  • 3
    TLDR: after не является циклом, но он изменяет mainloop, поэтому мы можем использовать его, как если бы это был цикл. – Novel 13 July 2018 в 23:32
  • 4
    @Novel Мне это нравится. Я знал о itertools, но до сих пор не нуждался в них, и поэтому он не переходил мне в голову. – Mike - SMT 14 July 2018 в 00:12
  • 5
    Удивительно, спасибо, ребята – Matt 14 July 2018 в 00:26
Другие вопросы по тегам:

Похожие вопросы: