2010-12-12 85 views
1

我想創建一個滾動的Tkinter文本框來填充最大的分配空間。我有它的工作類...調整滾動的Tkinter文本框的大小

由於某些原因,當我拉伸窗口文本小部件是好的;但是,滾動條在x軸上會有很多填充。

第二個問題是當我縮小滾動條進入屏幕的窗口時。

任何人都知道這兩個程序的解決方案?

片段:

self.Fr = Tkinter.Frame(self, width=self.Wi, height=self.He) 
    self.Fr.pack(side='right', fill='both', expand='yes') 


    self.Te = Tkinter.Text(self.Fr, font=self.Fo, fg=self.FG, bg=self.BG, 
          selectforeground=self.SFG, 
          selectbackground=self.SBG, 
          insertbackground=self.IBG, wrap='word', 
          undo=True, maxundo=100) 
    #self.Te.grid(column=0, row=0, sticky='NSEW') 
    self.Te.pack(side='left', fill='both', expand='yes') 


    self.Sc = Tkinter.Scrollbar(self.Fr, elementborderwidth=1) 
    #self.Sc.grid(column=1, row=0, sticky='NSEW') 
    self.Sc.pack(side='right', fill='both', expand='yes') 

    self.Te.configure(yscrollcommand=self.Sc.set) 
    self.Sc.configure(command=self.Te.yview) 

回答

6

因爲你用fill='both'你的滾動條得到所有的填充。即使它是一個垂直滾動條,你要求它沿x軸佔用額外的空間,這將導致填充,因爲滾動條本身不會伸展以形成寬滾動條。您希望垂直滾動條只填充Y方向,水平滾動條填充X方向。

至於滾動條關閉屏幕,這是一個有點複雜的解釋,但它有一個簡單的解決方案。

問題是這樣的:如果將一個由pack管理的窗口縮小到小於窗口小部件所需的窗口,它將開始剪切窗口小部件。它的工作方式是按順序處理小部件,佈置窗口,然後爲剩餘的小部件分配任何剩餘空間。這意味着如果在訂單的早期部件佔用了所有剩餘的視覺空間,則後面的部件將不會出現。

上面提到的「訂單」是裝箱單的順序。具體來說,包裝項目的順序。因此,如果您打包文本小部件,然後滾動條Tk將首先佈置文本小部件,並且剩餘空間將分配給滾動條。如果你首先打包了滾動條,那麼它將被佈置,剩餘的空間將被賦予文本小部件。

這一切聽起來很複雜,但很酷的是,如果你按照正確的順序包裝東西,那一切都會奏效。

然後,一般的經驗法則是確保您打包的最後一個小部件是expand設置爲true的小部件。這是你的「彈性」小部件。這樣,所有固定大小的小部件將首先佔用他們需要的任何空間,而您的「彈性」小部件將佔用剩下的所有空間。

還有另一個解決方案是給你的文本小部件一個請求的寬度和高度。因此,當包裝員最初分配空間時,它將只分配少量空間。因此,當窗口縮小時,文本小部件將縮小,直到縮小到小尺寸。然而,這並不是很實用,因爲包的一個重要特性就是你可以給所有小部件的自然尺寸(或者它們根據它們的按鈕和標籤的內容假定它們的自然大小),並且包裝工都做工作。如果將寬度和高度設置爲1,則您的初始窗口(除非明確設置爲較大的尺寸)將會很小。

此行爲全部記錄在包的手冊頁中,但您必須仔細閱讀以充分掌握此行爲。

+0

哇,這是一些非常好的信息。我主要使用.grid和.place方法。因此,我只是對.pack方法的工作原理有一個模糊的理解。這當然清除了我的誤解。 – rectangletangle 2010-12-13 23:20:44