Возникли проблемы с изменением размера нескольких сеток - PullRequest
4 голосов
/ 09 декабря 2011

У меня есть следующий код.Моя проблема в том, что мне не удается правильно изменить размеры кадров.Когда я запускаю программу, все как положено.Но когда я изменяю его размер, я хочу сохранить исходный вид.

from Tkinter import *
import os
import sys


ALL=N+S+E+W

class Application(Frame):

    def __init__(self,master=None):
        Frame.__init__(self,master)
        self.master.rowconfigure(0,weight=1)
        self.master.columnconfigure(0,weight=1)
        self.grid(sticky=ALL)

        self.rowconfigure(0,weight=1)
        myframe1=Frame(self,bg='green')
        myframe1.bind("<Button-1>",self.handler1)
        myframe1.grid(row=0,column=0,rowspan=1,columnspan=2,sticky=ALL)
        self.rowconfigure(1,weight=1)
        myframe2=Frame(self,bg='blue')
        myframe2.bind("<Button-1>",self.handler2)
        myframe2.grid(row=1,column=0,rowspan=1,columnspan=2,sticky=ALL)


        buttons=('Red','Blue','Green','Black')
        button=[0]*4
        for c in range(4):
            self.rowconfigure(c+2,weight=1)
            self.columnconfigure(c,weight=1)
            button[c]=Button(self,text="{0}".format(buttons[c]),command=lambda     x=buttons[c]:self.colors(x))
            button[c].grid(row=2,column=c,sticky=E+W)

        self.columnconfigure(4,weight=1)
        self.rowconfigure(6,weight=1)
        button1=Button(self,text='{0}'.format('Open'),command=self.content)
        button1.grid(row=2,column=4,sticky=E+W)


        f=Frame(self,bg='red')
        self.myentry=Entry(f)
        self.myentry.grid(row=0,column=4,sticky=ALL)
        self.text=Text(f)
        self.text.grid(row=1,column=4,sticky=ALL)
        f.grid(row=0,column=2,rowspan=2,columnspan=3,sticky=ALL)

        ...

Я пробовал много комбинаций rowconfigure, columnconfigure, rowspan, columnspan, но мне не удалось!*

Мой исходный вид:

enter image description here

После изменения размера в одном направлении:

enter image description here

В другом направлении:

enter image description here

Белая область - это виджет Text, размер которого я хочу изменить (также синие и зеленые области).

1 Ответ

9 голосов
/ 10 декабря 2011

Ваша проблема в том, что вы, кажется, не совсем понимаете, как работает сетка.Например, вы помещаете только два виджета в красную рамку (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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...