2017-01-06 39 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至少一行和一列给出的重量。