2017-01-06 9 views
0

いくつかのウィジェットを含むための垂直スクロールフレームを作成しようとしました。スクロールバーを右にスティックする方法

しかし、私はそれにオブジェクトをパックすると、フレームのサイズは、内部のいくつかのウィジェットの最大幅に収まります。

どうすれば右側に貼り付けることができますか?

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) 

enter image description here

私は、次のコードを使用しましたスクロールバーコードは、ここから取得されます: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を使用することもできます。

トリックは系統的であり、一度に1つのレイアウト問題のみを解決しようとすることです。まず、Appがウィンドウを満たしていることを確認します。次に、containerが満たすべきウィンドウのどの部分にも塗りつぶしていることを確認します。そして、vframeが満たされているウィンドウの部分を満たしていることを確認します。

子供を管理するためにgridを使用するコンテナの場合、少なくとも1行と1列にはgrid_rowconfiguregrid_columnconfigureを必ず呼び出して重量を与えます。

関連する問題