【Python 内置模块】tkinter

2024-01-20 00:00:00

目录:

tkinter 模块介绍

tkinter 是 Python 的标准 GUI(图形用户界面)工具包接口,可以用来构建简单桌面应用。

核心架构基于 Tcl/Tk,其中 Tcl 是一种动态解释型编程语言,Tk 则是用 C 语言实现的 Tcl 包,专门用于创建和操作 GUI 部件。

使用流程

创建一个 tkinter 应用程序通常遵循以下固定流程:

  • 导入模块:import tkinter as tk
  • 创建主窗口:root = tk.Tk(),这是所有控件的容器
  • 添加控件:创建各种 GUI 组件并设置其属性和布局
  • 启动事件循环:root.mainloop(),使窗口保持显示并响应用户交互
import tkinter as tk

root = tk.Tk()                                # 创建主窗口
root.geometry("300x150")                      # 设置窗口大小
label = tk.Label(root, text="Hello World!")   # 创建标签控件
label.pack()                                  # 使用 pack 布局管理器放置控件
root.mainloop()                               # 启动主事件循环

运行时可能会报如下错误,原因是 Homebrew 安装的 Python 默认是将核心库和 GUI 相关库分离开了。

  File "/opt/homebrew/Cellar/python@3.13/3.13.3_1/Frameworks/Python.framework/Versions/3.13/lib/python3.13/tkinter/__init__.py", line 38, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
    ^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named '_tkinter'

手动安装和 Python 版本相同的 python-tk 包即可。

$ brew install python-tk@3.13

布局管理器

tkinter 提供三种主要的布局管理器,各有适用场景:

  • pack():最简单,按添加顺序自动排列控件,适合快速原型开发。支持 side、fill、expand 等参数控制位置和填充方式;
  • grid():最常用,将容器视为表格,通过行和列定位控件,适合表单类界面。提供更精确的布局控制;
  • place():使用绝对坐标(x, y)放置控件,灵活性最高但维护性差,适合需要精确定位的特殊场景。

事件处理

对于按钮等控件使用 command 参数进行事件绑定:

def on_click():
    print("按钮被点击")

button = tk.Button(root, text="点击", command=on_click)

也可以使用 bind() 监听键盘或鼠标的行为:

def on_key_press(event):
    print(f"按下按键:{event.keysym}")

root.bind("<Key>", on_key_press)        # 绑定所有按键事件
  • event.char: 按键字符;
  • event.x/event.y: 鼠标坐标。

示例:基本控件

下面示例演示了标签(Label)、按钮(Button)和输入框(Entry)的常见用法:

import tkinter as tk

def on_button_click():
    user_input = entry.get()
    label.config(text=f"你输入了:{user_input}")

root = tk.Tk()
root.title("输入框示例")
root.geometry("300x150")                  # 设置窗口大小

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

btn = tk.Button(root, text="确认", command=on_button_click)
btn.pack()

label = tk.Label(root, text="等待输入...")
label.pack(pady=10)

root.mainloop()

示例:使用网格布局

grid() 布局管理器将界面划分为网格,通过 row 和 column 参数精确定位控件。

import tkinter as tk

def calculate():
    try:
        value = float(cms.get())
        result.set(value)
    except ValueError:
        pass

root = tk.Tk()
root.title("身高计算器")
root.geometry("450x300")

tk.Label(root, text="请输入身高").grid(row=0, column=0)

cms = tk.StringVar() # 创建字符串变量
tk.Entry(root, width=7, textvariable=cms).grid(row=0, column=1)

tk.Label(root, text="cm").grid(row=0, column=2)
tk.Label(root, text="你的身高是").grid(row=1, column=0)

result = tk.StringVar()
tk.Label(root, textvariable=result).grid(row=1, column=1)

tk.Label(root, text="cm").grid(row=1, column=2)

B = tk.Button(root, text="计算", command=calculate)
B.grid(row=3, column=3)

root.mainloop()

示例:登录窗口

import tkinter as tk
from tkinter import messagebox

def login():
    username = entry_user.get()
    password = entry_pass.get()
    if username == "admin" and password == "123":
        messagebox.showinfo("登录结果", "登录成功!")
    else:
        messagebox.showerror("登录结果", "用户名或密码错误")

root = tk.Tk()
root.title("登录窗口")

tk.Label(root, text="用户名:").grid(row=0, column=0)
entry_user = tk.Entry(root)
entry_user.grid(row=0, column=1)

tk.Label(root, text="密码:").grid(row=1, column=0)
entry_pass = tk.Entry(root, show="*")     # 密码框显示星号
entry_pass.grid(row=1, column=1)

tk.Button(root, text="登录", command=login).grid(row=2, columnspan=2)

root.mainloop()

ttk 主题控件

ttk 模块提供了更现代、美观的控件,使用方法与经典控件类似但外观更佳。

import tkinter as tk
from tkinter import ttk

style = ttk.Style()
style.theme_use('clam')                   # 使用 clam 主题

def callback():
    print('点击了按钮')

root = tk.Tk()
root.geometry("300x150")                      # 设置窗口大小

ttk.Label(root, text="现代标签").pack()
ttk.Button(root, text="主题按钮", command=callback).pack()

root.mainloop()                               # 启动主事件循环

消息提示框

messagebox 模块提供了标准对话框,增强用户体验。

import tkinter as tk
from tkinter import messagebox

def warn():
    messagebox.showwarning("警告", "这是一个警告")

def error():
    messagebox.showerror("错误", "操作失败")

root = tk.Tk()
root.geometry("300x150")                      # 设置窗口大小

tk.Button(root, text="警告弹窗", command=warn).pack()
tk.Button(root, text="错误弹窗", command=error).pack()

root.mainloop()                               # 启动主事件循环

文件对话框

filedialog 模块可以打开文件对话框选择文件。

import tkinter as tk
from tkinter import filedialog, messagebox

def select_file():
    # 文件选择
    file_path = filedialog.askopenfilename(title="选择文件")
    if file_path:
        messagebox.showinfo("文件选择", f"已选择:{file_path}")

root = tk.Tk()
root.geometry("300x150")                      # 设置窗口大小

tk.Button(root, text="选择文件", command=select_file).pack()

root.mainloop()                               # 启动主事件循环

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: