如何使用Tkinter创建一个3列乘8列的列GUI

时间:2016-06-21 11:06:33

标签: python-2.7 user-interface tkinter

我正在尝试使用具有以下布局的Tkinter创建GUI。我试过自己创建,但是Widgets根据widget中的内容动态调整自身有一些问题。

我想要实现的格式如下:enter image description here

我想制作一个3列乘8行的网格,我可以在其中放置各种类型的小部件。

为了进一步说明,每个绿色部分是一个调用不同功能的按钮(左侧有6个独立按钮)。这些功能将显示在蓝色区域(实际上将是一个整体区域6row x 2col融合到一个大区域,不应根据文本大小进行调整 ie main_window.grid_propagate(False))。 橙色,将融合在一起以形成徽标,紫色黄色灰色粉红色,区域是个人物品。

所以基本上它会变成这样: enter image description here

注意: 其中"主窗口"是一个窗口,能够显示各种小部件和文本大小,无需重新调整/重新配置整个窗口分辨率。

蓝色区域将根据其左侧按下的六个按钮之一显示按钮,文本,图像等。

问:我如何最初创建一个8row x 3col网格,我可以在其中放置小部件。并将蓝色区域融合为一个,我可以根据6个按钮之一的子程序显示文本,图像等?

1 个答案:

答案 0 :(得分:2)

我不确定您面临的困难,因为这只是您可以创建的简单布局。唯一的问题是当窗口调整大小时你想要发生什么。按钮是否增长,或者有色部分是否保持不变,并且额外的空间被添加为右侧和底部的空白区域?或者,两者的某种组合?

您仍然会遇到这样的问题:当小部件调整大小时,它们会影响周围的事物。这就是tkinter的工作方式,也可以说是应该的工作方式。如果窗口小部件变大,您仍需要查看整个窗口小部件。

这是一个在行和列之间均匀分配所有额外空间的示例。您可以使用示例末尾的rowconfigurecolumnconfigure方法来控制此操作。

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.logo = tk.Label(self, text="Logo", background="orange")
        self.buttons = []
        for i in range(6):
            self.buttons.append(tk.Button(self, text="Button %s" % (i+1,), background="green"))
        self.other1 = tk.Label(self, background="purple")
        self.other2 = tk.Label(self, background="yellow")
        self.other3 = tk.Label(self, background="pink")
        self.other4 = tk.Label(self, background="gray")
        self.main = tk.Frame(self, background="blue")

        self.logo.grid(row=0, column=0, rowspan=2, sticky="nsew")
        self.other1.grid(row=0, column=1, sticky="nsew")
        self.other2.grid(row=0, column=2, sticky="nsew")
        self.other3.grid(row=1, column=1, sticky="nsew")
        self.other4.grid(row=1, column=2, sticky="nsew")
        self.buttons[0].grid(row=2, column=0, sticky="nsew")
        self.buttons[1].grid(row=3, column=0, sticky="nsew")
        self.buttons[2].grid(row=4, column=0, sticky="nsew")
        self.buttons[3].grid(row=5, column=0, sticky="nsew")
        self.buttons[4].grid(row=6, column=0, sticky="nsew")
        self.buttons[5].grid(row=7, column=0, sticky="nsew")
        self.main.grid(row=2, column=2, columnspan=2, rowspan=6)

        for row in range(8):
            self.grid_rowconfigure(row, weight=1)
        for col in range(3):
            self.grid_columnconfigure(col, weight=1)

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.geometry("800x400")
    root.mainloop()