Python Tkinter-равномерно изменять размер виджетов в окне

У меня есть небольшое тестовое приложение Python, поскольку я изучаю Python и Tkinter, и я пытаюсь выяснить, как равномерно изменить размер сетки меток в окне. Я хотел бы сделать большую сетку из разных цветных квадратов, поэтому я использую метки с набором цветов фона для создания квадратов. Я хотел бы автоматически изменять размер квадратов, когда пользователь расширяет окно, а затем изменять их размер и масштабировать до того же размера, что и окно размер.

что-то вроде этого:

Default "square" size. Opens up at this size by default.

что изменяется и равномерно весы вроде этого:

Size when the window is expanded in size.

другими словами: каждая метка должна равномерно масштабироваться по мере масштабирования окна. Я даже не уверен, что использую правильные термины с "окном" и "виджетом". Но я размещаю ярлыки на gui.

тестовый код, который я использую, чтобы попытаться заставить это работать:

    import Tkinter

class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()

        label = Tkinter.Label(self,anchor="center",bg="green")
        label.grid(column=0,row=0,sticky='EW')

        label2 = Tkinter.Label(self,anchor="center",bg="black")
        label2.grid(column=1,row=0,sticky='EW')

        label3 = Tkinter.Label(self,anchor="center",bg="red")
        label3.grid(column=2,row=0,sticky='EW')

        label4 = Tkinter.Label(self,anchor="center",bg="purple")
        label4.grid(column=0,row=1,sticky='EW')

        label5 = Tkinter.Label(self,anchor="center",bg="blue")
        label5.grid(column=1,row=1,sticky='EW')

        label6 = Tkinter.Label(self,anchor="center",bg="yellow")
        label6.grid(column=2,row=1,sticky='EW')


        self.grid_columnconfigure(0,weight=0)

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title("Test App")
    app.mainloop()

2 ответов


дайте всем строкам и столбцам одинаковый ненулевой вес.

например:

self.grid_columnconfigure(0,weight=1)
self.grid_columnconfigure(1,weight=1)
self.grid_columnconfigure(2,weight=1)
self.grid_rowconfigure(0,weight=1)
self.grid_rowconfigure(1,weight=1)

завершение ответ предоставлен Брайан Окли, код для его решения в python 3 следующий.

обратите внимание, что одним из вариантов управления пропорцией, для которой изменяется размер окна, является установка параметров веса для функций grid_columnconfigure(1,weight=1) и grid_rowconfigure(1,weight=1) для различных значений.

import tkinter

class simpleapp_tk(tkinter.Tk):
    def __init__(self,parent):
        tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()

        label = tkinter.Label(self,anchor="center",bg="green")
        label.grid(column=0,row=0,sticky='NSEW')

        label2 = tkinter.Label(self,anchor="center",bg="black")
        label2.grid(column=1,row=0,sticky='NSEW')

        label3 = tkinter.Label(self,anchor="center",bg="red")
        label3.grid(column=2,row=0,sticky='NSEW')

        label4 = tkinter.Label(self,anchor="center",bg="purple")
        label4.grid(column=0,row=1,sticky='NSEW')

        label5 = tkinter.Label(self,anchor="center",bg="blue")
        label5.grid(column=1,row=1,sticky='NSEW')

        label6 = tkinter.Label(self,anchor="center",bg="yellow")
        label6.grid(column=2,row=1,sticky='NSEW')


        self.grid_columnconfigure(0,weight=1)
        self.grid_columnconfigure(1,weight=1)
        self.grid_columnconfigure(2,weight=1)
        self.grid_rowconfigure(0,weight=1)
        self.grid_rowconfigure(1,weight=1)


if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title("Test App")
    app.mainloop()