2012-06-29 3 views
3

Я знаю, что в прошлом было много вопросов по сетке и упаковке, но я просто не понимаю, как объединить эти два, поскольку мне трудно расширить свою таблицу в обоих направлениях (строка/колонок).Объединение сетки/упаковки Tkinter

Кнопки Я хочу сохранить одинаковые размеры, но всегда остаюсь в нижней части окна. «Таблица», однако, я хочу автоматически расширять размер окна, но не могу заставить его работать. Изменение «win1» для упаковки работало в том смысле, что оно остается центральным, но все.

Как я могу достичь таких же эффектов, как липкий и т. Д. С пакетом, поскольку я знаю, что мне нужно будет изменить терминологию.

код выглядит следующим образом (с указанием основных кадров и несколько виджетов, а не полный код):

root = Tk() 

win1 = Frame(root) 
win1.pack() 
win1.grid_columnconfigure(0, weight=1) 
win1.grid_rowconfigure(1, weight=1) 

frame_table = ttk.Frame(win1, style="Black.TLabel", relief='sunken', borderwidth=1) 
frame_table.pack(row=2, column=0, padx=1, pady=1, sticky= "nsew") 
frame_table.grid_columnconfigure(0, weight=1) 
frame_table.grid_rowconfigure(1, weight=1) 
text_table1 = Label(frame_table, text='Number1', bg='white', borderwidth=0) 
text_table1.grid(row=1, column=0, sticky="nsew", padx=1, pady=1) 
empty1 = Label(frame_table, bg='white', borderwidth=0) 
empty1.grid(row=2, column=0, sticky="nsew", padx=1, pady=1) 
text_table2 = Label(frame_table, text='Number2', bg='white', borderwidth=0, width=12) 
text_table2.grid(row=1, column=1, sticky="nsew", padx=1, pady=1) 
empty2 = Label(frame_table, bg='white', borderwidth=0) 
empty2.grid(row=2, column=1, sticky="nsew", padx=1, pady=1) 

frame_but = ttk.Frame(win1) 
frame_but.grid(sticky=S, padx=1, pady=1) 
frame_but.grid_columnconfigure(0, weight=1) 
frame_but.grid_rowconfigure(1, weight=1) 
but1 = ttk.Button(frame_but, text='Start', command=Start) 
but1.grid(row=3, column=0, padx=2, pady=1, sticky="S") 

ответ

11

Ваша первая проблема заключается в том, что основная рама, win1 упакован без вариантов. По умолчанию для него не заполнить часть своего контейнера, в котором он находится. Таким образом, независимо от того, что вы делаете с внутренними виджетами, все это будет складываться в верхнюю часть окна. Первое, что вы должны сделать, тогда, скажите win1, чтобы заполнить все окно (если предположить, что на самом деле то, что вы хотите это сделать):

win1.pack(side="top", fill="both", expand=True) 

Это заставит этот кадр, чтобы правильно развернуть и сжиматься при изменении размера окно.

Вторая проблема заключается в том, что вы даете строку 0 в win весу 1, но вы помещаете frame_table в строку 3, которая имеет вес по умолчанию 0. Я не знаю, было это намеренно или нет, но это то, что удерживает ярлыки и виджеты ввода в нижней части экрана, потому что пустая строка 0 win1 расширяется и сокращается, чтобы заняться дополнительным пространством.

Как научиться раскладывать свои виджеты

Правильное поведение изменения размеров довольно легко получить право, но это довольно трудно узнать как получить это право. Моя рекомендация - получить бумагу и карандаш. Выделите основные области вашего приложения - области, каждая из которых имеет разные свойства. Например, строка внизу, которая должна оставаться внизу (строка состояния или строка кнопок, возможно). Может быть, что-то наверху (например, панель инструментов), которая должна оставаться наверху и т. Д. Обычно будет только один регион, который может расширяться, хотя эта расширяемая область сама может быть разделена на две или более областей.

В этом случае я предполагаю, что у вас есть два региона: стол и ряд кнопок. Это легко сделать. Затем создайте кадр для каждой области и только кадр для каждого региона. Дайте им отдельные цвета фона и поместите их в окно, используя сетку или пакет, в зависимости от того, какой из них дает вам изменение размера, которое вы хотите. пакет замечательный, если у вас простой макет (каждый регион закреплен либо сверху вниз, либо слева направо), сетка великолепна, если у вас действительно есть сетка. Работайте только с этим, настраивая параметры, пока не получите нужное поведение для основных регионов. Различные цвета помогут вам увидеть, какие области изменяются, а какие нет.

После того, как основные области работают точно вправо, вы можете начать фокусироваться на внутренних частях. Выйдите из этого карандаша и бумаги снова, и сделайте то же самое с каждым из этих субрегионов. Вытяните внутренние области и выясните, какие из них будут расти внутри их контейнера, а какие - нет.Возможно, есть только один основной субрегион, поэтому вы можете пропустить эту часть. Наконец, создайте фреймы, если у вас есть субрегионы, снова давая им разные цвета, чтобы вы могли видеть, что изменилось. Измените настройки, пока все не изменится так, как вы хотите. Намочите, промойте, повторите.

И, наконец, вы больше не сможете делиться своим окном. Обычно есть только несколько регионов, поэтому этот процесс выполняется быстро. Когда у вас есть разные области вашей программы, все изменения размера, как вы хотите, пришло время добавить фактические виджеты. Как только вы это сделаете, вы можете вернуться и удалить цвет из фреймов.

Это просто, но для этого требуется методический подход. Просто бросая кучу виджетов в фрейм и пробуя случайные вещи, чтобы заставить его работать, не правильный подход. Будьте методичны, выложите свой дизайн на бумаге, перейдите на рамки с четкими цветами, а затем добавьте свои реальные виджеты и добавьте окончательный лак.

+1

Отличный ответ, большое вам спасибо! Последние четыре дня я изучал Tkinter и начал понимать некоторые из различных бит. Не помогает, я тоже не хозяин самого питона, но этот ответ прекрасен! – user2063

+0

Отличный ответ, описывающий подход. Но вы явно не указали, можете ли вы объединить сетку/пакет вместе. Если я использую сетку для размещения фреймов, безопасно ли использовать пакет внутри фрейма - или - должен ли я выбрать один и придерживаться его исключительно? – bryanbcook

+0

@bryanbcook: см. Http://stackoverflow.com/a/17267402/7432 и http://stackoverflow.com/a/3968033/7432 и, возможно, http://stackoverflow.com/a/23504912/7432. Есть и другие, которые затрагивают очень похожие вопросы. –

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