【问题标题】:How to Create a 3 column by 8 row column GUI with Tkinter如何使用 Tkinter 创建 3 列 x 8 行列 GUI
【发布时间】:2016-06-21 11:06:32
【问题描述】:

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

我要实现的格式如下:

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

为了进一步解释,每个绿色部分都是一个按钮,可以调用不同的功能(左侧有 6 个单独的按钮)。这些功能将显示在蓝色区域(实际上是一个完整的区域 6row x 2col 融合为 1 个大区域,不应根据文本大小调整,即main_window.grid_propagate(False))。 橙色,将融合在一起有一个标志,紫色黄色灰色粉红色,区域是单独的项目。

所以本质上它会变成这样:

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

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

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

【问题讨论】:

    标签: python-2.7 user-interface tkinter


    【解决方案1】:

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

    您仍然会遇到这样的问题,即当小部件调整大小时,它们会影响周围的事物。这就是 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()
    

    【讨论】:

    • 太棒了!一个问题,我如何重新调整按钮的大小(宽度)(我试过pady=0width=0,它根本没有减小宽度,并使宽度保持不变)所以不管字体大小在按钮内,按钮不会变宽?
    • @3kstc:我不明白你的问题。如果您想要更宽的按钮,只需给它们一个明确的宽度(例如:Button(..., width=40))。密切注意答案,并注意它是如何平均分配额外空间的,因此如果您希望最左边的列扩展,请不要给它一个权重。
    • 基于上面的代码,当按下按钮时如何更新(a)“单元格”?例如,当我单击 Button 1 时,我希望粉红色单元格使用文本“按钮 1”更新,并在蓝色 [主窗口] 单元格中显示一些文本(文本大小为 16)?
    • @3kstc:我不明白这个问题。只需阅读 Label 小部件上的文档即可。 self.other3.configure(text="Button1"),你必须在主区域放置一些小部件。
    • @BrylanOakley 在阅读了有关 Tkinter 和结构的更多信息后,我有了更好的理解,但我无法让 main ("Main Window") Frame 出现蓝色。我从上面的代码中得到的output 没有蓝色背景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多