2009-09-28 66 views
7

我正在嘗試編寫一個基本的Tkinter GUI,其頂部有一個Text小部件,然後一個Button小部件左對齊它,然後在按鈕下方有另一個Text小部件。我遇到的問題是,在將左側的Button小部件打包後,當我打包第二個Text小部件時,它將其放在右側的按鈕旁邊,而不是按鈕下方。出現這種情況,無論是我的side參數設置爲第二Text控件下面是一段簡單的代碼演示了此行爲:如何在已打包到左側的現有窗口小部件下打包tkinter窗口小部件?

from Tkinter import * 

root = Tk() 

w = Text(root) 
w.pack() 

x = Button(root, text="Hi there!") 
x.pack(side=LEFT) 

y = Text(root) 
y.pack(side=BOTTOM) 

root.mainloop() 

那麼我將如何去,使其出現設置第二Text部件在按鈕下面,而不是在右邊?

+0

'pack()'方法的''''''關鍵字參數可能會有所幫助。 – 2016-02-25 06:39:30

回答

13

通常有兩種解決佈局問題:

  1. 轉而使用網格。做你想要完成的佈局變得很容易。電網可以解決所有的佈局問題大概95%(這是驚人的,當你想想看 - TK與一個管理者做什麼最需要的工具包半打完成!)

  2. 使用多幀。如果某些小部件需要從上到下堆疊,並且從左到右堆疊,則無法始終獲得想要將所有內容打包在一個幀中的內容。對於佈局的從上到下的部分使用一幀,從左到右的內容使用其他幀。

還意識到小部件不必是它們打包/網格化的小部件的子代。您可以使用「in」參數將窗口部件放在除父窗口之外的其他容器中。

例如,在您的具體示例中,您可以創建三個框架,即頂部,中部,底部。在頂層窗口中將這些從上到下打包。然後,您可以將第一個文本小部件放在頂部,將按鈕或按鈕水平放在中間,將另一個文本小部件放在底部。

這種方法的好處是,它可以更容易地改變未來的佈局(根據我的經驗總是發生在某個時刻)。您不必重新添加任何小部件,只需在其他容器中打包/放置/網格化它們即可。

在你的簡短例子中,它沒有太大的區別,但對於複雜的應用程序來說,這個策略可以成爲一個生命保護程序。

我最好的建議是這樣的:佈局不是事後的想法。做一些小小的規劃,甚至可以在一些方格紙上畫五分鐘。首先決定你的應用的主要區域,併爲每個區域使用一個框架或其他容器(窗口,窗口,筆記本等)。一旦你有了這些,對每個部分採取相同的分而治之的方法。這使您可以針對應用的不同部分使用不同類型的佈局。工具欄獲得水平佈局,表單可能獲得垂直佈局等。

3

打包是按照.pack方法被調用的順序發生的,所以一旦x已經「聲明」了左邊,就是它 - 它將佔用其父代的左邊部分,其父代中的所有內容將是這是正確的。你需要一個框架,以「調解」,例如...:

from Tkinter import * 

root = Tk() 

w = Button(root, text="Mysterious W") 
w.pack() 

f = Frame(root) 
x = Button(f, text="Hi there!") 
x.pack() 

y = Button(f, text="I be Y") 
y.pack(side=BOTTOM) 

f.pack(side=LEFT) 

root.mainloop() 

(改變文本到按鈕僅佈局更直接的可見性 - 在Tkinter的這Mac上不顯示文本明確,直到他們有重點,但Buttons非常清晰;-)。

7

我最初誤解包裝是如何工作的,並沒有意識到當我做了x.pack(side=LEFT)時,整個左側被「聲稱」。我在閱讀this之後發現的以及Alex在這裏的回答是,我根本沒有將x打包在左側,而是讓固定在左邊,使用anchor=W(W代表West)代替side=LEFT 。我修改後的代碼片斷這做什麼,我就是這個樣子的經過:

from Tkinter import * 

root = Tk() 

w = Text(root) 
w.pack() 

x = Button(root, text="Hi there!") 
x.pack(anchor=W) 

y = Text(root) 
y.pack(side=BOTTOM) 

root.mainloop() 

這樣x沒有「聲稱」左側了,它只是它的空間塊中左對齊(或西)。

相關問題