2013-08-18 50 views
1

我正在創建一個tkinter畫布,我需要檢查用戶何時更改窗口的大小。問題是,最初這個窗口顯然不是它應該是的大小。我有以下幾點:tkinter根窗口不是正確的大小

def print_size(self): 
    print self.root.winfo_width() 

def init_simulation(self, size=300): 
    self.root = Tk() 
    canvas = Canvas(self.root, width=size, height=size) 
    self.print_size() 
    self.root.after(1000, self.print_size) 

運行此我得到:

1 

一秒鐘後:

306 

忽略的事實是Tkinter的將新增6個像素,爲什麼是大小第一,然後306?我是否設置錯了?

回答

2

當你用Tk()實例化一個根部件時,Tkinter在一個單獨的線程中啓動一個進程來實際創建窗口 - 它不會發生在主循環中。

最初得到大小爲1的原因是,當您第一次致電self.print_size時,根窗口還不存在,所以它會爲您提供默認值1。下一次你再次調用它時,窗口已經完成產卵,所以它給出了實際的大小。它本質上是一種競爭條件 - 在self.root完成創建之前,主事件循環會到達print self.root.winfo_width()

如果你想改變這種行爲,加入這一行self.root = Tk()之後:

self.root.wait_visibility(self.root) 

該命令強制主事件循環暫停,直到給定的組件(在這種情況下,根窗口)有已經產生並且可見。

此外,請注意,您已將canvas的大小設置爲300像素,因此容器窗口自然會有一些額外的寬度。

+0

爲什麼不存在根窗口,我打電話給它,並使用它。 – EasilyBaffled

+0

增加了更多解釋 - 這是否明確?如果你想改變你注意到的行爲,我也給你一個解決方案。 – Brionius

+0

偉大使現在非常感謝了很多。 – EasilyBaffled