2014-11-03 2 views
0

У меня есть программа, которая использует методы конечных элементов для вычислений, которые могут занимать до пары минут. Поскольку программа, возможно, замерзла для пользователя, я сделал ее так, чтобы она вычисляла количество итераций, которые она сделает заблаговременно, и печатает прогресс в процентах для текстового виджета в TKinter.TKinter: текстовый виджет не обновляется во время запуска программы

Проблема заключается в том, что главное окно зависает во время итерации программы и только обновляет текст в конце, что не очень полезно для пользователя, чтобы узнать текущий ход вычислений.

Вот конкретная часть коды:

progr+=dcompl 
textbox.configure(state=NORMAL) 
textbox.delete(1.0,2.0) 
textbox.insert(1.0,"Processando... ") 
textbox.insert(2.0,str(int(progr))+"%") #the variable progr is the current progress in % 
textbox.configure(state=DISABLED) 

Он обновляет «PROGR» переменный каждый раз, когда он проходит через определенную часть кода.

Если я просто распечатаю переменную «progr» на консоли, она работает нормально, но я ожидаю, что пользователь будет смотреть на пользовательский интерфейс, а не на консоль.

Есть ли способ заставить окно TKinter не замораживать и обновлять текст во время работы программы?

ответ

-1

Вы можете импортировать threading модуль и запустить свой номер хруст код в фоновом режиме в отдельном threading.Thread, или вы можете импортировать subprocess модуль и запустить его в совершенно отдельный процесс. В коде tkInter, который должен оставаться в основном потоке, вы должны подождать, пока поток/подпроцесс не отправит вам сигнал, что он сделан, и отправит вам результат. (Помните, что не получить доступ к любым объектам TkInter из фонового потока хотя: Tkinter инструментарий не поточно-и это вызовет спорадические сбои.)

В ответ на комментарий Брайана:

Как вы «ждать» без привязки к ЦП? В некоторых моих приложениях использовался простой цикл, содержащий 1 миллисекунду time.sleep(), и получившийся результат не заметен. Однако, чтобы сделать это правильно, вы, вероятно, захотите использовать механизм t12inter объекта .after() для многократного вызова функции, которая проверяет состояние вашего хруста вашего фона.

+1

Вы никогда не хотите называть 'sleep' в основном потоке графического интерфейса, потому что он заморозит весь графический интерфейс во время сна. –

+0

Спасибо. Я использовал модуль потока для создания другого потока, и это устранило мою проблему. –

0

Если я просто распечатаю переменную «progr» на консоли, она работает нормально, но я ожидаю, что пользователь будет смотреть на пользовательский интерфейс, а не на консоль.

Если вы используете метку вместо текста и обновляете переменную Tkinter, где вы печатаете, она должна работать нормально.

def change_value(): 
    ## get the value because this program doesn't 
    ## have a separate variable to use for the set() 
    val=progr.get() 
    if val < 100: 
     ## show that the same function can be called many times with updates 
     textbox.after(50, change_value) 
    progr.set(val+2) 

top=Tk() 
textbox=Label(top, text="Processando... ") 
textbox.grid() 

progr=IntVar() 
progr.set(1) 
Label(top, textvariable=progr).grid(row=1) 

change_value() 

top.mainloop() 
Смежные вопросы