Python - несколько фреймов с Grid manager - PullRequest
12 голосов
/ 25 мая 2011

Я пытаюсь использовать функциональные возможности модуля Tkinter (Python 2.7) для создания графического интерфейса, в котором восемь виджетов размещены в сетке столбцов размером 7 на 5 столбцов (извините, я не включил изображение; диалоговое окноне позволяет мне просматривать и загружать сохраненное изображение).

(виджет, start_row, start_col, row_span, column_span):

  1. («Кнопка 0», 6, 0, 1, 1)
  2. («Кнопка 1», 6, 1, 1, 1)
  3. («Кнопка 2», 6, 2, 1, 1)
  4. («Кнопка 3», 6, 3, 1, 1)
  5. («Кнопка 4», 6, 4, 1, 1)
  6. («Кадр1», 0, 0, 3,2)
  7. ("Frame2", 2, 0, 3, 2)
  8. ("Frame3", 0, 3, 6, 3)

Пока, когда я запускаю свой код, кнопки и Frame3 отображаются нормально, но Frame1 вертикально «сдавливает» Frame2.Любые предложения будут ценны.(Я прочитал предложенные ответы StackOverflow, и ни один из них, по-видимому, не предоставляет информацию, которая может быть использована для решения моей проблемы. Кроме того, я много раз искал в Интернете безрезультатно.)

from Tkinter import *

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master.title("Grid Manager")

        self.master.rowconfigure(0, weight=1)
        self.master.columnconfigure(0, weight=1)

        for i in range(5):
            self.master.button = Button(master, text = "Button {0}".format(i))
            self.master.button.grid(row=6, column=i, sticky=W+E)

        self.Frame1 = Frame(master, bg="red")
        self.Frame1.grid(row = 0, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S) 
        self.Frame2 = Frame(master, bg="blue")
        self.Frame2.grid(row = 2, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
        self.Frame3 = Frame(master, bg="green")
        self.Frame3.grid(row = 0, column = 2, rowspan = 6, columnspan = 3, sticky = W+E+N+S)

root = Tk()
app = Application(master=root)
app.mainloop()

ОБНОВЛЕНИЕ: Теперь, когда яm на моем персональном компьютере, вот изображения для результата, который я хочу, и результата, который я получаю, соответственно:

WANT

get

Ответы [ 3 ]

14 голосов
/ 26 мая 2011

Поработав с моим кодом в течение нескольких часов, я наконец смог создать графический интерфейс, который я намеревался.Ключ проходил по строкам и столбцам и устанавливал их веса, используя rowconfigure и columnconfigure, соответственно.Код ниже:

from tkinter import *

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid()
        self.master.title("Grid Manager")

        for r in range(6):
            self.master.rowconfigure(r, weight=1)    
        for c in range(5):
            self.master.columnconfigure(c, weight=1)
            Button(master, text="Button {0}".format(c)).grid(row=6,column=c,sticky=E+W)

        Frame1 = Frame(master, bg="red")
        Frame1.grid(row = 0, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S) 
        Frame2 = Frame(master, bg="blue")
        Frame2.grid(row = 3, column = 0, rowspan = 3, columnspan = 2, sticky = W+E+N+S)
        Frame3 = Frame(master, bg="green")
        Frame3.grid(row = 0, column = 2, rowspan = 6, columnspan = 3, sticky = W+E+N+S)

root = Tk()
root.geometry("400x200+200+200")
app = Application(master=root)
app.mainloop()

enter image description here

4 голосов
/ 26 мая 2011

Поскольку в кадрах 1, 2 и 3 нет виджетов внутри, а вы не указали их высоту, их естественный размер будет равен одному пикселю. Если вы поместите что-то в frame2 или зададите frame2 высоту, оно появится.

1 голос
/ 27 мая 2011

Если вам нравится попробуйте pytkgen (https://github.com/tmetsch/pytkgen или http://pypi.python.org/pypi/pytkgen/)), который генерирует графические интерфейсы Tkinter из файлов JSON и учитывает вес, рост и конфигурацию строки / столбца. См. Примеры здесь: https://github.com/tmetsch/pytkgen/tree/master/examples

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...