2016-12-14 38 views
1

以下是代碼。爲什麼我有兩個tkinter窗戶?

from tkinter import * 
def schedule_log(): 
    root = Toplevel() 
    root.title("My Schedule") 
    canvas = Canvas(root, width=675, height=260) 
    root.schedule = schedule = PhotoImage(file="my_image.gif") 
    canvas.create_image(0, 0, anchor=NW, image=schedule) 
    canvas.pack() 

schedule_log() 

當我運行它時,我有兩個窗口。一個是標題爲tk的tkinter窗口,另一個是標題爲「我的日程表」的窗口。有誰能向我解釋爲什麼是這樣?非常感謝您的時間和關注。 此外,root.schedule的功能是什麼?我的意思是,如果我理解正確,root是Toplevel類的一個實例。那麼,我們是否試圖爲該特定實例設置一個屬性?那麼,這是否意味着我們可以在課堂外設置屬性?

回答

3

第一個窗口是由Tk()創建的(如果您忘記,這顯然會爲您自動完成); 附加窗口由Toplevel()創建。是的,這看起來很愚蠢 - 我不知道爲什麼這樣做。如果你想擁有多個窗口,所有的處理方式都是一樣的,我所看到的一種方法是在初始Tk()窗口立即調用.withdraw()使其不可見,然後完全忘記它 - 所有的實際窗口都是由頂層()。

一般來說,只要不與任何類的實際屬性相沖突,您就可以自由地將任意屬性存儲在類實例中。總的來說,這是一個壞主意,因爲你不一定會知道該類的所有屬性是什麼。然而,你在這裏看到的是一種慣用的Tkinter用法,它被垃圾收集與Tk圖像交互的奇怪方式所需要。如果將圖像存儲在局部變量中,它幾乎會立即消失。如果將其存儲在全局變量中,即使在關閉了使用該圖像的窗口之後,它也會永久保留。將圖像存儲爲顯示它的窗口小部件或窗口的屬性,使其具有恰到好處的生命週期。

1

從Tkinter的文檔:

甲頂層窗口是具有窗口管理器下的一個獨立存在的窗口。

這有點令人困惑,但它似乎意味着因爲頂級窗口是額外的窗口,必須有一個真正的主窗口。因此,頂層似乎爲您自動創建一個(我不會聲稱知道爲什麼或這裏發生了什麼)。這是一個簡單的解決方法,但:

變化:

root = Toplevel() 

到:

root = Tk() 
相關問題