Tkinter (01) 基本选项的说明

Tkinter 是 Python 自带的 GUI 库, 以部件 Widget 为其主要核心. 因此本文先行介绍一些基本的内容, 后面再来说明各部件的使用.

注:这里 tkinter 内容目前參考 8.5 版內容,尚未完全更新到最新的版本. 已在逐步更新中, 撰文者現有 Python 安裝版本為 3.8.3, 其附帶 TkVersion/TclVersion:8.6, 平台為 WIN 10.

表格式的部件布局方式 grid(), 参数选项有下面几项:

column
row
每一格的代表方式由行column 及列row来表示, 都是由 0 开始算起.
columnspan
rowcolumn
占有多少格则由行数columnspan及列数rowspan来表示, (2, 2) 代表部件占用 4 格.
ipadx
ipady
部件内部水平及垂直方向的间隔
padx
pady
部件外部水平及垂直方向的间隔
sticky 每一格的寛度由该列的最大寛度决定, 高度则由行的最大高度决定.
因此格子很可能比部件还大, 所以部件在格子中的位置, 由sticky决定
1. 内定为置中
2. 靠在边上的正中, N(上), S(下), E(右), W(左) .
3. 靠在角落上, NE(右上角), NW(左上角), SE(右下角), SW (左下角).
4. 拉长, NS(垂直), EW(水平), NSEW(全部延伸).
5. 其他, 可以是N, E, SW的组合(加+在一起)
in_ 设置新的父部件in_, 该部件必须是本部件建立时的父部件的子部件.

部件在部局完成后, 就会有一些资讯可供运用, 因此提供以下方法

w.grid_bbox(column=None, row=None, col2=None, row2=None) 格子cloumncol2 (含), rowrow2(含) 所占的座标框 (left_x, top_y, width, height)
w.grid_forget() 隐藏部件, 但其原有的grid选项会全部失去, grid()会再度显示部件
w.grid_info() 部件grid选项及其值的字典
w.grid_location(x, y) 座标点 (x, y) 位置的格子 (col, row)
w.grid_propagate() 延伸部件的大小, 内置为 1, 0 则不延伸
w.grid_remove() 隐藏部件, 但其原有的grid选项仍会保留, grid()会再度显示部件
w.grid_size() 返回部件的水平及垂直的格子数 (columnspan, rowspan)
w.grid_slaves(row=None, column=None) 返回在某格子 (row, column) 中的部件列表, None 表示无部件

视窗尺寸变化时, 部件的尺寸变化由父部份的表格设置而定.

w.columnconfigure(N, option=value, ...) 设置 column N 选项
w.rowconfigure(N, option=value, ...) 设置 row N 选项

选项如下所示

minsize 点素的最小尺寸, 在没有部件时, 仍然会不显示.
pad 对最大的格子提供额外的间距
weight 延伸格子更多的空间, 单位为 1/4 或 1/5 尺寸, 未確認

注: 要能在视窗尺寸变化时延伸部件, 必须在父部件中, 以 columnconfigurerowconfigure 设置 weight 选项, 在部件中也必须在 grid 方法中设置 sticky 可延伸.

部件常用的选项

  1. 尺寸 Dimension

    • integer 点素
    • string 整数与单位
      • c - 厘米
      • i - 英吋
      • m - 毫米
      • p - 打印机点 (约 1/72吋)
  2. 座标 Coordinate

    • 左上角为 (0, 0)
    • 右方为正 x 轴
    • 下方为正 y 轴
  3. 颜色 color

    • 前置 '#' 的十六进位字符串, '#rgb', '#rrggbb', '#rrrgggbbb', r, g, b 为红, 绿, 蓝.
    • 标准颜色名, 如 'white', 'black', 'red', 'green', 'magenta', …
      请参考 www.tcl.tk/man/tcl8.5/TkCmd/colors....
  4. 字体 font

    • ('family', size, 'style'), 如 ('Courier New', 12, 'bold'), style 可以是 'bold' (粗体), 'italic' (斜体), 'underline' (下底线), 'overstrike' (删除线) 的组合.

    • 使用 tkinter 的 font. 如

      from tkinter import font as Font
      font = Font.Font(option) # 必须要有主视窗建立才能调用
    • tkinter.font 的选项

      family 字体系列字符串
      size 字体高度, 正值为点数, 负值为点素
      weight 粗体字或一般字, 'bold' 或 'normal'
      slant 斜体字或一般字, 'italic' 或 'roman'
      underline 下底线, 0 或 1
      overstrike 删除线, 0 或 1
    • X window 系统中, 可以使用 X 字体名

    • 可以使用 tkinter.font.families() 取得可用的字体系列字符串, 必须要有主视窗建立才能调用.

    • Font 对像的方法

      actual(option=None) 返回 font 字典中的实际值, 可能内容会因无法使用, 而与设定值不同.
      cget(option) 返回选项值
      configure(option, ...) 改变选项值, 所有使用到该字体的部件会一起改变.
      copy() 复制一个 font 对像
      measure(text) 返回字符串的点素寛度, 斜体字可能会超出其寛度.
      metrics(option) 返回字体规格值的字典.

      字体规格

      ascent 基线到顶端的高度
      descent 基线到底端的高度
      fixed 固定宽度 (0) 或不同寛度 (1) 的字体
      linespace 全部的高度, 行高
  5. 定位 Anchors

    设定项目的位置, NW/N/NE/W/CENTER/E/SW/S/SE

ExePww8U7P.png!large

  1. 花边 Relief

    部件外部的花边, FLAT/RAISED/SUNKEN/GROOVE/RIDGE, 内定寛度为 2.

5O4zv3AtdX.png!large

  1. 点阵图 Bitmap

    选项- 'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question', and 'warning'. 或者使用具有 X 点阵图格式文件'@pathname'

egUrYe6mJQ.png!large

  1. Cursor 鼠标图形

    可用图形很多, 请参考 Tkinter 文件

  2. Image 图片

    • xbm 点阵图格式使用 tkinter.BitmapImage.

      tk.BitmapImage(file=f[, background=b][, foreground=c])

      预设 foreground 为 black pixels, background 为 transparent.

    • gif, pgm and ppm 使用 tkinter.PhotoImage.

      tk.PhotoImage(file=f)
    • 更多格式的图片, 可以使用 ImageTk

  3. 几何尺寸 Geometry 'WxH±x±y'

    顶层视窗的尺寸及位置以点素为单位, 正值的 x/y 为左上, 负值的 x/y 为右下.

  4. 视窗名称 Window name

    顶层视窗与根视窗是互相独立的, 前者可以有无数个, 但后者只能有一个. 直接视窗名如".parent.child", 相对视窗名则不含根视窗, 或者也没有父视窗, 如"child". parent 以及child 都是整数. str(w) 可以取得部件的路径名.

  5. 线头与接点 Cap and join

    • Cap - 线头
      BUT/PROJECTING/ROUND
    • Join - 线与线的接点
      ROUND/BEVEL/MITER

RI0OA3WQyV.png!large

  1. 点线的样式 Dash pattern

    • dash = (n1, …) 前整数为画点数, 后整数为不画点数, 重复该动作, 并重其内容来画所有的线长
    • dashoff = n, 代表 dash 项的第一个参数, 前 n 个点略过, 不是不画, 而是点数变少.
  2. 点阵图的对齐 Stipple pattern match

    • offset - 区域的调整偏差
    • outlineoffset - 轮廓的调整偏差
    • ‘x,y’ 绝对的偏差点
    • ‘#x,y’ 相对的偏差点
    • 偏差的参考点 tk.NE, tk.SE, tk.NW, tk.SW, tk.N, tk.E, tk.S, tk.W, tk.CENTER

S2wmUaAoe9.png!large

本作品采用《CC 协议》,转载必须注明作者和本文链接
Jason Yang
讨论数量: 2

你好,请问为何在尝试使用rowconfigurecolumnconfigure设置缩放时,只有第一个按钮能够随窗口缩放,第二个却只能在y轴上缩放。另外,两个按钮明明占据了相同的列数,为什么显示出的大小却不一样?

file

file 这是我的代码

window = tk.Tk()

window.columnconfigure(0, weight=1)
window.rowconfigure(0, weight=1)

tk.Button(window, text="备份").grid(
    row=0, column=0, sticky=tk.NSEW)
tk.Button(window, text="还原").grid(
    row=0, column=2,sticky=tk.NSEW)

window.mainloop()
6个月前 评论
Jason990420

w.columnconfigure(N, option=value, …) # 设置 column N 选项

只有第一个按钮 (column=0) 设置了

window.columnconfigure(0, weight=1)

没设置 column=2 的第二个按钮

window.columnconfigure(2, weight=1)

完整代码

import tkinter as tk

window = tk.Tk()

window.columnconfigure(0, weight=1) # column 0, 按钮 1
window.columnconfigure(2, weight=1) # 新增这一行 for column 2, 按钮 2
window.rowconfigure(0, weight=1)

tk.Button(window, text="备份").grid(row=0, column=0, sticky=tk.NSEW)
tk.Button(window, text="还原").grid(row=0, column=2, sticky=tk.NSEW)

window.mainloop()

file

另外, 你可以改变 weight 来调整其相对的大小, 1 相当 (1+1/4) 大小, 4 相当于 (1+4/4) = 2 倍大小

6个月前 评论
fqwl 6个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!