【发布时间】:2019-09-11 12:42:37
【问题描述】:
我正在尝试构建一个基本上只有一个窗口的 GUI。这个窗口是不同框架的组合。我想要做的是以某种格式将这些框架(每个框架进一步包含多个小部件)排列在一起:
- 第一帧(左上角):窗口大小从上到左的一半
- 第二帧(左下角):从左下角算起窗口大小的一半
- 第三帧(右上):窗口顶部的 1/3 大小和窗口右侧的一半大小。
- 第四帧(右下角):窗口上的剩余空间。
下面,我为这个问题添加了一个简单的简约代码。为简单起见,我使用了相同的 FRAME 类并创建了 4 个此类的实例以添加到主窗口中。我使用 Tkinter 的网格管理器来组织框架中的小部件,然后再次使用网格管理器将这些框架打包到主窗口中。
import Tkinter as tk
# Test frame class. The same frame is used to create 4 instances.
class TestFrame(tk.Frame):
def __init__(self, master=None, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
super().__init__(master)
# Test Entry fields
test_label_1 = tk.Label(master, text="Test Label 1").grid(row=0, column=0)
test_label_1_entry = tk.Entry(master, bd=5).grid(row=0, column=1)
test_label_2 = tk.Label(master, text="Test Label 2").grid(row=0, column=2)
test_label_2_entry = tk.Entry(master, bd=5).grid(row=0, column=3)
# Test checkbox fields
test_checkbox_1_label = tk.Label(master, text="Test check button 1").grid(row=2, column=0)
test_checkbox_1_entry = tk.Checkbutton(master, bd=5).grid(row=2, column=1)
test_checkbox_2_label = tk.Label(master, text="Test check button 2").grid(row=2, column=2)
test_checkbox_2_entry = tk.Checkbutton(master, bd=5).grid(row=2, column=3)
# Test dropdowns
test_dropdown_label = tk.Label(master, text="Test dropdown 1").grid(row=3, column=0)
list_of_options = ["first option", "second option", "third option", "forth option"]
first_option = tk.StringVar(master)
first_option.set(list_of_options[0])
test_dropdown_label = tk.OptionMenu(master, first_option, *list_of_options).grid(row=3, column=1)
test_dropdown_label = tk.Label(master, text="Test dropdown 1").grid(row=3, column=0)
list_of_options = ["first option", "second option", "third option", "forth option"]
first_option = tk.StringVar(master)
first_option.set(list_of_options[0])
test_dropdown_label = tk.OptionMenu(master, first_option, *list_of_options).grid(row=3, column=1)
pass
pass
class TestMainApplication(tk.Frame):
def __init__(self, master, *args, **kwargs):
tk.Frame.__init__(self, master, *args, **kwargs)
super().__init__(master)
title = "Test Application"
self.grid()
# Assign the weight to each row and column as 1. This is required to align the parameters in grid.
for r in range(3):
self.master.rowconfigure(r, weight=1)
for c in range(8):
self.master.columnconfigure(c, weight=1)
self.master.title(title)
# Add two instances of the class TestFrame
self.testFrame1 = TestFrame(master)
self.testFrame2 = TestFrame(master)
self.testFrame3 = TestFrame(master)
self.testFrame4 = TestFrame(master)
self.testFrame1.grid(row=0, column=0, rowspan=3, columnspan=3, sticky=tk.W+tk.E+tk.N+tk.S)
self.testFrame2.grid(row=3, column=0, rowspan=3, columnspan=3, sticky=tk.W+tk.E+tk.N+tk.S)
self.testFrame3.grid(row=0, column=3, rowspan=2, columnspan=3, sticky=tk.W+tk.E+tk.N+tk.S)
self.testFrame4.grid(row=2, column=3, rowspan=4, columnspan=3, sticky=tk.W+tk.E+tk.N+tk.S)
pass
pass
# Main application is created here.
root = tk.Tk()
mainApplication = TestMainApplication(root)
root.mainloop()
我希望在运行此代码后,一个窗口会分成 4 个部分,按照上面讨论的格式组织。但是,我看到的是所有框架都相互重叠。
环境:MacOS、tkinter 8.6、python 3.6.7
【问题讨论】:
标签: python user-interface tkinter