2017-01-06 8 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 вместо сетки так как вам не нужно выполнять этот дополнительный шаг по настройке веса строк и столбцов. Аналогично, если vframe - это единственное, что есть в container, вы можете использовать для этого pack.

Трюк должен быть методичным и попытаться решить только одну задачу компоновки за раз. Во-первых, убедитесь, что App заполняет окно. Затем убедитесь, что container заполняет любую часть окна, которое оно должно заполнить. И затем убедитесь, что vframe заполняет часть окна, которое она должна заполнить.

Помните, что для любого контейнера, в котором используется grid управлять детьми, вы должны всегда вызывать grid_rowconfigure и grid_columnconfigure по меньшей мере, одной строки и одного столбца, чтобы дать вес.

Смежные вопросы