Мы не можем использовать циклы 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()