Ваша проблема в том, что вы, кажется, не совсем понимаете, как работает сетка.Например, вы помещаете только два виджета в красную рамку (self.myentry и self.text), но помещаете их в столбцы 2 и 4. Знаете ли вы, что столбцы относятся к их родителю, а не к графическому интерфейсувсе?Вы хотите, чтобы они были в столбце 0 красной рамки , затем вам нужна красная рамка во втором столбце , это родительский элемент.
Способ решить эту проблему - разделить и победить.Во-первых, разделите главный экран на логические части и расположите эти логические части так, чтобы они правильно меняли размер.Затем, для чего-нибудь внутри каждой части, вспенить, промыть, повторить.Использование фреймов для организации - это путь.
Вот как я бы решил вашу проблему (хотя, конечно, есть несколько способов решить эту проблему).Во-первых, у вас есть две основные области экрана: верхняя часть с зеленой, синей и красной рамками и их содержимым, а также нижняя часть с кнопками.Верхняя область должна расти и уменьшаться во всех направлениях, нижняя область только увеличивается в направлении X.Я бы создал для этого два фрейма, по одному для каждой детали, и использовал бы pack, поскольку pack - самый простой менеджер геометрии.Верхняя рамка должна быть настроена так, чтобы заполнять оба направления и расширяться.Нижняя часть (с кнопками) должна заполнять только в направлении X.
Теперь у вас есть две области, которые не зависят друг от друга и имеют правильное поведение при изменении размера: основная область и область панели инструментов.,Вы можете расположить внутреннее содержимое этих фреймов по своему усмотрению, не беспокоясь о том, как это повлияет на основной макет.
В нижнем фрейме, если вы хотите, чтобы все виджеты были одинакового размера, используйтеупакуйте и сделайте так, чтобы они все заполнили X и расширились, и они будут одинаково заполнять область.Если вы хотите, чтобы они были разных размеров, используйте сетку, чтобы вы могли контролировать каждый столбец отдельно.
Для верхней части она состоит из трех подразделов: красная, зеленая и синяя рамки.Поскольку они не все расположены горизонтально или вертикально, я бы использовал сетку.Поместите зеленый цвет в ячейку 0,0, синий в ячейку 0,1 и красный в ячейку 1,1, охватывающую два ряда.Присвойте строке 0 и столбцу 1 вес 1, чтобы он занимал всю слабость.
Как я писал ранее, это не единственный способ «разделить и победить» эту конкретную проблему.Вместо того, чтобы рассматривать основное приложение как две части - верхнюю и нижнюю, а верхняя часть состоит из трех частей, другой вариант - видеть, что ваше главное окно состоит из четырех частей: зеленой, синей, красной и панели инструментов.Ключ не в том, чтобы выбрать идеальное определение, а в том, чтобы разбить проблему макета на куски, работающие извне.
Вот рабочий пример:
from Tkinter import *
ALL=N+S+E+W
class Application(Frame):
def __init__(self,master=None):
Frame.__init__(self,master)
# the UI is made up of two major areas: a bottom row
# of buttons, and a top area that fills the result of
# UI
top_frame = Frame(self)
button_frame = Frame(self)
button_frame.pack(side="bottom", fill="x")
top_frame.pack(side="top", fill="both", expand=True)
# top frame is made up of three sections: two smaller
# regions on the left, and a larger region on the right
ul_frame = Frame(top_frame, background="green", width=200)
ll_frame = Frame(top_frame, background="blue", width=200)
right_frame = Frame(top_frame, background="red")
ul_frame.grid(row=0, column=0, sticky=ALL)
ll_frame.grid(row=1, column=0, sticky=ALL)
right_frame.grid(row=0, column=1, rowspan=2, sticky=ALL)
top_frame.columnconfigure(1, weight=1)
top_frame.rowconfigure(0, weight=1)
top_frame.rowconfigure(1, weight=1)
# the right frame is made up of two widgets, an entry
# on top and a text below
entry = Entry(right_frame)
text = Text(right_frame)
entry.pack(side="top", fill="x")
text.pack(side="top", fill="both", expand=True)
# the button frame has five equally spaced buttons
for color in ('Red', 'Blue', 'Green', 'Black'):
b = Button(button_frame, text=color)
b.pack(side="left", fill="x", expand=True)
quit_button = Button(button_frame, text="Quit")
quit_button.pack(side="left", fill="x", expand=True)
root = Tk()
app = Application(root)
app.pack(fill="both", expand=True)
root.mainloop()