使用帧和网格创建tkinter GUI布局

使用帧和网格创建tkinter GUI布局

在使用Python的GUI工具包tkinter创建图形用户界面时,布局是一个重要的因素。GUI工具包收集了一堆的组件,你可以将它们安排在你想要的方式。在这里,我们将会关注如何使用tkinter中的帧和网格来创建可缩放、易修改的GUI布局。

tkinter 简介

Tkinter是Python标准库中一个GUI工具包。它提供的功能齐全,使开发人员可以轻松创建跨平台的GUI应用。它提供了开发者创建GUI布局所需的所有组件,如按钮、文本输入区、标签、列表框、复选框等等。

但是,对于线性布局以外的情况,它的布局管理工具是相当有限的。在这种情况下,开发者有两种选择:一种是使用绝对定位,这种布局方式对多分辨率和语言支持很差;另一种是使用不同的窗口、框架和网格来布置窗口。

以下是使用绝对布局项目的代码示例:

import tkinter as tk

root = tk.Tk()
root.geometry("300x300")
root.title("Absolute positioning")
btn = tk.Button(root, text="Button")
btn.place(x=50, y=50)
text = tk.Text(root)
text.place(x=150, y=100)

root.mainloop()

帧和网格

我们来看一个更实用的布局方法,使用帧和网格。它将容器分组到一个单独的框内,并使用网格来指定每个子组件应该放置在容器中的哪个位置。包含子元素的容器称为框架。

首先我们需要创建帧,然后将网格的行和列分配给里面的内容。如下所示:

import tkinter as tk

root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
button1 = tk.Button(frame, text="Button 1")
button2 = tk.Button(frame, text="Button 2")
button1.grid(row=0, column=0)
button2.grid(row=1, column=1)

root.mainloop()

这个示例有两个按钮,一个在网格的第0行、第0列,另一个在第1行和第1列。

当你使用网格时,你可以根据需要更改你的行和列数量;可以像下面这样改变:

button3 = tk.Button(frame, text="Button 3")
button4 = tk.Button(frame, text="Button 4")
button3.grid(row=0, column=2)
button4.grid(row=1, column=3)

我们现在有一个4×3的网格,Button 3在第1列和第0行,Button 4在第3列和第1行。

你也可以使用span属性,将任意数量的行和列组合为一个网格单元格。例如:

button1.grid(row=1, column=0, rowspan=2)
button4.grid(row=2, column=2, columnspan=2)

在第1行和第0列的单元格中,Button 1占用了2行;在第2行和第2列的单元格中,Button 4跨2列。

tkinters布局组件

Tkinter提供了一个示例布局组件包,称为tkinters布局。它包含几个有用的方法来帮助你将组件放置在网格中。您可以使用这些方法来批量处理类似的组件,并且具有更好的代码重用性。

例如,该代码将在第0行、第0列开始放置5个按钮,按顺序放置在网格的第一列。

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()

frame = ttk.Frame(root, padding=10)
frame.pack(fill=tk.BOTH,expand=True)

buttons = ttk.LabeledScale(frame, from_=0, to=100, orient=tk.HORIZONTAL,
                           label="Scale") .grid(row=0, column=0, columnspan=2, pady=10,
                                                padx=10, sticky="nsew")
ttk.Label(frame, text="Buttons").grid(row=1, column=0, pady=5, padx=5, sticky="w")

button_matrix = []

for i in range(5):
    button_row = []
    for j in range(2):
        button = ttk.Button(frame, text=f"Button {i*2+j}")
        button.grid(row=i+2, column=j, pady=3, padx=3, sticky="nsew")
        button_row.append(button)
    button_matrix.append(button_row)

ttk.Separator(frame, orient=tk.HORIZONTAL).grid(row=7, column=0,
                                                columnspan=2, sticky="ew", pady=10)
ttk.Label(frame, text="Checkboxes").grid(row=8, column=0, pady=5, padx=5, sticky="w")

for i in range(3):
    checkbox = ttk.Checkbutton(frame, text=f"Checkbox {i}")
    checkbox.grid(row=9, column=i, pady=3, padx=3)

root.mainloop()

此示例使用了tkinter中的许多组件,包括框架、标签、Button、LabeledScale、Separator和Checkbutton。我们还使用了grid方法来将按钮、标签和复选框放置在框架的网格单元格中。此外,我们还使用了pady、padx和sticky选项。

结论

通过使用帧和网格,开发者可以轻松地构建可缩放、易修改的GUI布局。Tkinter提供了灵活的布局组件和大量的选项,使开发人员能够创建专业、具有吸引力的用户界面。无论你是新手还是经验丰富的Tkinter用户,这些技术都能帮助你在你下一个GUI项目中更好地设计和构建布局。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程