Python Tkinter - 在窗口中均匀缩放控件

21 投票
2 回答
33830 浏览
提问于 2025-04-18 12:35

我有一个小的Python测试应用,因为我正在学习Python和Tkinter。我想弄明白如何在窗口中均匀地调整标签的大小。我想做一个大网格,里面有不同颜色的方块,所以我使用了设置了背景颜色的标签来制作这些方块。我希望当用户扩大窗口时,这些方块能够自动调整大小,然后当窗口变小时,它们也能缩小到相同的大小。

就像这样:

默认的“方块”大小。默认情况下以这个大小打开。

然后像这样均匀地调整大小:

当窗口扩大时的大小。

换句话说:每个标签在窗口缩放时都应该均匀地缩放。我甚至不确定“窗口”和“控件”这些词用得对不对。但我是在一个图形界面上放置标签。

我正在使用的测试代码,试图让这个功能正常工作:

    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 个回答

12

这是对Bryan Oakley提供的答案的补充,下面是用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()
21

给所有的行和列设置相同的非零权重。

举个例子:

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)

撰写回答