2009-08-11 92 views
1

以下代碼正常工作。它顯示一個panedwindow,與頂部的藍色方塊和下方的綠框:爲什麼窗口小部件的創建順序很重要?

panedwindow .root -orient vertical -showhandle true -background red 
frame .top -background blue -width 100 -height 100 
frame .bot -background green -width 100 -height 100 
.root add .top .bot 
pack .root -expand true -fill both 

然而,當我移動panedwindow命令下來,事情停止工作。頂部藍色框未顯示。相反,panedwindow本身的紅色彪炳:

frame .top -background blue -width 100 -height 100 
panedwindow .root -orient vertical -showhandle true -background red 
frame .bot -background green -width 100 -height 100 
.root add .top .bot 
pack .root -expand true -fill both 

爲什麼會出現這種情況? panedwindow真的只能管理在它之後創建的小部件嗎?我已經看到與打包器類似的行爲,它會拒絕打包稍後發佈的小部件-in小部件。

回答

10

正如Matt指出的那樣,這與堆疊順序有關。堆疊順序只是您應用中小部件的「z座標」,您可以將它看作是除了屏幕上自然的x和y座標之外,還有另一個與垂直於屏幕。所有的小部件都在這個軸上。您在屏幕上實際看到的圖像是沿着該軸「拼合」所有小部件的結果。在x和y平面上任何部件重疊的地方,堆疊順序較高的部件就是您在該位置看到的部件。

Tk中窗口小部件的默認堆疊順序由其創建順序決定。它創建的窗口部件越早,其堆疊順序爲—的窗口越低,屏幕本身位於z座標零點,屏幕上的值越來越大。第一個創建的小部件具有堆疊順序零,第二個具有一個,等等。

解決問題的最簡單方法就是按照正確的順序創建小部件,但如果您在創建小部件時遇到問題,則可以使用 您已經顯示的訂單,您可以稍後手動更改堆疊順序,以確保按您想要的順序堆疊小部件。例如,再次把你的藍框頂端,您可以添加:

raise .top .root 

這告訴Tk的改變.top堆疊順序,以便它是「上面」 .root

當我使用窗口窗口小部件時,我傾向於管理子窗口小部件—給我,它在概念上只是一個具有額外行爲的框架,並且由於我使用框架將相關窗口小部件組合在一起,所以我使用窗口窗口一樣的方法。此策略也巧妙地迴避了堆疊順序的問題,因爲它要求您必須首先創建窗口窗口—,因爲在創建窗口小部件之前,您無法創建窗口小部件的子窗口。因此,我會修改你的例子是這樣的:

panedwindow .root -orient vertical -showhandle true -background red 
frame .root.top -background blue -width 100 -height 100 
frame .root.bot -background green -width 100 -height 100 
.root add .root.top .root.bot 

對我來說,這使得.root.root.top.root.bot明確的關係:兩個框架是「內部」分欄窗口。自然的疊加順序恰好是正確的,每個人都很高興。

+0

現在看來很明顯,我看着它。謝謝您的幫助! – 2009-08-11 13:30:41

3

哇,這已經有一段時間了,因爲我甚至想過Tcl/Tk。謝謝你的記憶之旅。 :)

根據此link,同級窗口小部件的默認堆疊順序是它們的創建順序,而不是它們的打包順序。實質上,.top,.bot和.root都是彼此的兄弟姐妹,因爲它們在小部件層次結構中處於相同的級別,即它們都掛在同一父級(在這種情況下爲'。')。我期望如果您再將panedwindow命令再向下移動一行,您也不會看到綠色框。我認爲,如果您要分別將.top和.bot重命名爲.root.top和.root.bot,那麼可能會解決您所看到的問題,因爲這會使他們成爲.root父級的子級。

希望這會有所幫助。

+0

感謝您的簡潔,非常有用的迴應!我剛剛開始使用Tcl/Tk,很高興能從知道他們在做什麼的人那裏獲得幫助。 – 2009-08-11 13:12:14

相關問題