Python - Tkinter 学习笔记

第一章 初识Tkinter 


        

目录

第一章 初识Tkinter 

前言

一、Tkinter 是什么?

二、学习内容

1. 第一个 Tkinter 程序

​编辑

2 程序说明

二、Tkinter 基本组件

2.1 标签 (Label)

基本参数

外观参数

文本布局参数

状态参数

事件绑定参数

其他参数

​编辑

2.2 按钮 (Button)

基本参数

外观参数

状态参数

按钮状态变化参数

事件绑定参数

其他参数

2.3 输入框 (Entry)

基本参数

外观参数

状态参数

文本对齐参数

输入限制参数

其他参数

​编辑

2.4 文本框 (Text)

基本参数

外观参数

滚动和换行参数

状态参数

文本选择和插入参数

其他参数

​编辑

文本操作方法

​编辑

三、布局管理器

3.1 pack () 布局

pack () 布局的工作原理

几何控制参数

间距控制参数

对齐控制参数

其他参数

实例1:

实例2:

​编辑

pack () 布局的优缺点

3.2 grid () 布局

grid () 布局的工作原理

网格定位参数

对齐和填充参数

间距控制参数

权重参数(控制列 / 行的扩展比例)

其他参数

示例1

grid () 布局的优缺点

3.3 place () 布局

place () 布局的工作原理

绝对定位参数

相对定位参数

对齐参数

堆叠顺序参数

示例1

​编辑

示例2

​编辑

place () 布局的优缺点

总结



前言

        在当今数字化的时代,图形用户界面(GUI)已经成为软件不可或缺的一部分。无论是日常使用的办公软件、娱乐应用,还是专业的开发工具,GUI 都为用户提供了直观、便捷的交互方式。对于 Python 开发者来说,Tkinter 是一个理想的入门选择,它是 Python 的标准 GUI 库,无需额外安装,简单易用,却又功能强大。

        本学习笔记旨在帮助初学者系统地掌握 Tkinter 的基础知识和应用技巧。通过详细的讲解和丰富的案例,你将学会如何创建窗口、添加各种界面元素、管理布局、处理用户事件,以及开发完整的 GUI 应用程序。从简单的 "Hello World" 程序到复杂的文件浏览器,每一个案例都经过精心设计,由浅入深,逐步引导你掌握 Tkinter 的核心概念和技术。

        特别值得一提的是,每个小节都配有代码示例,这些示例不仅注解清晰,易于理解,还具有很强的实用性。你可以直接运行这些代码,观察效果,也可以在此基础上进行修改和扩展,快速实现自己的想法。通过这种实践性的学习方式,你将更加高效地掌握 Tkinter 编程技能。        

无论你是 Python 编程的新手,还是有一定经验的开发者,希望通过本学习笔记,你能够轻松入门 Tkinter,开发出美观、实用的 GUI 应用程序。让我们一起开启这段有趣的编程之旅吧!


一、Tkinter 是什么?

        Tkinter 是 Python 的标准 GUI(图形用户界面)库,它提供了创建窗口、按钮、文本框等各种界面元素的功能。使用 Tkinter 可以快速开发跨平台的桌面应用程序,无需额外安装其他库。

二、学习内容

1. 第一个 Tkinter 程序

代码如下(示例):

import tkinter as tk

# 创建主窗口
root = tk.Tk()
root.title("第一个Tkinter程序")  # 设置窗口标题
root.geometry("300x200")  # 设置窗口大小,格式为宽度x高度

# 创建标签
label = tk.Label(root, text="欢迎使用Tkinter!", font=("Arial", 12))
label.pack(pady=20)  # 将标签放置在窗口中,并设置垂直间距

# 创建按钮
button = tk.Button(root, text="点击我", command=lambda: print("按钮被点击了!"))
button.pack(pady=10)  # 将按钮放置在窗口中,并设置垂直间距

# 进入主事件循环
root.mainloop()

2 程序说明

这个程序展示了 Tkinter 的基本结构:

  • 导入 tkinter 模块
  • 创建主窗口(tk.Tk()
  • 添加界面元素(标签、按钮等)
  • 使用布局管理器(如pack())将元素放置在窗口中
  • 进入主事件循环(mainloop()

二、Tkinter 基本组件

2.1 标签 (Label)

示例1

import tkinter as tk

root = tk.Tk()
root.title("Label参数示例")

# 创建一个包含多种参数的标签
label = tk.Label(
    root,
    text="这是一个多行文本标签\n支持自动换行和对齐",
    font=("SimHei", 12),
    fg="white",
    bg="blue",
    width=30,
    height=5,
    padx=10,
    pady=5,
    relief=tk.RAISED,
    bd=2,
    anchor=tk.NW,  # 文本左上角对齐
    justify=tk.LEFT,  # 左对齐
    wraplength=200,  # 200像素后自动换行
    cursor="hand2",  # 鼠标悬停时显示手型
    activebackground="red",  # 鼠标悬停时背景变红
    disabledforeground="gray"  # 禁用时文本变灰
)
label.pack(pady=20)

# 测试状态变化
def toggle_state():
    label.config(state=tk.DISABLED if label["state"] == tk.NORMAL else tk.NORMAL)

tk.Button(root, text="切换状态", command=toggle_state).pack()

root.mainloop()

详细的参数介绍:

基本参数

  1. master

    • 说明:父窗口或容器,即该标签所属的窗口或框架。
    • 示例root = tk.Tk(); label = tk.Label(root)
  2. text

    • 说明:显示的文本内容。
    • 示例text="Hello, Tkinter!"
  3. textvariable

    • 说明:关联一个 StringVar 对象,用于动态更新文本。
    • 示例
      var = tk.StringVar()
      var.set("动态文本")
      label = tk.Label(root, textvariable=var)
      
  4. image

    • 说明:显示的图像(需使用 tk.PhotoImage 或 PIL.ImageTk.PhotoImage)。
    • 示例
      photo = tk.PhotoImage(file="image.png")
      label = tk.Label(root, image=photo)
      
  5. compound

    • 说明:当同时设置 text 和 image 时,指定文本和图像的组合方式。
    • 可选值
      • tk.NONE(默认,只显示图像)
      • tk.TOP(文本在图像上方)
      • tk.BOTTOM(文本在图像下方)
      • tk.LEFT(文本在图像左侧)
      • tk.RIGHT(文本在图像右侧)
      • tk.CENTER(文本覆盖在图像中央)

外观参数

  1. font

    • 说明:文本字体,可指定为元组 (字体名称, 大小, 样式) 或字体对象。
    • 示例
      font=("SimHei", 12, "bold")  # 黑体,12号,加粗
      font=tk.font.Font(family="Arial", size=10, slant="italic")
      
  2. fg(foreground)

    • 说明:文本颜色,可使用颜色名称(如 "red")或十六进制值(如 "#FF0000")。
  3. bg(background)

    • 说明:背景颜色。
  4. width 和 height

    • 说明:标签的宽度和高度。
    • 单位
      • 若显示文本,单位为字符(默认)。
      • 若显示图像,单位为像素。
    • 示例width=10, height=2(10 个字符宽,2 行高)
  5. padx 和 pady

    • 说明:标签内容与边界的水平 / 垂直间距(内边距),单位为像素。
  6. relief

    • 说明:边框样式。
    • 可选值
      • tk.FLAT(平的,默认)
      • tk.RAISED(凸起)
      • tk.SUNKEN(凹陷)
      • tk.GROOVE(凹槽)
      • tk.RIDGE(脊状)
  7. bd(borderwidth)

    • 说明:边框宽度,单位为像素。
  8. highlightbackground 和 highlightcolor

    • 说明:当标签获得焦点时,焦点边框的背景色和颜色。
  9. highlightthickness

    • 说明:焦点边框的厚度。

文本布局参数

  1. anchor

    • 说明:文本在标签内的对齐方式(当标签空间大于文本时)。
    • 可选值
      • tk.Ntk.NEtk.Etk.SEtk.Stk.SWtk.Wtk.NWtk.CENTER(默认)
  2. justify

    • 说明:多行文本的对齐方式。
    • 可选值tk.LEFT(左对齐)、tk.CENTER(居中)、tk.RIGHT(右对齐)。
  3. wraplength

    • 说明:文本自动换行的宽度(单位为像素)。

状态参数

  1. state

    • 说明:标签的状态。
    • 可选值
      • tk.NORMAL(正常)
      • tk.DISABLED(禁用,文本变灰且不可交互)
  2. cursor

    • 说明:鼠标悬停在标签上时的光标样式(如 "hand2" 表示手型)。

事件绑定参数

  1. takefocus
    • 说明:是否可以通过 Tab 键聚焦到该标签。
    • 默认False(标签通常不参与焦点导航)

其他参数

  1. bitmap

    • 说明:显示内置位图(如 "error""hourglass" 等),但已逐渐被 image 参数取代。
  2. activebackground 和 activeforeground

    • 说明:鼠标悬停在标签上时的背景色和文本颜色。
  3. disabledforeground

    • 说明:标签禁用时的文本颜色。

示例2

import tkinter as tk

root = tk.Tk()
root.title("标签示例")
root.geometry("300x150")

# 创建一个标签,显示文本
label1 = tk.Label(root, text="普通文本标签", fg="black", bg="white")
label1.pack(pady=10)

# 创建一个带属性的标签
label2 = tk.Label(root, 
                 text="带属性的标签", 
                 font=("SimHei", 14),  # 设置字体和大小
                 fg="white",  # 前景色(文本颜色)
                 bg="blue",  # 背景色
                 width=20,  # 宽度
                 height=2)  # 高度
label2.pack(pady=10)

root.mainloop()

代码解释

这段代码创建了两个标签:

普通文本标签

  • 使用默认字体和样式
  • 前景色为黑色,背景色为白色
  • 通过pack(pady=10)设置了垂直间距

带属性的标签

  • 指定了字体为 "SimHei"(黑体),大小为 14
  • 文本颜色为白色,背景色为蓝色
  • 设置了宽度和高度
  • 同样通过pack(pady=10)设置了垂直间距

扩展这个示例,可以考虑以下几点:

  1. 添加更多属性:如anchor(文本对齐方式)、padx/pady(内边距)、wraplength(文本自动换行宽度)等

  2. 动态更新标签:添加按钮来改变标签的文本或颜色

  3. 使用不同的字体和样式:尝试不同的字体、大小和粗细

  4. 添加图片标签:除了文本,标签还可以显示图片

2.2 按钮 (Button)

在 Tkinter 中,Button 组件用于创建可点击的按钮,用户点击后会触发指定的操作

示例1

import tkinter as tk

root = tk.Tk()
root.title("Button参数示例")

# 创建一个包含多种参数的按钮
button = tk.Button(
    root,
    text="点击或悬停",
    font=("SimHei", 12),
    fg="white",
    bg="blue",
    width=15,
    height=2,
    padx=10,
    pady=5,
    relief=tk.RAISED,
    bd=3,
    cursor="hand2",
    activebackground="red",  # 鼠标悬停时变红
    activeforeground="yellow",  # 鼠标悬停时文本变黄
    disabledforeground="gray",  # 禁用时文本变灰
    command=lambda: print("按钮被点击!")
)
button.pack(pady=20)

# 测试状态变化
def toggle_state():
    button.config(state=tk.DISABLED if button["state"] == tk.NORMAL else tk.NORMAL)

tk.Button(root, text="切换按钮状态", command=toggle_state).pack()

root.mainloop()

以下是Button 类的全部参数及其详细说明:

基本参数

  1. master

    • 说明:父窗口或容器,即该按钮所属的窗口或框架。
    • 示例root = tk.Tk(); button = tk.Button(root)
  2. text

    • 说明:按钮上显示的文本内容。
    • 示例text="点击我"
  3. textvariable

    • 说明:关联一个 StringVar 对象,用于动态更新按钮文本。
    • 示例
      var = tk.StringVar()
      var.set("动态按钮")
      button = tk.Button(root, textvariable=var)
      
  4. image

    • 说明:按钮上显示的图像(需使用 tk.PhotoImage 或 PIL.ImageTk.PhotoImage)。
    • 示例
      photo = tk.PhotoImage(file="button.png")
      button = tk.Button(root, image=photo)
      
  5. compound

    • 说明:当同时设置 text 和 image 时,指定文本和图像的组合方式。
    • 可选值
      • tk.NONE(默认,只显示图像)
      • tk.TOP(文本在图像上方)
      • tk.BOTTOM(文本在图像下方)
      • tk.LEFT(文本在图像左侧)
      • tk.RIGHT(文本在图像右侧)
      • tk.CENTER(文本覆盖在图像中央)
  6. command

    • 说明:按钮被点击时调用的函数或方法。
    • 示例
      def on_click():
          print("按钮被点击!")
      button = tk.Button(root, command=on_click)
      

外观参数

  1. font

    • 说明:文本字体,可指定为元组 (字体名称, 大小, 样式) 或字体对象。
    • 示例

      font=("SimHei", 12, "bold")  # 黑体,12号,加粗
      
  2. fg(foreground)

    • 说明:文本颜色,可使用颜色名称(如 "red")或十六进制值(如 "#FF0000")。
  3. bg(background)

    • 说明:背景颜色。
  4. width 和 height

    • 说明:按钮的宽度和高度。
    • 单位
      • 若显示文本,单位为字符(默认)。
      • 若显示图像,单位为像素。
    • 示例width=10, height=2(10 个字符宽,2 行高)
  5. padx 和 pady

    • 说明:按钮内容与边界的水平 / 垂直间距(内边距),单位为像素。
  6. relief

    • 说明:边框样式。
    • 可选值
      • tk.FLAT(平的)
      • tk.RAISED(凸起,默认)
      • tk.SUNKEN(凹陷)
      • tk.GROOVE(凹槽)
      • tk.RIDGE(脊状)
  7. bd(borderwidth)

    • 说明:边框宽度,单位为像素。
  8. highlightbackground 和 highlightcolor

    • 说明:当按钮获得焦点时,焦点边框的背景色和颜色。
  9. highlightthickness

    • 说明:焦点边框的厚度。

状态参数

  1. state

    • 说明:按钮的状态。
    • 可选值
      • tk.NORMAL(正常,可点击)
      • tk.DISABLED(禁用,变灰且不可点击)
  2. cursor

    • 说明:鼠标悬停在按钮上时的光标样式(如 "hand2" 表示手型)。

按钮状态变化参数

  1. activebackground 和 activeforeground

    • 说明:鼠标按下或悬停在按钮上时的背景色和文本颜色。
  2. disabledforeground

    • 说明:按钮禁用时的文本颜色。
  3. pressed

    • 说明:按钮被按下时的状态样式(通过 relief 参数控制)。

事件绑定参数

  1. takefocus

    • 说明:是否可以通过 Tab 键聚焦到该按钮。
    • 默认True(按钮可通过 Tab 键选中)
  2. command

    • 说明:按钮被点击时调用的函数或方法。
    • 示例
      def on_click():
          print("按钮被点击!")
      button = tk.Button(root, command=on_click)
      

其他参数

  1. bitmap

    • 说明:显示内置位图(如 "error""hourglass" 等),但已逐渐被 image 参数取代。
  2. overrelief

    • 说明:鼠标悬停在按钮上时的边框样式(默认与 relief 相同)。
  3. repeatdelay 和 repeatinterval

    • 说明:当按钮被长按(按住不放)时,重复触发 command 的延迟时间(毫秒)和间隔时间。
    • 示例
      # 长按200ms后开始每100ms触发一次command
      button = tk.Button(root, repeatdelay=200, repeatinterval=100)

示例2

import tkinter as tk

def say_hello():
    label.config(text="Hello, Tkinter!")

root = tk.Tk()
root.title("按钮示例")
root.geometry("300x200")

# 创建标签
label = tk.Label(root, text="点击按钮打招呼", font=("Arial", 12))
label.pack(pady=20)

# 创建按钮,点击时调用say_hello函数
button1 = tk.Button(root, text="打招呼", command=say_hello)
button1.pack(pady=10)

# 创建一个有状态的按钮
button2 = tk.Button(root, 
                   text="禁用按钮", 
                   state=tk.DISABLED,  # 设置按钮状态为禁用
                   bg="gray")
button2.pack(pady=10)

root.mainloop()

2.3 输入框 (Entry)

        在 Tkinter 中,Entry 组件用于创建单行文本输入框,用户可以在其中输入和编辑文本。以下是 Entry 类的全部参数及其详细说明:

基本参数

  1. master

    • 说明:父窗口或容器,即该输入框所属的窗口或框架。
    • 示例root = tk.Tk(); entry = tk.Entry(root)
  2. width

    • 说明:输入框的宽度,以字符为单位。
    • 示例width=20(可显示 20 个字符)
  3. textvariable

    • 说明:关联一个 StringVar 对象,用于动态获取或设置输入框的内容。
    • 示例
      var = tk.StringVar()
      entry = tk.Entry(root, textvariable=var)
      var.set("初始文本")  # 设置内容
      print(var.get())    # 获取内容
      
  4. show

    • 说明:指定输入时显示的字符(常用于密码输入)。
    • 示例show="*"(输入的内容会显示为星号)

外观参数

  1. font

    • 说明:文本字体,可指定为元组 (字体名称, 大小, 样式) 或字体对象。
    • 示例
      font=("SimHei", 12)  # 黑体,12号
      
  2. fg(foreground)

    • 说明:文本颜色,可使用颜色名称(如 "red")或十六进制值(如 "#FF0000")。
  3. bg(background)

    • 说明:背景颜色。
  4. bd(borderwidth)

    • 说明:边框宽度,单位为像素。
  5. relief

    • 说明:边框样式。
    • 可选值
      • tk.FLAT(平的)
      • tk.RAISED(凸起)
      • tk.SUNKEN(凹陷)
      • tk.GROOVE(凹槽)
      • tk.RIDGE(脊状)
  6. highlightbackground 和 highlightcolor

    • 说明:当输入框获得焦点时,焦点边框的背景色和颜色。
  7. highlightthickness

    • 说明:焦点边框的厚度。
  8. insertbackground

    • 说明:光标(插入点)的颜色。
  9. insertwidth

    • 说明:光标(插入点)的宽度,单位为像素。

状态参数

  1. state

    • 说明:输入框的状态。
    • 可选值
      • tk.NORMAL(正常,可编辑)
      • tk.DISABLED(禁用,不可编辑)
      • tk.READONLY(只读,可选择但不可编辑)
  2. cursor

    • 说明:鼠标悬停在输入框上时的光标样式(如 "hand2" 表示手型)。

文本对齐参数

  1. justify
    • 说明:文本在输入框内的对齐方式。
    • 可选值
      • tk.LEFT(左对齐,默认)
      • tk.CENTER(居中对齐)
      • tk.RIGHT(右对齐)

输入限制参数

  1. validate

    • 说明:指定何时验证输入内容。
    • 可选值
      • 'focus'(获得或失去焦点时)
      • 'focusin'(获得焦点时)
      • 'focusout'(失去焦点时)
      • 'key'(每次按键时)
      • 'all'(上述所有情况)
      • 'none'(不验证,默认)
  2. validatecommand

    • 说明:验证输入的函数,需返回 True 或 False
    • 示例

      def validate_input(new_text):
          return new_text.isdigit()  # 只允许输入数字
      
      vcmd = root.register(validate_input)  # 注册验证函数
      entry = tk.Entry(root, validate="key", validatecommand=(vcmd, '%P'))
      
       
      • '%P' 是传递给验证函数的参数,表示输入框的新内容。
  3. invalidcommand

    • 说明:当验证失败时调用的函数。

其他参数

  1. selectbackground 和 selectforeground

    • 说明:选中文本的背景色和前景色。
  2. selectborderwidth

    • 说明:选中文本的边框宽度。
  3. takefocus

    • 说明:是否可以通过 Tab 键聚焦到该输入框。
    • 默认True(输入框可通过 Tab 键选中)
  4. xscrollcommand

    • 说明:关联水平滚动条,用于处理文本超出输入框宽度的情况。

案例1:

import tkinter as tk

root = tk.Tk()
root.title("Entry参数示例")

# 创建一个包含多种参数的输入框
entry = tk.Entry(
    root,
    width=30,
    font=("SimHei", 12),
    fg="black",
    bg="white",
    bd=2,
    relief=tk.RIDGE,
    justify=tk.CENTER,  # 文本居中对齐
    insertbackground="red",  # 光标为红色
    highlightthickness=2,
    highlightcolor="blue",  # 聚焦时边框变蓝
)
entry.pack(pady=20)
entry.insert(0, "请输入文本...")  # 设置初始文本

# 验证输入(只允许输入数字)
def validate_input(new_text):
    return new_text.isdigit() or new_text == ""  # 允许为空

vcmd = root.register(validate_input)
entry_with_validation = tk.Entry(
    root,
    width=30,
    validate="key",
    validatecommand=(vcmd, '%P')
)
entry_with_validation.pack(pady=10)
entry_with_validation.insert(0, "只允许输入数字")

# 密码输入框
password_entry = tk.Entry(
    root,
    width=30,
    show="*"  # 显示为星号
)
password_entry.pack(pady=10)
password_entry.insert(0, "password")

# 禁用的输入框
disabled_entry = tk.Entry(
    root,
    width=30,
    state=tk.DISABLED
)
disabled_entry.pack(pady=10)
disabled_entry.insert(0, "禁用状态")

# 显示输入内容
def show_content():
    print(f"输入内容: {entry.get()}")

tk.Button(root, text="获取内容", command=show_content).pack(pady=10)

root.mainloop()

案例2:

import tkinter as tk

def show_input():
    text = entry.get()  # 获取输入框中的文本
    label.config(text=f"你输入的是: {text}")

root = tk.Tk()
root.title("输入框示例")
root.geometry("300x200")

# 创建标签
label = tk.Label(root, text="请输入一些文本", font=("Arial", 12))
label.pack(pady=10)

# 创建输入框
entry = tk.Entry(root, width=30)
entry.pack(pady=10)

# 创建按钮,点击时显示输入框中的文本
button = tk.Button(root, text="显示输入", command=show_input)
button.pack(pady=10)

root.mainloop()

2.4 文本框 (Text)

        在 Tkinter 中,Text 组件用于创建多行文本输入区域,支持文本编辑、格式化和滚动。以下是 Text 类的全部参数及其详细说明:

基本参数

  1. master

    • 说明:父窗口或容器,即该文本框所属的窗口或框架。
    • 示例root = tk.Tk(); text = tk.Text(root)
  2. width 和 height

    • 说明:文本框的宽度和高度,以字符为单位。
    • 示例width=40, height=10(40 个字符宽,10 行高)

外观参数

  1. font

    • 说明:文本字体,可指定为元组 (字体名称, 大小, 样式) 或字体对象。
    • 示例
      font=("SimHei", 12)  # 黑体,12号
      
  2. fg(foreground)

    • 说明:文本颜色,可使用颜色名称(如 "red")或十六进制值(如 "#FF0000")。
  3. bg(background)

    • 说明:背景颜色。
  4. bd(borderwidth)

    • 说明:边框宽度,单位为像素。
  5. relief

    • 说明:边框样式。
    • 可选值
      • tk.FLAT(平的)
      • tk.RAISED(凸起)
      • tk.SUNKEN(凹陷)
      • tk.GROOVE(凹槽)
      • tk.RIDGE(脊状)
  6. highlightbackground 和 highlightcolor

    • 说明:当文本框获得焦点时,焦点边框的背景色和颜色。
  7. highlightthickness

    • 说明:焦点边框的厚度。
  8. padx 和 pady

    • 说明:文本内容与边框的水平 / 垂直间距(内边距),单位为像素。

滚动和换行参数

  1. wrap

    • 说明:文本换行方式。
    • 可选值
      • tk.CHAR(按字符自动换行,默认)
      • tk.WORD(按单词自动换行)
      • tk.NONE(不自动换行,需水平滚动)
  2. xscrollcommand 和 yscrollcommand

    • 说明:关联水平 / 垂直滚动条,用于处理文本超出显示区域的情况。
    • 示例
      scrollbar = tk.Scrollbar(root)
      text = tk.Text(root, yscrollcommand=scrollbar.set)
      scrollbar.config(command=text.yview)
      

状态参数

  1. state

    • 说明:文本框的状态。
    • 可选值
      • tk.NORMAL(正常,可编辑)
      • tk.DISABLED(禁用,不可编辑,但可显示文本)
  2. cursor

    • 说明:鼠标悬停在文本框上时的光标样式(如 "hand2" 表示手型)。

文本选择和插入参数

  1. selectbackground 和 selectforeground

    • 说明:选中文本的背景色和前景色。
  2. selectborderwidth

    • 说明:选中文本的边框宽度。
  3. insertbackground

    • 说明:光标(插入点)的颜色。
  4. insertwidth

    • 说明:光标(插入点)的宽度,单位为像素。
  5. insertofftime 和 insertontime

    • 说明:光标闪烁的关闭时间和开启时间(毫秒)。

其他参数

  1. undo

    • 说明:是否支持撤销 / 重做操作。
    • 示例undo=True(启用撤销功能)
  2. maxundo

    • 说明:最大撤销步数(当 undo=True 时有效)。
  3. autoseparators

    • 说明:是否自动添加撤销分隔符(当 undo=True 时有效)。
  4. takefocus

    • 说明:是否可以通过 Tab 键聚焦到该文本框。
    • 默认True(文本框可通过 Tab 键选中)
  5. spacing1spacing2spacing3

    • 说明:控制文本行间距。
    • 参数
      • spacing1:行上方的额外间距(像素)。
      • spacing2:折叠行的额外间距(像素)。
      • spacing3:行下方的额外间距(像素)。

案例1:

import tkinter as tk

root = tk.Tk()
root.title("Text参数示例")

# 创建一个包含多种参数的文本框
text = tk.Text(
    root,
    width=40,
    height=10,
    font=("SimHei", 12),
    fg="black",
    bg="white",
    bd=2,
    relief=tk.GROOVE,
    padx=5,
    pady=5,
    wrap=tk.WORD,  # 按单词换行
    undo=True,     # 支持撤销操作
    insertbackground="red",  # 红色光标
    selectbackground="yellow",  # 黄色选中背景
)
text.pack(pady=20)

# 插入初始文本
text.insert(tk.END, "这是一个多行文本框示例\n"
                   "支持文本编辑、格式化和滚动。\n"
                   "你可以尝试输入、删除或选择文本。")

# 创建滚动条
scrollbar = tk.Scrollbar(root, command=text.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
text.config(yscrollcommand=scrollbar.set)

# 按钮功能:获取文本内容
def get_text():
    content = text.get("1.0", tk.END)  # 获取从第1行第0列到末尾的所有文本
    print("文本内容:")
    print(content)

# 按钮功能:清空文本
def clear_text():
    text.delete("1.0", tk.END)  # 删除从第1行第0列到末尾的所有文本

# 按钮功能:禁用/启用文本框
def toggle_state():
    if text["state"] == tk.NORMAL:
        text.config(state=tk.DISABLED)
        btn_toggle.config(text="启用编辑")
    else:
        text.config(state=tk.NORMAL)
        btn_toggle.config(text="禁用编辑")

# 创建按钮
btn_get = tk.Button(root, text="获取文本", command=get_text)
btn_get.pack(pady=5)

btn_clear = tk.Button(root, text="清空文本", command=clear_text)
btn_clear.pack(pady=5)

btn_toggle = tk.Button(root, text="禁用编辑", command=toggle_state)
btn_toggle.pack(pady=5)

root.mainloop()

文本操作方法

除了参数外,Text 组件还提供了丰富的方法来操作文本:

  • 插入文本text.insert(position, text)

    • 示例:text.insert("1.0", "Hello")(在第 1 行第 0 列插入文本)
  • 删除文本text.delete(start, end)

    • 示例:text.delete("1.0", "1.5")(删除第 1 行前 5 个字符)
  • 获取文本text.get(start, end)

    • 示例:text.get("1.0", tk.END)(获取所有文本)
  • 标记位置text.mark_set(mark_name, position)

    • 示例:text.mark_set("insert", "1.0")(将光标移到第 1 行第 0 列)
  • 添加标签text.tag_add(tag_name, start, end)

    • 示例:text.tag_add("highlight", "1.0", "1.5")(标记第 1 行前 5 个字符)
  • 配置标签样式text.tag_config(tag_name, options)

    • 示例:text.tag_config("highlight", background="yellow")(设置高亮背景)

案例2:

import tkinter as tk

def show_text():
    text = text_box.get("1.0", tk.END)  # 获取文本框中的所有内容
    label.config(text=f"你输入的是:\n{text}")

root = tk.Tk()
root.title("文本框示例")
root.geometry("400x300")

# 创建标签
label = tk.Label(root, text="请输入一些文本", font=("Arial", 12))
label.pack(pady=10)

# 创建文本框
text_box = tk.Text(root, width=40, height=10)
text_box.pack(pady=10)

# 在文本框中插入初始文本
text_box.insert(tk.END, "在这里输入多行文本...")

# 创建按钮,点击时显示文本框中的文本
button = tk.Button(root, text="显示文本", command=show_text)
button.pack(pady=10)

root.mainloop()

三、布局管理器

Tkinter 提供了三种主要的布局管理器:pack()grid()place()

3.1 pack () 布局

pack () 布局的工作原理

  1. 按添加顺序排列:组件按照 pack() 调用的顺序依次放置。
  2. 停靠方向:通过 side 参数控制组件停靠的方向(上、下、左、右)。
  3. 填充和扩展:通过 fill 和 expand 参数控制组件如何填充可用空间。
  4. 间距控制:通过 padxpadyipadxipady 参数调整组件间距。

  pack()是最简单的布局管理器,它按照添加的顺序将组件放置在父容器中。

在 Tkinter 中,pack() 是最简单的布局管理器,它按照添加组件的顺序将它们放置在父容器中。以下是 pack() 方法的全部参数及其详细说明:

几何控制参数

  1. side

    • 说明:指定组件停靠的方向。
    • 可选值
      • tk.TOP(顶部,默认)
      • tk.BOTTOM(底部)
      • tk.LEFT(左侧)
      • tk.RIGHT(右侧)
    • 示例
      button.pack(side=tk.LEFT)  # 组件靠左排列
      
  2. fill

    • 说明:指定组件在分配的空间内如何填充。
    • 可选值
      • tk.NONE(不填充,默认)
      • tk.X(水平填充)
      • tk.Y(垂直填充)
      • tk.BOTH(水平和垂直填充)
    • 示例

      label.pack(fill=tk.X)  # 组件水平方向填充可用空间
      
  3. expand

    • 说明:是否扩展父容器的额外空间给组件。
    • 可选值
      • False(不扩展,默认)
      • True(扩展)
    • 示例

      frame.pack(expand=True)  # 组件将获得父容器的额外空间
      

间距控制参数

  1. padx 和 pady

    • 说明:组件外部的水平 / 垂直间距(外边距),单位为像素。
    • 示例

      button.pack(padx=10, pady=5)  # 组件左右各留10px,上下各留5px
      
  2. ipadx 和 ipady

    • 说明:组件内部的水平 / 垂直间距(内边距),单位为像素。
    • 示例

      label.pack(ipadx=5, ipady=2)  # 组件内容与边框左右各留5px,上下各留2px
      

对齐控制参数

  1. anchor
    • 说明:组件在分配空间内的对齐方式。
    • 可选值
      • 方位字符串:tk.Ntk.NEtk.Etk.SEtk.Stk.SWtk.Wtk.NWtk.CENTER(默认)
    • 示例
      button.pack(anchor=tk.NW)  # 组件对齐到左上角
      

其他参数

  1. in_
    • 说明:指定将组件放置在哪个父容器的子组件中(需是同一父容器的子组件)。
    • 示例

      button.pack(in_=frame)  # 将按钮放置在frame内部
      

实例1:

    import tkinter as tk
    
    root = tk.Tk()
    root.title("Pack布局示例")
    root.geometry("400x300")
    
    # 示例1:side参数演示
    frame1 = tk.Frame(root, bg="lightgray", height=100)
    frame1.pack(fill=tk.X)
    
    tk.Label(frame1, text="TOP", bg="red").pack(side=tk.TOP)
    tk.Label(frame1, text="BOTTOM", bg="green").pack(side=tk.BOTTOM)
    tk.Label(frame1, text="LEFT", bg="blue").pack(side=tk.LEFT)
    tk.Label(frame1, text="RIGHT", bg="yellow").pack(side=tk.RIGHT)
    
    # 示例2:fill和expand参数演示
    frame2 = tk.Frame(root, bg="gray", height=100)
    frame2.pack(fill=tk.BOTH, expand=True, pady=10)
    
    tk.Label(frame2, text="fill=BOTH, expand=True", bg="cyan").pack(
        fill=tk.BOTH, expand=True, padx=20, pady=20
    )
    
    # 示例3:anchor参数演示
    frame3 = tk.Frame(root, bg="lightgray", height=100)
    frame3.pack(fill=tk.X, pady=10)
    
    tk.Label(frame3, text="NW", bg="purple").pack(anchor=tk.NW)
    tk.Label(frame3, text="SE", bg="orange").pack(anchor=tk.SE)
    
    # 示例4:padx/pady和ipadx/ipady参数演示
    frame4 = tk.Frame(root, bg="gray", height=100)
    frame4.pack(fill=tk.X, pady=10)
    
    tk.Label(frame4, text="外部间距(padx=20, pady=10)", bg="pink").pack(padx=20, pady=10)
    tk.Label(frame4, text="内部间距(ipadx=20, ipady=10)", bg="brown").pack(ipadx=20, ipady=10)
    
    root.mainloop()

    实例2:

    import tkinter as tk
    
    root = tk.Tk()
    root.title("pack布局示例")
    root.geometry("300x200")
    
    # 创建三个按钮,使用pack布局
    button1 = tk.Button(root, text="按钮1", bg="red")
    button1.pack(fill=tk.X, padx=10, pady=5)  # 水平填充
    
    button2 = tk.Button(root, text="按钮2", bg="green")
    button2.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)  # 水平和垂直填充并扩展
    
    button3 = tk.Button(root, text="按钮3", bg="blue")
    button3.pack(side=tk.BOTTOM, fill=tk.X, padx=10, pady=5)  # 放置在底部并水平填充
    
    root.mainloop()

    pack () 布局的优缺点

    • 优点

      • 简单易用,适合快速布局。
      • 适合简单的线性排列(水平或垂直)。
      • 与其他布局管理器(如 grid())可以混合使用。
    • 缺点

      • 难以实现复杂的网格布局。
      • 组件位置依赖于添加顺序,修改时可能需要调整多个组件。
      • 对于复杂界面,布局代码可能变得冗长且难以维护。

    3.2 grid () 布局

    grid()使用表格形式的网格来放置组件,通过指定行和列来确定位置。

    grid () 布局的工作原理

    1. 网格系统:使用 row 和 column 参数将组件放置在对应的单元格中。
    2. 跨越行列:通过 rowspan 和 columnspan 让组件占据多个单元格。
    3. 对齐方式:使用 sticky 参数控制组件在单元格内的对齐和填充方式。
    4. 扩展比例:通过 weight 参数设置列 / 行在窗口调整大小时的扩展比例。

    在 Tkinter 中,grid() 是一种强大的布局管理器,它使用网格系统(行和列)来排列组件。以下是 grid() 方法的全部参数及其详细说明:

    网格定位参数

    1. row 和 column

      • 说明:指定组件放置的行和列(从 0 开始计数)。
      • 示例

        label = tk.Label(root, text="姓名")
        label.grid(row=0, column=0)  # 放置在第1行第1列
        
    2. rowspan 和 columnspan

      • 说明:指定组件跨越的行数和列数。
      • 示例

        button = tk.Button(root, text="提交")
        button.grid(row=2, column=0, columnspan=2)  # 跨越2列
        

    对齐和填充参数

    1. sticky
      • 说明:控制组件在网格单元格内的对齐方式和填充方式。
      • 可选值
        • 方位字符串组合:tk.Ntk.Stk.Etk.W(或其组合,如 "nsew")。
      • 示例
        # 组件在单元格内水平和垂直方向都填充
        entry.grid(row=0, column=1, sticky="nsew")
        
        # 组件靠右对齐
        button.grid(row=1, column=1, sticky="e")
        

    间距控制参数

    1. padx 和 pady

      • 说明:组件外部的水平 / 垂直间距(外边距),单位为像素。
      • 示例
        label.grid(row=0, column=0, padx=5, pady=5)  # 组件四周各留5px间距
        
    2. ipadx 和 ipady

      • 说明:组件内部的水平 / 垂直间距(内边距),单位为像素。
      • 示例
        button.grid(row=1, column=0, ipadx=10, ipady=5)  # 组件内容与边框的间距
        

    权重参数(控制列 / 行的扩展比例)

    1. weight(通过父容器的 grid_rowconfigure() 和 grid_columnconfigure() 设置)
      • 说明:指定当窗口调整大小时,列 / 行的扩展比例。
      • 示例
        # 第0列在窗口扩展时获得2倍的空间
        root.grid_columnconfigure(0, weight=2)
        
        # 第1列在窗口扩展时获得1倍的空间
        root.grid_columnconfigure(1, weight=1)
        

    其他参数

    1. in_
      • 说明:指定将组件放置在哪个父容器的子组件中(需是同一父容器的子组件)。
      • 示例

        button.grid(in_=frame, row=0, column=0)  # 将按钮放置在frame内部

    示例1

    import tkinter as tk
    
    root = tk.Tk()
    root.title("Grid布局示例")
    root.geometry("400x300")
    
    # 配置列权重,使第1列和第2列在窗口扩展时按比例扩展
    root.grid_columnconfigure(0, weight=1)
    root.grid_columnconfigure(1, weight=2)
    
    # 配置行权重,使第2行在窗口扩展时获得更多空间
    root.grid_rowconfigure(2, weight=1)
    
    # 创建并放置组件
    tk.Label(root, text="用户名:", bg="lightblue").grid(
        row=0, column=0, sticky="e", padx=5, pady=5
    )
    tk.Entry(root).grid(
        row=0, column=1, sticky="ew", padx=5, pady=5
    )
    
    tk.Label(root, text="密码:", bg="lightblue").grid(
        row=1, column=0, sticky="e", padx=5, pady=5
    )
    tk.Entry(root, show="*").grid(
        row=1, column=1, sticky="ew", padx=5, pady=5
    )
    
    # 跨越两列的按钮
    tk.Button(root, text="登录", bg="green", fg="white").grid(
        row=2, column=0, columnspan=2, sticky="nsew", padx=5, pady=5
    )
    
    # 创建一个跨越多行多列的文本框
    tk.Text(root).grid(
        row=3, column=0, columnspan=2, rowspan=2,
        sticky="nsew", padx=5, pady=5
    )
    
    root.mainloop()

     

     示例2

    import tkinter as tk
    
    root = tk.Tk()
    root.title("grid布局示例")
    root.geometry("300x200")
    
    # 创建标签和输入框,使用grid布局
    tk.Label(root, text="用户名:").grid(row=0, column=0, sticky=tk.W, padx=10, pady=10)
    tk.Entry(root).grid(row=0, column=1, padx=10, pady=10)
    
    tk.Label(root, text="密码:").grid(row=1, column=0, sticky=tk.W, padx=10, pady=10)
    tk.Entry(root, show="*").grid(row=1, column=1, padx=10, pady=10)
    
    # 创建按钮
    tk.Button(root, text="登录").grid(row=2, column=0, sticky=tk.E, padx=10, pady=10)
    tk.Button(root, text="取消").grid(row=2, column=1, sticky=tk.W, padx=10, pady=10)
    
    root.mainloop()

     

    grid () 布局的优缺点

    优点

    • 适合创建表格状的布局(如表单、计算器等)。
    • 可以精确控制组件的位置和大小。
    • 支持窗口调整大小时的自适应扩展。

    缺点

    • 比 pack() 更复杂,需要考虑行列关系。
    • 若行列配置不当,可能导致布局混乱。
    • 不适合极复杂的嵌套布局(此时可考虑使用 frame 结合 grid())。

    3.3 place () 布局

    place()通过指定精确的坐标来放置组件,不推荐在复杂界面中使用。

    place () 布局的工作原理

    1. 绝对定位:通过 xywidthheight 直接指定组件的位置和大小。
    2. 相对定位:通过 relxrelyrelwidthrelheight 指定组件相对于父容器的比例位置和大小。
    3. 混合定位:可以同时使用绝对和相对参数(如 x=50, relwidth=0.5)。
    4. 对齐方式:使用 anchor 参数调整组件的对齐点。

            在 Tkinter 中,place() 是一种精确的布局管理器,允许你通过指定绝对坐标或相对位置来放置组件。以下是 place() 方法的全部参数及其详细说明:

    绝对定位参数

    1. x 和 y

      • 说明:组件左上角相对于父容器的绝对坐标(单位:像素)。
      • 示例
        label = tk.Label(root, text="固定位置")
        label.place(x=50, y=100)  # 距离父容器左边缘50px,上边缘100px
        
    2. width 和 height

      • 说明:组件的绝对宽度和高度(单位:像素)。
      • 示例
        button = tk.Button(root, text="固定大小")
        button.place(x=20, y=20, width=100, height=30)  # 宽100px,高30px
        

    相对定位参数

    1. relx 和 rely

      • 说明:组件左上角相对于父容器的相对坐标(范围:0.0~1.0)。
      • 示例
        # 组件位于父容器水平方向50%、垂直方向30%的位置
        label.place(relx=0.5, rely=0.3)
        
    2. relwidth 和 relheight

      • 说明:组件相对于父容器的相对宽度和高度(范围:0.0~1.0)。
      • 示例
        # 组件宽度为父容器宽度的50%,高度为父容器高度的20%
        frame.place(relx=0.1, rely=0.1, relwidth=0.5, relheight=0.2)
        

    对齐参数

    1. anchor
      • 说明:指定组件的哪个点与 xy 或 relxrely 所指定的位置对齐。
      • 可选值
        • 方位字符串:tk.Ntk.NEtk.Etk.SEtk.Stk.SWtk.Wtk.NWtk.CENTER(默认)。
      • 示例
        # 组件右上角与坐标(100, 50)对齐
        button.place(x=100, y=50, anchor=tk.NE)
        

    堆叠顺序参数

    1. bordermode

      • 说明:指定坐标计算时是否包含父容器的边框。
      • 可选值
        • tk.INSIDE(默认,坐标从父容器内边缘开始计算)
        • tk.OUTSIDE(坐标从父容器外边缘开始计算)
      • 示例
        label.place(x=10, y=10, bordermode=tk.INSIDE)
        
    2. in_

      • 说明:指定将组件放置在哪个父容器的子组件中(需是同一父容器的子组件)。
      • 示例
    button.place(in_=frame, x=5, y=5)  # 将按钮放置在frame内部

       示例1

      import tkinter as tk
      
      root = tk.Tk()
      root.title("Place布局示例")
      root.geometry("400x300")
      
      # 示例1:绝对定位
      tk.Label(root, text="绝对定位", bg="red").place(x=20, y=20, width=100, height=30)
      
      # 示例2:相对定位
      tk.Label(root, text="相对定位", bg="green").place(
          relx=0.5, rely=0.2, relwidth=0.3, relheight=0.1, anchor=tk.CENTER
      )
      
      # 示例3:混合定位
      tk.Label(root, text="混合定位", bg="blue").place(
          x=50, rely=0.5, width=120, relheight=0.2
      )
      
      # 示例4:使用anchor参数
      tk.Button(root, text="NW").place(x=100, y=100, anchor=tk.NW)
      tk.Button(root, text="SE").place(x=100, y=100, anchor=tk.SE)
      
      # 示例5:相对父容器大小动态调整
      frame = tk.Frame(root, bg="gray")
      frame.place(relx=0.1, rely=0.6, relwidth=0.8, relheight=0.3)
      
      tk.Label(frame, text="动态调整大小", bg="yellow").place(
          relx=0.1, rely=0.1, relwidth=0.8, relheight=0.8
      )
      
      root.mainloop()

      示例2

      import tkinter as tk
      
      root = tk.Tk()
      root.title("place布局示例")
      root.geometry("300x200")
      
      # 创建几个标签,使用place布局
      tk.Label(root, text="标签1", bg="red").place(x=50, y=30, width=100, height=30)
      tk.Label(root, text="标签2", bg="green").place(x=120, y=70, width=100, height=30)
      tk.Label(root, text="标签3", bg="blue").place(x=80, y=120, width=100, height=30)
      
      root.mainloop()

      place () 布局的优缺点

      • 优点

        • 精确控制组件的位置和大小。
        • 适合创建固定尺寸的界面(如游戏、图形编辑器)。
        • 当窗口调整大小时,组件不会自动调整位置,适合需要固定布局的场景。
      • 缺点

        • 不支持窗口自适应(窗口调整大小时,组件位置不会自动更新)。
        • 布局代码复杂,尤其是在处理多个组件时。
        • 若父容器大小改变,可能导致组件重叠或布局混乱。


      总结

              前三章介绍了 Tkinter 的基础概念、常用组件以及三种布局管理器。学会了如何创建简单的 GUI 应用,配置各种组件的属性,以及使用不同的布局方式来组织界面。这些知识是进一步开发复杂 GUI 应用的基础。

      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包

      打赏作者

      寄思~

      你的鼓励将是我创作的最大动力

      ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
      扫码支付:¥1
      获取中
      扫码支付

      您的余额不足,请更换扫码支付或充值

      打赏作者

      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值