簡體   English   中英

Tkinter頂級小部件未顯示-python

[英]Tkinter Toplevel widgets not displaying - python

我正在使用python Tkinter中的頂級窗口工作,在其他代碼完成之前,似乎無法顯示嵌入式小部件。 框架出現了,它正確地循環了我的其他代碼,但是只有當我以某種方式中斷循環時,才會顯示文本/進度欄小部件。 框架最后成功銷毀。 見下文。

這是我的頂級代碼:

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()

您必須知道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()

基於上面的@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()

謝謝你,埃里克!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM