2015-04-14 5 views
0

Я работаю с окном Toplevel в python Tkinter, и я не могу заставить встроенные виджеты отображаться до завершения моего другого кода. Рамка появляется, он правильно выполняет мой другой код, но виджет text/progressbar появляется только в том случае, если я каким-то образом прерываю цикл. Рамка успешно уничтожается в конце. Смотри ниже.Виджеты Tkinter Toplevel не отображаются - python

Вот мой Toplevel код:

class ProgressTrack: 
    def __init__(self, master, variable, steps, application): 
     self.progress_frame = Toplevel(master) 
     self.progress_frame.geometry("500x140+30+30") 
     self.progress_frame.wm_title("Please wait...") 
     self.progress_frame.wm_iconbitmap(bitmap="R:\\CHPcomm\\SLS\\PSSR\\bin\\installation_files\\icon\\PSIDiaryLite.ico") 

     progress_text = Canvas(self.progress_frame) 
     progress_text.place(x=20,y=20,width=480,height=60) 
     progress_text.create_text(10, 30, anchor=W, width=460, font=("Arial", 12), text="Please do not use " + application + " during execution. Doing so, will interrupt execution.") 

     self.progress_bar = Progressbar(self.progress_frame, orient='horizontal', length=440, maximum=steps, variable=variable, mode='determinate') 
     self.progress_bar.place(x=20,y=100,width=450,height=20) 

И я называю это из экземпляра следующего класса, который создается, когда пользователь нажимает кнопку на главном окне:

class Checklist: 
    def __init__(self, master, var): 
     self.progress = ProgressTrack(master, 0, 5, 'Microsoft Word') 

     while var: 
      #MY OTHER CODE 
      self.progress.progress_bar.step() 
     self.progress.progress_frame.destroy() 
+1

http://stackoverflow.com/questions/23145696/tkinter-toplevel-window-not-getting-displayed может быть полезным –

ответ

0

Вы должны знать, что tkinter является однопоточным. Также окно (и все, что вы видите на экране) обновляет его внешний вид только при простоях (ничего не делая) или при вызове w.update_idletasks(), где w - любой вид. Это означает, что когда вы находитесь в цикле, изменяя индикатор выполнения, на экране ничего не произойдет, пока цикл не будет завершен.

Так что ваш новый код теперь может быть

while var: 
     #MY OTHER CODE 
     self.progress.progress_bar.step() 
     self.progress.progress_frame.update_idletasks() 
    self.progress.progress_frame.destroy() 
0

Основываясь на ссылке @Eric Levieil в выше, это было так же просто, как добавить это в мой код:

self.progress.progress_frame.update() 

Полное изменение:

class Checklist: 
    def __init__(self, master, var): 
     self.progress = ProgressTrack(master, 0, 5, 'Microsoft Word') 

     while var: 
      #MY OTHER CODE 
      self.progress.progress_bar.step() 
      self.progress.progress_frame.update() 
     self.progress.progress_frame.destroy() 

Спасибо Эрик!

+0

не использовать обновление, это опасно, вместо этого используйте безопасные update_idletasks. Метод обновления может привести к непредсказуемому поведению или циклу! –

+0

Это потому, что обновление не работает? Или это не его намеренное использование? Просто любопытно, что все ... Я попробую с update_idletasks ... спасибо – ionalchemist

+0

короткий: он не масштабируется хорошо и делает больше, чем вы думаете, но долго: http://wiki.tcl.tk/1255 –

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