2017-01-06 66 views
0

我試圖創建一個垂直滾動框架來包含一些小部件。但是,當我將對象包裝到它中時,框架的大小適合其中某個小部件的最大寬度。如何讓滾動條堅持正確

我怎樣才能讓它堅持正確的?

enter image description here

我用下面的代碼:

RadioList.py

class RadioList(Frame): 
    def __init__(self, parent, *args, **kwargs): 
     Frame.__init__(self, parent) 
     self.pack() 
     self._frame = Frame(self, *args, **kwargs) 
     self._frame.pack(fill=BOTH, expand=YES) 
     self._var = IntVar() 
     # self._var = StringVar('a') 

    def add(self, text, value): 
     rb = Radiobutton(self._frame, 
      text=text, 
      value=value, 
      variable=self._var, 
      anchor=W, 
      # width=200 
      ) 
     # rb.grid() 
     rb.pack(fill=X) 

main.py:

class App(Frame): 
    def __init__(self, parent=None): 
     Frame.__init__(self, parent) 
     # self.geometry('400x300') 
     self.grid() 
     self.label = Label(self, text="hello world") 
     self.label.grid() 
     container = Frame(self) 
     container.grid(row=1, columnspan=3) 
     vframe = VerticalScrolledFrame(container) 
     # vframe.pack(fill=BOTH); 
     # vframe.pack() 
     # vframe.pack(side=LEFT, anchor=W) 
     vframe.grid() 
     rbl = RadioList(vframe.interior, bg="white") 
     for x in range(100, 150): 
      i = x + 1 
      t = n2w(i) 
      rbl.add(t, i) 
     rbl.grid(columnspan=3) 

滾動條代碼是從這裏取:https://stackoverflow.com/a/16198198/145682

完整代碼可以在這裏找到:https://github.com/deostroll/pytk

+0

您需要調用幀的'.pack_propagate(0)'來停止調整大小以適應其包含的小部件。 –

+0

您是在問如何讓滾動條粘到正確的位置,還是在問如何防止窗口縮小以適應其內容? –

+0

@BryanOakley不是正在縮小的「容器」嗎? – deostroll

回答

0

我認爲這個問題是你沒有正確地配置您的主窗口。如果您希望包含可滾動框架的列填充窗口,則必須將該列配置爲具有「權重」,以告知tkinter如何分配額外空間。

例如:

class App(Frame): 
    def __init__(self, parent=None): 
     ... 
     self.grid_columnconfigure(0, weight=1) 
     container.grid(row=1, columnspan=3) 

不幸的是,你不給足夠的代碼知道究竟是怎樣發生的。這可能是因爲內部框架沒有擴大來填充容器,可能是容器沒有擴展到填充App,或者可能是因爲App沒有擴展到填充根窗口。您可能需要配置列App是,和/或配置列container在不在。

如果App是在根窗口的唯一的事情,你可能要考慮使用pack而不是電網因爲您不必採取額外的步驟來配置行和列的權重。同樣,如果vframecontainer中唯一的東西,那麼您也可以使用pack

技巧是有條不紊,並試圖一次只解決一個佈局問題。首先,確保App正在填滿窗口。然後確保container正在填充它應填充的窗口的任何部分。然後,確保vframe正在填充它應該填充的窗口部分。

請記住,在您使用grid來管理孩子的任何容器,你應該隨時調用grid_rowconfiguregrid_columnconfigure至少一行和一列給出的重量。