我正在尝试使用具有以下布局的Tkinter创建GUI。我试过自己创建,但是Widgets根据widget中的内容动态调整自身有一些问题。
我想制作一个3列乘8行的网格,我可以在其中放置各种类型的小部件。
为了进一步说明,每个绿色部分是一个调用不同功能的按钮(左侧有6个独立按钮)。这些功能将显示在蓝色区域(实际上将是一个整体区域6row x 2col融合到一个大区域,不应根据文本大小进行调整 ie main_window.grid_propagate(False)
)。
橙色,将融合在一起以形成徽标,紫色,黄色,灰色和粉红色,区域是个人物品。
注意: 其中"主窗口"是一个窗口,能够显示各种小部件和文本大小,无需重新调整/重新配置整个窗口分辨率。
蓝色区域将根据其左侧按下的六个按钮之一显示按钮,文本,图像等。
问:我如何最初创建一个8row x 3col网格,我可以在其中放置小部件。并将蓝色区域融合为一个,我可以根据6个按钮之一的子程序显示文本,图像等?
答案 0 :(得分:2)
我不确定您面临的困难,因为这只是您可以创建的简单布局。唯一的问题是当窗口调整大小时你想要发生什么。按钮是否增长,或者有色部分是否保持不变,并且额外的空间被添加为右侧和底部的空白区域?或者,两者的某种组合?
您仍然会遇到这样的问题:当小部件调整大小时,它们会影响周围的事物。这就是tkinter的工作方式,也可以说是应该的工作方式。如果窗口小部件变大,您仍需要查看整个窗口小部件。
这是一个在行和列之间均匀分配所有额外空间的示例。您可以使用示例末尾的rowconfigure
和columnconfigure
方法来控制此操作。
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()