Tkinter Toplevel 小部件未显示 - python
Tkinter Toplevel widgets not displaying - python
我正在 python Tkinter 中使用 Toplevel window,在我的其他代码完成之前,我似乎无法让嵌入式小部件显示出来。框架出现了,它正确地循环了我的其他代码,但是 text/progressbar 小部件只有在我以某种方式中断循环时才会出现。最后框架被成功销毁。见下文。
这是我的顶层代码:
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 的实例调用它,该实例是在用户单击 master window 上的按钮时创建的 window:
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()
你必须知道 tkinter 是单线程的。此外,window(以及您在屏幕上看到的所有内容)仅在空闲(什么都不做)或您调用 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()
基于上面@Eric Levieil 的 link,只需将其添加到我的代码中即可:
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()
谢谢埃里克!
我正在 python Tkinter 中使用 Toplevel window,在我的其他代码完成之前,我似乎无法让嵌入式小部件显示出来。框架出现了,它正确地循环了我的其他代码,但是 text/progressbar 小部件只有在我以某种方式中断循环时才会出现。最后框架被成功销毁。见下文。
这是我的顶层代码:
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 的实例调用它,该实例是在用户单击 master window 上的按钮时创建的 window:
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()
你必须知道 tkinter 是单线程的。此外,window(以及您在屏幕上看到的所有内容)仅在空闲(什么都不做)或您调用 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()
基于上面@Eric Levieil 的 link,只需将其添加到我的代码中即可:
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()
谢谢埃里克!