Tkinter 学习笔记 —— 布局管理

来源:互联网 发布:预装软件下载 编辑:程序博客网 时间:2024/06/06 18:13

本笔记基于 Tkinter 8.5 reference: a GUI for Python

Tkinter 中有三种不同的“几何管理器”:

geometry managers description pack() 包 grid() 网格 place() 位置

但,.grid()几何管理器几乎能用于所有的方面。其将每个窗口或框架都视为一个表格,或者说网格。

  • 单元格(cell)是行、列交叉所形成的区域。
  • 每列最宽的单元格的宽度是该列的宽度。
  • 每行最高的单元格的高度是该行的高度。
  • 对于那些部件不能填满的单元格,你可以自由安排额外空间。可以在部件外留出额外空间,也可以在水平或垂直方向上拉伸部件以适应它。
  • 可以将多个单元格组合成一个较大的区域,该过程被称为 spanning

当创建一个部件时,它不会立刻出现,直到你在几何管理器中注册它:

self.thing = tk.Constructor(parent, ...)self.thing.grid(...)

其中, Constructor 是诸如:ButtonFrame 部件类中的一个。所有的部件都有 .grid() 方法,如此你就可以告诉几何管理器将该部件放在哪儿。

.grid() 方法

在应用上显示部件 w

w.grid(option=value, ...)

表 1. .grid() GM 参数

Items Description column 部件放置所在的列号,从 0 开始,默认值为 0 。 columnspan 通常,部件只占用网格中的一个单元格。但是,可以通过设置 columnspan 选项将一行多个单元格合并为一个大的单元格。例如,w.grid(row=0, column=2, columnspan=3) 会将窗口部件 w 放在行 0 中跨越列 2 、3 和 4 的单元格中。 in_ 要将 w 注册为某部件 w2 的子部件,使用 in_ = w2 。新的父部件 w2 必须是创建 w 时使用的父部件的后代。 ipadx 内部 x 填充,在部件内的左侧和右侧添加额外的空间。 ipady 内部 y 填充,在部件内的上侧和下侧添加额外的空间。 padx 外部 x 填充,在部件外的左侧和右侧添加额外的空间。 pady 外部 y 填充,在部件外的上侧和下侧添加额外的空间。 row 部件放置所在的列号,从 0 开始,默认值为下一个较高未占用数字。 rowspan 通常,部件只占用网格中的一个单元格。但是,可以通过设置 rowspan 选项将一列多个单元格合并为一个大的单元格。例如,w.grid(row=3, column=2, rowspan=4, columnspan=5) 会将部件 w 放在 20 个单元格合并而成的区域中,其行号 3-6 、列号 2-6 。 sticky 用于定义生成的单元格大于部件本身时,如何扩展部件。这可以是常数 S、N、E 和 W 或 NW、NE、SW 和 SE 之间的任何组合。

具体如下:

snipaste_20170626_171538.png

  • 如果不提供 sticky 属性,默认行为是将部件放在单元格正中。
  • 可以使用 sticky = tk.NE (右上), tk.SE (右下), tk.SW (左下)或 tk.NW (左上)将部件放在单元格的一角。
  • 可以使用 sticky = tk.N (顶部中心), tk.E (右中心), tk.S (底部中心)或 tk.W (左中心)将部件对齐在单元格的一侧。
  • 使用 sticky = tk.N+tk.S 来垂直拉伸,但水平居中。
  • 使用 sticky = tk.E+tk.W 来水平拉伸,但垂直居中。
  • 使用 sticky = tk.N+tk.E+tk.S+tk.W 同时水平和垂直拉伸部件以填充单元格。
  • 其他组合也是可以的。

例子

#!/usr/bin/env python3import tkinter as tkclass Application(tk.Frame): # application class must inherit from tkinter's Frame class    def __init__(self, master = None):        tk.Frame.__init__(self, master = None) # calls the constructor for the parent class, Frame        self.grid() # to make the application actually appear on the screen        self.createWidgets()    def createWidgets(self):        self.hightLabel = tk.Label(self, text = 'Hight')        self.hightLabel.grid()        self.widthLabel = tk.Label(self, text = 'Width')        self.widthLabel.grid()app = Application()app.master.title('Test 02')app.mainloop()

会产生:

Screenshotfrom2017-06-2611-12-19.png

添加文本框并对齐标签:

[...]def createWidgets(self):        self.hightLabel = tk.Label(self, text = 'Hight')        self.hightLabel.grid()        self.widthLabel = tk.Label(self, text = 'Width')        self.widthLabel.grid()        self.entry1 = tk.Entry(self)        self.entry2 = tk.Entry(self)        self.entry1.grid(row = 0, column = 1)        self.entry2.grid(row = 1, column = 1)[...]

我们得到了这个:

Screenshotfrom2017-06-2611-28-06.png

加入复选按钮:

def createWidgets(self):    [...]    self.checkButton = tk.Checkbutton(self, text = 'Keep My Password')    self.checkButton.grid(columnspan = 3, sticky = tk.W)

Screenshotfrom2017-06-2616-39-54.png

添加一个滑稽按钮:

def createWidgets(self):    [...]    photo = tk.PhotoImage(file = "huaji-small.gif")    self.button = tk.Button(self, image = photo)    self.button.image = photo    self.button.grid(row = 0, column = 2, columnspan = 2, rowspan = 2,        sticky = 'wens', padx = 5, pady = 5)

我们得到这个:

Screenshotfrom2017-06-2616-34-51.png

其他的网格管理方法

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

grid_bbox 方法

返回 4 元素元组,用于描述部件中,网格系统部分或全部边框。返回的前两个数字是区域左上角的 xy 坐标,后二个数字是宽度和高度。

grid_forget()

将该部件从网格管理器中移除,但其依然是存在的,只是看不见而已。可以使用 grid 或其他管理器使其再次可见。

grid_info()

返回一个字典,其键是部件的选项名,而相应的值则是选项的值。

grid_location(x, y)

给定一个相对于容器部件的坐标 (x, y) ,该方法返回一个元组 (col, row) 描述其在屏幕的坐标。

grid_propagate(flag)

通常,部件都会根据其内容自动调节自身尺寸,如果将 flag 设为 False 则会强制设置部件为特定大小。

grid_remove()

grid_forget() 类似,但如果你再次 grid ,它会重用之前的配置项。

grid_size()

返回该部件的网格系统的行数和列数。

grid_slaves(row=None, column=None)

返回一个由部件管理的子部件组,通过 rowcolumn 选择特定行列的子部件。

例子

配置行列大小

grid_columnconfigure(index, **options)

设置单元格列选项

index 为列序号, options 参见表 2 。

grid_rowconfigure(index, **options)

设置单元格行选项

index 为行序号, options 参见表 2 。

表 2. .grid() 行列配置选项

options description minsize 定义行或列的最小尺寸。但要注意,如果行或列完全为空,那么即使设置了此选项,也不会显示。 pad 将在行或列最大尺寸部件的基础上,填充尺寸。 weight 使行列可拉伸,该选项提供部件网格布局的相对权值。

例子

参考

An Introduction to Tkinter

Tkinter 8.5 reference: a GUI for Python

原创粉丝点击