【Tkinter系列01/15】界面初步和布局

时间:2025-03-03 07:47:35

一、说明

        一般来说,界面开发中,如果不是大型的软件,就不必用QT之类的实现,用Tkinter已经足够,然而即便是Tkinter规模不大,也需要一个系统专业的学习过程,本篇将是对Tkinter系列介绍的一篇博文。

二. 一个最小的应用程序

这是一个简单的Tkinter程序,仅包含一个退出按钮:

#!/usr/bin/env python      1
import Tkinter as tk       2

class Application():              3
    def __init__(self, master=None):
        .__init__(self, master)   4
        ()                       5
        ()

    def createWidgets(self):
         = (self, text='Quit',
            command=)            6
        ()            7

app = Application()                       8
('Sample application')    9
("300x300") 10
()       11

代码解释 

1 假设您的系统已正确安装 Python,此行将使脚本自动执行。
2 此行将Tkinter模块导入到程序的命名空间中,但将其重命名为tk.
3 您的应用程序类必须继承自 Tkinter的Frame 类。
4 调用父类的构造函数 Frame。
5 使应用程序实际出现在屏幕上所必需的。
6 创建一个标记为“退出”的按钮。
7 将按钮放置在应用程序上。
8 主程序从实例化该类开始 Application。
9此方法调用将窗口的标题设置为“示例应用程序”
10 设置窗口的几何尺寸
11 启动应用程序的主循环,等待鼠标和键盘事件。 

三、基本组件术语

        在继续之前,我们先定义一些常用术语。

        window 窗户

        该术语在不同的上下文中具有不同的含义,但通常它指的是显示屏上某处的矩形区域。

        top-level window顶层窗口

        独立存在于屏幕上的窗口。它将用系统桌面管理器的标准框架和控件进行装饰。您可以在桌面上移动它。您通常可以调整它的大小,尽管您的应用程序可以阻止这种情况

        widget小部件

        构成图形用户界面中的应用程序的任何构建块的通用术语。小部件的示例:按钮、单选按钮、文本字段、框架和文本标签。

        Frame框架

        在Tkinter中,Frame小部件是复杂布局的基本组织单元。框架是可以包含其他小部件的矩形区域。

        child, parent孩子、父母

当创建任何小部件时,就会创建父子关系。例如,如果将文本标签放置在框架内,则框架是标签的父级。

四.布局管理

        稍后我们将讨论小部件,即 GUI 应用程序的构建块。小部件如何在窗口中排列?

        尽管Tkinter 中有三种不同的“几何管理器” ,但作者强烈喜欢.grid()几何管理器来处理几乎所有的事情。该管理器将每个窗口或框架视为一个表格——行和列的网格。

  • 单元是一行和一列相交的区域。

  • 每列的宽度是该列中最宽单元格的宽度。

  • 每行的高度是该行中最大单元格的高度。

  • 对于未填充整个单元格的小部件,您可以指定如何处理额外的空间。您可以在小部件外部保留额外的空间,或者在水平或垂直维度上拉伸小部件以适应它。

  • 您可以将多个单元格合并为一个更大的区域,这一过程称为生成

        当您创建一个小部件时,直到您将其注册到几何管理器后,它才会出现。因此,构建和放置小部件是一个两步过程,如下所示:

 = (parent, ...)
    (...)

        其中是、 等Constructor 小部件类之一,是在其中构造该子小部件的父小部件。所有小部件都有一个 方法,您可以使用该方法告诉几何管理器将其放置在哪里。 ButtonFrameparent.grid()

4.1. 方法.grid()_

w要在应用程序屏幕上 显示小部件 :

(  option =  value , ...)

        此方法w向网格几何管理器注册一个小部件 - 如果您不这样做,该小部件将在内部存在,但在屏幕上不可见。有关选项,请参见表1,“几何管理器的参数.grid()”

        表 1..grid()几何管理器的参数

column 您希望小部件网格化的列号,从零开始计数。默认值为零。
columnspan 通常,一个小部件仅占据网格中的一个单元格。但是,您可以通过将该选项设置为单元格数量来抓取一行中的多个单元格并将它们合并为一个更大的单元格columnspan。例如,w.grid(row=0, column=2, columnspan=3) 将小部件放置w在跨越第 0 行第 2、3 和 4 列的单元格中。
in_ 要注册w为某个小部件的子级,请使用。新的父级必须是创建 时使用的小部件的后代。w2in_=w2w2parentw
ipadx 内部 x 填充。该尺寸被添加到小部件的左侧和右侧内。
ipady 内部 y 填充。该尺寸被添加到小部件的顶部和底部边框内。
padx 外部 x 填充。该尺寸被添加到小部件外部的左侧和右侧。
pady 外部 y 填充。该尺寸添加在小部件的上方和下方。
row 要插入小部件的行号,从 0 开始计数。默认值是下一个编号较高的未占用行。
rowspan 通常,一个小部件仅占据网格中的一个单元格。rowspan但是,您可以通过将该选项设置为要抓取的单元格数量来抓取一列的多个相邻单元格。columnspan此选项可以与抓取单元格块的选项结合使用。例如,w.grid(row=3, column=2, rowspan=4, columnspan=5)将小部件放置w在由 20 个单元格合并而成的区域中,行号为 3-6,列号为 2-6。
sticky 此选项确定如何分配单元格内小部件以其自然大小未占用的任何额外空间。见下文。
 
  • 如果您不提供sticky 属性,则默认行为是将小部件在单元格中居中。

  • 您可以使用sticky=(右上角)、(右下角)、 (左下角)或(左上角)将小部件放置在单元格的一角。

  • 您可以使用sticky=(顶部中心)、(右侧中心)、 (底部中心)或 (左侧中心)将小部件定位在单元格一侧的中心。

  • 用于sticky=+垂直拉伸小部件,但使其水平居中。

  • 用于sticky=+水平拉伸但使其垂直居中。

  • 用于sticky=+++水平和垂直拉伸小部件以填充单元格。

  • 其他组合也将起作用。例如,sticky=++将垂直拉伸小部件并将其放置在西(左)墙上。

4.2. 其他网格管理方法

        这些与网格相关的方法在所有小部件上定义:

   w.grid_bbox(column=None, row=None, col2=None, row2=None)

        返回一个 4 元组,描述 widget 中部分或全部网格系统的边界框w。返回的前两个数字是区域左上角的 x和坐标,后两个数字是宽度和高度。y

        如果传入columnrow参数,则返回的边界框描述该列和行的单元格区域。如果您还传入col2和 参数,则返回的边界框描述从列到包含范围以及从行到 包含范围row2的网格区域。 columncol2rowrow2

        例如,w.grid_bbox(0, 0, 1, 1)返回四个单元格的边界框,而不是一个。

   w.grid_forget()

        此方法使小部件w 从屏幕上消失。它仍然存在,只是不可见。您可以使用.grid()它使其再次出现,但它不会记住其网格选项。

   w.grid_info()

        返回一个字典,其键是w的选项名称以及这些选项的相应值。

   w.grid_location(xy)

        给定相对于包含的小部件的 坐标,此方法返回一个元组,描述 的网格系统的哪个单元格包含该屏幕坐标。 (xy)(colrow)w

   w.grid_propagate()

        通常,所有小部件 都会传播其尺寸,这意味着它们会进行调整以适应内容。但是,有时您希望强制小部件具有特定大小,而不管其内容的大小。为此,请调用 w.grid_propagate(0)where w is the widget that you want to Forced 大小。

   w.grid_remove()

        此方法类似于 .grid_forget(),但它的网格选项会被记住,因此如果您 .grid()再次使用,它将使用相同的网格配置选项。

   w.grid_size()

w返回一个 2 元组,其中分别包含的网格系统 中的列数和行数。

   w.grid_slaves(row=None, column=None)

        返回由 widget 管理的小部件列表 w。如果未提供参数,您将获得所有托管小部件的列表。使用row=参数仅选择一行中的小部件,或使用column=参数仅选择一列中的小部件。

4.3. 配置列和行的大小

        除非您采取某些措施,否则给定小部件内的网格​​列的宽度将等于其最宽单元格的宽度,并且网格行的高度将是其最高单元格的高度。小部件上的属性 sticky仅控制小部件未完全填充单元格时的放置位置。

        如果您想覆盖列和行的自动调整大小,请在 包含网格布局的 小部件上使用以下方法:w

   w.columnconfigure(Noption=value, ...)

        在小部件内的网格​​布局中w,配置列,N以便给定具有option给定value。有关选项,请参见下表。

   w.rowconfigure(Noption=value, ...)

        在小部件内的网格​​布局中w,配置行,N 以便给定具有option给定value。有关选项,请参见下表。

        以下是用于配置列和行大小的选项。

.grid()表 2.几何管理器的列和行配置选项

minsize 列或行的最小大小(以像素为单位)。如果给定的列或行中没有任何内容,即使您使用此选项,它也不会出现。
pad 将添加到给定列或行、列或行中最大单元格上方的像素数。
weight

要使列或行可拉伸,请使用此选项并提供一个值,该值给出分配额外空间时该列或行的相对权重。例如,如果小部件w包含网格布局,这些行会将额外空间的四分之三分配给第一列,将四分之一分配给第二列:

(0, weight=3)

(1, weight=1)

如果不使用此选项,列或行将不会拉伸。

4.4. 使根窗口可调整大小

您想让用户调整整个应用程序窗口的大小,并在其内部小部件之间分配额外的空间吗?这就需要一些不明显的操作。

有必要使用第 4.3 节“配置列和行大小”中描述的行和列大小管理技术,以使Application小部件的网格可拉伸。然而,仅此还不够。

考虑第 2 节“最小应用程序” 中讨论的简单应用程序,它仅包含一个退出按钮。如果运行此应用程序并调整窗口大小,按钮将保持相同大小,并位于窗口*。

这是最小应用程序.__createWidgets()中 该方法的替换版本。在此版本中,“退出”按钮始终填满所有可用空间。

  def createWidgets(self):
        top=self.winfo_toplevel()                1
        (0, weight=1)            2
        (0, weight=1)         3
        (0, weight=1)           4
        (0, weight=1)        5
         = Button(self, text='Quit', command=)
        (row=0, column=0,          6
            sticky=+++)
1

“顶层窗口”是屏幕上最外面的窗口。然而,这个窗口不是您的Application 窗口——它是实例 的父窗口Application。要获取*窗口,请.winfo_toplevel()在应用程序中的任何小部件上调用该方法;请参见第 26 节“通用小部件方法”

2

该行使顶层窗口网格的第 0 行可拉伸。

3

此行使顶层窗口网格的第 0 列可拉伸。

4

使Application小部件网格的第 0 行可拉伸。

5

使Application小部件网格的第 0 列可拉伸。

6

该参数sticky=+++ 使按钮展开以填充其网格单元格。

还有一项必须做出的改变。在构造函数中,更改第二行,如下所示:

   def __init__(self, master=None):
        .__init__(self, master)
        (sticky=+++)
        ()

        参数sticky=+++是 ()必需的,以便Application小部件能够扩展以填充*窗口网格的单元格。

Tkinter 8.5 reference: a GUI for Python