首页 文章

Tkinter Toplevel小部件不显示 - python

提问于
浏览
1

我正在使用python Tkinter中的Toplevel窗口,在我的其他代码完成之前,我似乎无法显示嵌入的小部件 . 框架显示,它正确地循环我的其他代码,但文本/进度条小部件只有在我以某种方式中断循环时才会显示 . 框架在最后成功销毁 . 见下文 .

这是我的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()

2 回答

  • 1

    你必须知道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()
    

    谢谢埃里克!

相关问题