Как динамически заменить метку tkinter (обновленные данные в цикле for) - PullRequest
1 голос
/ 22 апреля 2019

У меня есть функция, которая запускается только после нажатия кнопки tkinter. Внутри функции есть цикл for, который выполняет итерацию по набору данных, который я хотел бы динамически отображать через метку tkinter. То есть будет только 1 метка tkinter, и ее значение будет постоянно меняться между итерациями в цикле for.

Самым близким, что я получил, было то, что на каждой итерации будет создаваться новый ярлык, и он будет расширяться вниз, а это не то, что я ищу. Кто-нибудь может посоветовать мне любое возможное направление?

Ниже приведена структура кодов, которые я пробовал.

root = tk.Tk()

order_json = tk.StringVar()

def update_label(order):
     order_json.set(order)
     root.update()

def order_func():
     for i in range(len(dataset)):
          data_to_display = dataset[i]

          label = tk.Label(root, textvariable=order_json)
          label.pack()
          update_label(order)

поэтому вместо одной постоянно обновляемой метки каждая итерация создает новую метку под старой и продолжает расширяться.

enter image description here

Буду признателен, если кто-нибудь поможет мне. Спасибо.

1 Ответ

0 голосов
/ 22 апреля 2019

Мы не можем использовать циклы for или while для обновления в реальном времени в графическом интерфейсе tkinter, потому что tkinter уже находится в mainloop, из-за чего использование цикла for или while делаетGUI перестает отвечать до конца цикла, но если цикл for или цикл while мал и заканчивается, то мы можем использовать их так, как если мы хотим, чтобы в кадре было 10 меток, мы можем просто использовать

for i in range(10):
   Label(root, text='Label %s' %i).pack()

Но если вам нужно динамически видеть время от времени изменение, в вашем случае обновите метку, чтобы увидеть набор данных.Для этих целей мы используем after(ms, callback, args).Также не используйте sleep, вместо этого используйте after(ms) без какого-либо обратного вызова.

Допустим, я хочу увидеть счет.В котором я просто хочу, чтобы ярлык обновлялся каждые 0,5 секунды, я могу использовать что-то вроде этого.

Пример

import tkinter as tk

root = tk.Tk()

Label = tk.Label(root, text=1, font=('', 20))
Label.pack()

def update(count=1):
    Label['text'] = count
    # 500ms , calling the same function again and again.
    root.after(500, update, count+1)

update()
root.mainloop()

Теперь, ответьте на вашу проблему

Поскольку я не знаю, что такое dataset, я просто беру список от 1 до 50 .

Код:

import tkinter as tk

root = tk.Tk()
root.geometry('200x200')

order_json = tk.StringVar()

dataset = [i for i in range(50)]
label = tk.Label(root, textvariable=order_json, font=('', 20))
label.pack()

count = 1
def order_func():
    global dataset, count
    if count>=len(dataset): return     # This will exit the function when done
    order_json.set(dataset[count])     # This will update the label 
    count += 1
    root.after(100, order_func)        # This will recall the callback function

tk.Button(root, text='Play', command=order_func).pack()

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