2016-04-16 6 views
0

Мне нужно изменить текст метки Tkinter на основе выполненных вычислений. Я использую простой label.configure(text="something new"). Проблема в том, что мне нужно делать это на каждой итерации цикла while. Процесс просто ждет, пока цикл не будет завершен, а затем покажет последний результат. Я нуждаюсь в них постоянно.Виджет tkinter.configure внутри цикла while

def new_frequency_1000times(): 
    k=1 
    while k>1000: 
    #steps to determine new frequency f 
    freq_out.configure(text=str(f)) 
    k=k+1 

master=Tk() 
freq_out = Label(master) 
freq_out.grid(row=0, column=1) 
button_freq=Button(okno, command=new_frequency_1000times, text="Get new f") 
button_freq.grid(row=0, column=0) 

Любая идея, как заставить «оценку» внутри цикла?

+0

Почему бы не просто поставить конфиг внутри вашего время цикла? И код может показать проблему лучше. – Pythonista

+0

Я действительно это сделал. Вы правы, код будет здесь через секунду. –

ответ

2

Ваша проблема в том, что у вас есть петля while, работающая в основном потоке. Таким образом, он блокируется, пока цикл while не будет завершен. Используйте after или threading.

Вот небольшой пример:

import tkinter as tk 

def new_frequency_1000times(k=0): 

    if k < 1000: 
     freq_out.configure(text=str(k)) 
     #1000 ms = 1 seconds, adjust to taste. 
     root.after(10, lambda: new_frequency_1000times(k+1)) 

root=tk.Tk() 
freq_out = tk.Label(root) 
freq_out.grid(row=0, column=1) 
button_freq=tk.Button(root, command=new_frequency_1000times, text="Get new f") 
button_freq.grid(row=0, column=0) 
root.mainloop() 
0

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

Смежные вопросы