杰瑞科技汇

Python Tkinter教程,从零开始学吗?

Python Tkinter 完整教程

目录

  1. Tkinter 简介
    • 什么是 Tkinter?
    • 为什么选择 Tkinter?
    • Tkinter 的核心概念
  2. 你的第一个 Tkinter 程序
    • import tkinter
    • 创建主窗口 (Tk)
    • 添加一个简单的组件 (Label)
    • 运行主事件循环 (mainloop)
  3. Tkinter 核心组件详解
    • 标签 (Label)
    • 按钮 (Button)
    • 输入框 (Entry)
    • 文本框 (Text)
    • 框架 (Frame)
    • 单选按钮 (Radiobutton)
    • 复选框 (Checkbutton)
    • 列表框 (Listbox)
    • 滚动条 (Scrollbar)
    • 菜单 (Menu)
    • 画布 (Canvas)
  4. 布局管理器
    • pack() - 简单打包布局
    • grid() - 网格布局 (最常用)
    • place() - 绝对坐标布局
  5. 事件处理
    • command 选项
    • bind() 方法
  6. 进阶主题
    • 获取和设置组件值 (get(), set())
    • 对话框 (messagebox, filedialog)
    • 自定义样式 (ttk 模块)
  7. 综合实例:一个简单的记事本
  8. 总结与资源

Tkinter 简介

什么是 Tkinter?

Tkinter 是 Python 的标准 GUI(图形用户界面)库,它是对 Tcl/Tk GUI 工具包的 Python 接口,当你安装 Python 时,Tkinter 通常会一并安装,无需额外安装。

Python Tkinter教程,从零开始学吗?-图1
(图片来源网络,侵删)

为什么选择 Tkinter?

  • 简单易学:对于初学者来说,Tkinter 的 API 设计直观,上手非常快。
  • 跨平台:使用 Tkinter 开发的应用程序可以在 Windows、macOS 和 Linux 上运行,无需修改代码。
  • 内置库:无需使用 pip 安装,是 Python 的标准组成部分。
  • 文档丰富:拥有大量社区资源和官方文档。

Tkinter 的核心概念

  • Tk: 这是 Tkinter 的根对象,代表整个应用程序的主窗口。
  • Widget (组件): GUI 上的任何可见元素,如按钮、标签、输入框等。
  • Container (容器): 用于容纳其他组件的组件,如 FrameToplevel
  • Layout Manager (布局管理器): 负责决定组件在容器中的位置和大小,主要有 pack, grid, place 三种。

你的第一个 Tkinter 程序

让我们从一个经典的 "Hello, World!" 程序开始。

import tkinter as tk
# 1. 创建一个主窗口 (Tk)
# 这是所有 Tkinter 应用的起点
window = tk.Tk()
window.title("我的第一个窗口")
window.geometry("300x200") # 设置窗口大小为 300x200 像素
# 2. 创建一个组件 (Label)
# Label 是一个用于显示文本或图像的组件
# master 指定这个 Label 属于哪个窗口
hello_label = tk.Label(window, text="你好, Tkinter!", font=("Arial", 14))
# 3. 将组件放置到窗口中
# 使用 pack() 布局管理器,它会自动将组件堆叠起来
hello_label.pack(pady=20, padx=20) # pady/padx 添加上下/左右的内边距
# 4. 运行主事件循环
# 这行代码会启动 Tkinter 的事件循环,使窗口保持响应,等待用户操作(如点击、关闭)
# 如果没有这行代码,窗口会一闪而过
window.mainloop()

代码解释:

  1. import tkinter as tk: 导入 Tkinter 库,并使用 tk 作为别名,这是惯例。
  2. window = tk.Tk(): 创建一个 Tk 对象,这是我们的主窗口。
  3. window.title(...): 设置窗口的标题栏文本。
  4. window.geometry(...): 设置窗口的初始大小。
  5. tk.Label(...): 创建一个 Label 组件。window 是它的父容器,text 是它显示的文字。
  6. hello_label.pack(...): 使用 pack 布局管理器将 Label 组件放入窗口中。
  7. window.mainloop(): 启动事件循环,让程序持续运行,直到用户关闭窗口。

Tkinter 核心组件详解

按钮 (Button)

按钮用于触发一个动作。

import tkinter as tk
window = tk.Tk()
window.title("按钮示例")
def on_button_click():
    print("按钮被点击了!")
    # 也可以在这里修改 Label 的文本
    label.config(text="按钮已被点击!")
label = tk.Label(window, text="点击下面的按钮")
label.pack(pady=10)
# command 参数指定一个函数,当按钮被点击时执行
button = tk.Button(window, text="点击我", command=on_button_click)
button.pack(pady=10)
window.mainloop()

输入框 (Entry)

用于单行文本输入。

Python Tkinter教程,从零开始学吗?-图2
(图片来源网络,侵删)
import tkinter as tk
window = tk.Tk()
window.title("输入框示例")
def show_input():
    # 获取 Entry 组件中的内容
    user_input = entry.get()
    print(f"你输入的是: {user_input}")
    label.config(text=f"你好, {user_input}!")
label = tk.Label(window, text="请输入你的名字:")
label.pack(pady=5)
# 创建一个 Entry 组件
entry = tk.Entry(window, width=30)
entry.pack(pady=5)
# 创建一个按钮来触发获取输入的操作
button = tk.Button(window, text="提交", command=show_input)
button.pack(pady=10)
window.mainloop()

文本框 (Text)

用于多行文本输入和显示,功能比 Entry 强大。

import tkinter as tk
window = tk.Tk()
window.title("文本框示例")
# 创建一个 Text 组件
text = tk.Text(window, height=10, width=40, wrap=tk.WORD)
text.pack(pady=10)
# 插入一些初始文本
text.insert(tk.END, "这是一个多行文本框,\n你可以在这里输入多行文本。")
# 添加一个按钮来获取文本内容
def get_text_content():
    content = text.get("1.0", tk.END) # "1.0" 表示第一行第0个字符,tk.END 表示到末尾
    print("文本框内容:")
    print(content)
button = tk.Button(window, text="获取文本", command=get_text_content)
button.pack(pady=5)
window.mainloop()

框架 (Frame)

Frame 是一个容器组件,用于将其他组件分组,使界面更有条理。

import tkinter as tk
window = tk.Tk()
window.title("框架示例")
# 创建一个顶部框架
top_frame = tk.Frame(window, bg="lightgray", height=50)
top_frame.pack(fill=tk.X) # fill=tk.X 让框架水平填充
# 在顶部框架中添加组件
tk.Label(top_frame, text="这是顶部框架", bg="lightgray").pack(pady=10)
# 创建一个底部框架
bottom_frame = tk.Frame(window, bg="lightblue")
bottom_frame.pack(fill=tk.BOTH, expand=True) # fill=tk.BOTH 并允许扩展
# 在底部框架中添加组件
tk.Label(bottom_frame, text="这是底部框架", bg="lightblue").pack(pady=10)
window.mainloop()

单选按钮 (Radiobutton) 和 复选框 (Checkbutton)

Radiobutton 用于在一组选项中单选,Checkbutton 用于多选。

import tkinter as tk
window = tk.Tk()
window.title("单选和复选框示例")
# --- 单选按钮 ---
selected_gender = tk.StringVar() # 使用 StringVar 来存储选中的值
tk.Label(window, text="性别:").pack()
tk.Radiobutton(window, text="男", variable=selected_gender, value="male").pack()
tk.Radiobutton(window, text="女", variable=selected_gender, value="female").pack()
# --- 复选框 ---
selected_hobbies = [] # 使用列表来存储选中的值
def update_hobbies():
    selected_hobbies.clear()
    if var1.get(): selected_hobbies.append("阅读")
    if var2.get(): selected_hobbies.append("运动")
    if var3.get(): selected_hobbies.append("音乐")
    print(f"你的爱好是: {', '.join(selected_hobbies)}")
var1 = tk.BooleanVar()
var2 = tk.BooleanVar()
var3 = tk.BooleanVar()
tk.Label(window, text="爱好:").pack(pady=(10, 0))
tk.Checkbutton(window, text="阅读", variable=var1, command=update_hobbies).pack()
tk.Checkbutton(window, text="运动", variable=var2, command=update_hobbies).pack()
tk.Checkbutton(window, text="音乐", variable=var3, command=update_hobbies).pack()
button = tk.Button(window, text="提交", command=update_hobbies)
button.pack(pady=10)
window.mainloop()

菜单 (Menu)

创建应用程序的菜单栏。

Python Tkinter教程,从零开始学吗?-图3
(图片来源网络,侵删)
import tkinter as tk
window = tk.Tk()
window.title("菜单示例")
# 创建一个菜单栏
menubar = tk.Menu(window)
# 创建一个 "文件" 菜单
file_menu = tk.Menu(menubar, tearoff=0) # tearoff=0 禁止菜单被拖出
file_menu.add_command(label="新建", command=lambda: print("新建文件"))
file_menu.add_command(label="打开", command=lambda: print("打开文件"))
file_menu.add_separator() # 添加分隔线
file_menu.add_command(label="退出", command=window.quit) # window.quit 用于关闭窗口
menubar.add_cascade(label="文件", menu=file_menu)
# 创建一个 "编辑" 菜单
edit_menu = tk.Menu(menubar, tearoff=0)
edit_menu.add_command(label="撤销", command=lambda: print("撤销"))
edit_menu.add_command(label="重做", command=lambda: print("重做"))
menubar.add_cascade(label="编辑", menu=edit_menu)
# 将菜单栏应用到窗口
window.config(menu=menubar)
window.mainloop()

布局管理器

pack() - 简单打包

pack() 是最简单的布局方式,它会按照组件创建的顺序,将它们堆叠(垂直或水平)起来。

  • side: 可以是 tk.TOP (默认), tk.BOTTOM, tk.LEFT, tk.RIGHT
  • fill: 可以是 tk.X (水平填充), tk.Y (垂直填充), tk.BOTH (双向填充) 或 None (默认)。
  • expand: TrueFalse,是否填充父容器中未使用的空间。
  • padx/pady: 外边距。
  • ipadx/ipady: 内边距。

grid() - 网格布局 (推荐)

grid() 将父容器划分为一个网格,你可以通过行号和列号来精确指定组件的位置,这是最灵活和最常用的布局方式。

  • row: 行号 (从 0 开始)。
  • column: 列号 (从 0 开始)。
  • rowspan: 跨越的行数。
  • columnspan: 跨越的列数。
  • sticky: 组件在网格单元格中的对齐方式,使用 tk.N, tk.S, tk.E, tk.W 及其组合(如 tk.NE, tk.W+tk.E)来指定。tk.W+tk.E 表示组件在水平方向上拉伸填满单元格。
import tkinter as tk
window = tk.Tk()
window.title("Grid 布局示例")
# 创建一个标签
tk.Label(window, text="用户名:").grid(row=0, column=0, sticky=tk.W, padx=5, pady=5)
tk.Label(window, text="密码:").grid(row=1, column=0, sticky=tk.W, padx=5, pady=5)
# 创建输入框
entry_username = tk.Entry(window)
entry_password = tk.Entry(window, show="*") # show="*" 用于隐藏密码输入
# 使用 grid 放置输入框,并 sticky=tk.EW 让它们水平拉伸
entry_username.grid(row=0, column=1, sticky=tk.EW, padx=5, pady=5)
entry_password.grid(row=1, column=1, sticky=tk.EW, padx=5, pady=5)
# 创建按钮
tk.Button(window, text="登录").grid(row=2, column=0, columnspan=2, sticky=tk.EW, padx=5, pady=10)
# 让第1列可以水平拉伸
window.grid_columnconfigure(1, weight=1)
window.mainloop()

place() - 绝对坐标布局

place() 允许你通过精确的 x, y 坐标来放置组件。

  • x: 水平坐标。
  • y: 垂直坐标。
  • relx: 相对水平位置 (0.0 到 1.0)。
  • rely: 相对垂直位置 (0.0 到 1.0)。
  • anchor: 锚点,指定组件的哪个部分对齐到坐标点 (如 tk.NW, tk.CENTER, tk.SE)。

注意place() 的布局在窗口大小改变时不会自动调整,因此不推荐用于构建复杂的、可调整大小的界面。


事件处理

command 选项

这是最简单的事件处理方式,专门用于按钮、菜单项等组件的点击事件,它直接绑定一个函数。

def my_function():
    print("事件被触发!")
button = tk.Button(window, text="点击", command=my_function)

bind() 方法

bind() 方法提供了更强大的事件处理能力,可以绑定到任何组件上,处理各种类型的事件(如鼠标点击、键盘按键、鼠标移动等)。

事件字符串的格式为 <事件类型-修饰符>

  • <Button-1>: 鼠标左键点击。
  • <Button-3>: 鼠标右键点击。
  • <Double-Button-1>: 鼠标左键双击。
  • <B1-Motion>: 鼠标左键拖动。
  • <KeyPress>: 任意按键按下。
  • <Key-a>: 'a' 键按下。
  • <Return>: 回车键按下。
  • <Configure>: 组件大小或位置改变。
import tkinter as tk
window = tk.Tk()
window.title("Bind 事件示例")
# 绑定鼠标左键点击事件到整个窗口
def on_left_click(event):
    # event 对象包含了事件的信息,如 x, y 坐标
    print(f"鼠标在 ({event.x}, {event.y}) 处被点击")
window.bind("<Button-1>", on_left_click)
# 绑定键盘按键事件
def on_key_press(event):
    print(f"你按下了: {event.char}")
window.bind("<KeyPress>", on_key_press)
# 创建一个标签来显示提示
label = tk.Label(window, text="点击窗口或按任意键试试")
label.pack(pady=20)
window.mainloop()

进阶主题

获取和设置组件值

许多组件都有 get()config() (或 cget()) 方法来获取和设置它们的值或属性。

  • Entry: entry.get()
  • Text: text.get("1.0", tk.END)
  • Radiobutton: variable.get()
  • Checkbutton: var.get() (返回布尔值)
  • Scale: scale.get()

config() 用于修改组件的属性,如 text, color 等。 label.config(text="新的文本", fg="blue")

对话框 (messagebox, filedialog)**

使用 tkinter.messageboxtkinter.filedialog 可以轻松创建标准对话框。

import tkinter as tk
from tkinter import messagebox, filedialog
window = tk.Tk()
window.title("对话框示例")
def show_info():
    messagebox.showinfo("信息", "这是一个信息对话框")
def show_warning():
    messagebox.showwarning("警告", "这是一个警告对话框!")
def ask_question():
    result = messagebox.askyesno("确认", "你确定要继续吗?")
    if result:
        print("用户点击了 '是'")
    else:
        print("用户点击了 '否'")
def open_file():
    file_path = filedialog.askopenfilename(
        title="选择一个文件",
        filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
    )
    if file_path:
        print(f"选择的文件是: {file_path}")
tk.Button(window, text="显示信息", command=show_info).pack(pady=5)
tk.Button(window, text="显示警告", command=show_warning).pack(pady=5)
tk.Button(window, text="询问问题", command=ask_question).pack(pady=5)
tk.Button(window, text="打开文件", command=open_file).pack(pady=5)
window.mainloop()

自定义样式 (ttk 模块)

从 Python 2.5 开始,ttk (Tk themed widget) 被引入,它提供了外观更现代的组件,要使用 ttk,只需导入它并用 ttk 的组件替换 tk 的组件。

import tkinter as tk
from tkinter import ttk # 导入 ttk 模块
window = tk.Tk()
window.title("TTK 样式示例")
# 使用 ttk 的组件
style = ttk.Style()
style.configure("TButton", font=("Arial", 12), padding=6) # 配置所有 TButton 的样式
ttk.Label(window, text="这是一个 TTK 标签", font=("Arial", 14)).pack(pady=10)
ttk.Button(window, text="这是一个 TTK 按钮").pack(pady=10)
# 你也可以为特定组件命名样式
style.configure("Accent.TButton", foreground="blue")
ttk.Button(window, text="带样式的按钮", style="Accent.TButton").pack(pady=10)
window.mainloop()

综合实例:一个简单的记事本

这个例子将综合运用我们学到的知识:Menu, Text, Filedialog, messageboxgrid 布局。

import tkinter as tk
from tkinter import messagebox, filedialog
def new_file():
    text.delete("1.0", tk.END)
    window.title("未命名 - 记事本")
def open_file():
    file_path = filedialog.askopenfilename(defaultextension=".txt",
                                           filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")])
    if file_path:
        with open(file_path, "r", encoding="utf-8") as f:
            content = f.read()
        text.delete("1.0", tk.END)
        text.insert(tk.END, content)
        window.title(f"{file_path} - 记事本")
def save_file():
    file_path = filedialog.asksaveasfilename(defaultextension=".txt",
                                             filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")])
    if file_path:
        content = text.get("1.0", tk.END)
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(content)
        window.title(f"{file_path} - 记事本")
        messagebox.showinfo("保存", "文件已保存!")
def exit_app():
    if messagebox.askokcancel("退出", "确定要退出吗?"):
        window.quit()
# --- 主窗口 ---
window = tk.Tk()
window.title("记事本")
window.geometry("600x400")
# --- 菜单栏 ---
menubar = tk.Menu(window)
file_menu = tk.Menu(menubar, tearoff=0)
file_menu.add_command(label="新建", command=new_file, accelerator="Ctrl+N")
file_menu.add_command(label="打开", command=open_file, accelerator="Ctrl+O")
file_menu.add_command(label="保存", command=save_file, accelerator="Ctrl+S")
file_menu.add_separator()
file_menu.add_command(label="退出", command=exit_app)
menubar.add_cascade(label="文件", menu=file_menu)
window.config(menu=menubar)
# --- 文本区域 ---
text = tk.Text(window, wrap=tk.WORD)
text.pack(expand=True, fill=tk.BOTH)
# --- 滚动条 ---
scrollbar = tk.Scrollbar(text)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
text.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=text.yview)
# --- 快捷键绑定 ---
window.bind("<Control-n>", lambda e: new_file())
window.bind("<Control-o>", lambda e: open_file())
window.bind("<Control-s>", lambda e: save_file())
window.mainloop()

总结与资源

Tkinter 是一个强大且易用的 Python GUI 库,通过掌握其核心组件、布局管理器和事件处理机制,你就可以构建功能丰富、界面美观的桌面应用程序。

学习资源

  • 官方文档: Tkinter Docs (effbot.org) (经典的 "Tkinter by Example" 已归档,但内容依然非常有价值)
  • 官方文档 (Python.org): tkinter — Python interface to Tcl/Tk (最新的官方文档)
  • 教程视频: 在 YouTube 或 Bilibili 上搜索 "Python Tkinter 教程",有大量视频资源可供学习。
  • 代码示例: 在 GitHub 上搜索 "tkinter examples",可以找到很多开源项目供你参考。

希望这份教程对你有帮助!祝你编程愉快!

分享:
扫描分享到社交APP
上一篇
下一篇