036-Python GUI 编程(Tkinter)

Tkinter 是 Python 标准库中的图形用户界面(GUI)开发工具,提供了创建窗口、按钮、文本框等基本控件的功能。由于其简单易用且与 Python 一起发布,Tkinter 是快速开发桌面应用的首选工具之一。


1. Tkinter 基本概念

1.1 Tkinter 的组成

Tkinter 提供了一个图形化界面的框架,主要包括以下几个核心概念:

  1. Tk:主窗口,是所有控件的容器。
  2. 控件(Widget):比如按钮、标签、文本框等。
  3. 布局管理器:用于控制控件在窗口中的位置。
  4. 事件处理:通过绑定事件(如点击、键盘输入)响应用户操作。

2. 创建第一个 Tkinter 窗口

以下是创建一个简单窗口的代码示例:

import tkinter as tk

# 创建主窗口
root = tk.Tk()
root.title("第一个 Tkinter 窗口")  # 设置窗口标题
root.geometry("400x300")         # 设置窗口大小(宽 x 高)

# 运行主循环
root.mainloop()

运行此代码后,会弹出一个空的窗口。


3. Tkinter 常见控件

3.1 标签(Label)

用于显示文本或图像。

import tkinter as tk

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

# 创建一个 Label
label = tk.Label(root, text="Hello, Tkinter!", font=("Arial", 16), fg="blue")
label.pack(pady=20)  # 显示控件,并设置上下间距

root.mainloop()

3.2 按钮(Button)

按钮可用于触发事件。

import tkinter as tk

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

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

# 创建按钮
button = tk.Button(root, text="点击我", command=on_click, font=("Arial", 14))
button.pack(pady=20)

root.mainloop()

3.3 文本框(Entry 和 Text)

  • Entry:单行文本输入框。
  • Text:多行文本输入框。
单行文本输入框(Entry)

import tkinter as tk

def show_text():
    print(f"输入的内容:{entry.get()}")  # 获取输入内容

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

# 创建输入框
entry = tk.Entry(root, font=("Arial", 14))
entry.pack(pady=10)

# 创建按钮
button = tk.Button(root, text="提交", command=show_text)
button.pack(pady=10)

root.mainloop()
多行文本输入框(Text)

import tkinter as tk

def show_text():
    print(f"输入的内容:\n{text.get('1.0', tk.END)}")  # 获取多行内容

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

# 创建多行文本框
text = tk.Text(root, height=5, width=40, font=("Arial", 14))
text.pack(pady=10)

# 创建按钮
button = tk.Button(root, text="提交", command=show_text)
button.pack(pady=10)

root.mainloop()

3.4 复选框(Checkbutton)

复选框用于用户选择多个选项。

import tkinter as tk

def show_selection():
    print(f"选项 1:{'选中' if var1.get() else '未选中'}")
    print(f"选项 2:{'选中' if var2.get() else '未选中'}")

root = tk.Tk()
root.title("Checkbutton 示例")

# 创建变量
var1 = tk.IntVar()
var2 = tk.IntVar()

# 创建复选框
check1 = tk.Checkbutton(root, text="选项 1", variable=var1)
check1.pack()
check2 = tk.Checkbutton(root, text="选项 2", variable=var2)
check2.pack()

# 创建按钮
button = tk.Button(root, text="提交", command=show_selection)
button.pack(pady=10)

root.mainloop()

3.5 单选按钮(Radiobutton)

单选按钮用于选择一个选项。

import tkinter as tk

def show_selection():
    print(f"选择了:选项 {selected_option.get()}")

root = tk.Tk()
root.title("Radiobutton 示例")

# 创建变量
selected_option = tk.IntVar()
selected_option.set(1)  # 默认选择第一个

# 创建单选按钮
radio1 = tk.Radiobutton(root, text="选项 1", variable=selected_option, value=1)
radio1.pack()
radio2 = tk.Radiobutton(root, text="选项 2", variable=selected_option, value=2)
radio2.pack()

# 创建按钮
button = tk.Button(root, text="提交", command=show_selection)
button.pack(pady=10)

root.mainloop()

3.6 列表框(Listbox)

列表框用于展示多项内容。

import tkinter as tk

def show_selection():
    selected_items = listbox.curselection()  # 获取选中的索引
    for i in selected_items:
        print(f"选中了:{listbox.get(i)}")

root = tk.Tk()
root.title("Listbox 示例")

# 创建列表框
listbox = tk.Listbox(root, selectmode=tk.MULTIPLE, width=20, height=5)
items = ["苹果", "香蕉", "橙子", "葡萄", "芒果"]
for item in items:
    listbox.insert(tk.END, item)
listbox.pack()

# 创建按钮
button = tk.Button(root, text="提交", command=show_selection)
button.pack(pady=10)

root.mainloop()

4. Tkinter 布局管理

Tkinter 提供了三种布局管理方式,用于控制控件在窗口中的位置。

4.1 pack() 布局

按顺序排列控件,支持上下、左右对齐。

import tkinter as tk

root = tk.Tk()
root.title("Pack 示例")

tk.Label(root, text="顶部标签").pack(side="top", pady=10)
tk.Label(root, text="底部标签").pack(side="bottom", pady=10)
tk.Label(root, text="左侧标签").pack(side="left", padx=10)
tk.Label(root, text="右侧标签").pack(side="right", padx=10)

root.mainloop()

4.2 grid() 布局

按行列排列控件。

import tkinter as tk

root = tk.Tk()
root.title("Grid 示例")

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

tk.Label(root, text="密码:").grid(row=1, column=0, padx=10, pady=5)
tk.Entry(root, show="*").grid(row=1, column=1, padx=10, pady=5)

tk.Button(root, text="登录").grid(row=2, column=0, columnspan=2, pady=10)

root.mainloop()

4.3 place() 布局

通过坐标精确定位控件。

import tkinter as tk

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

tk.Label(root, text="标签 1").place(x=50, y=50)
tk.Label(root, text="标签 2").place(x=100, y=100)

root.mainloop()

5. 综合示例:登录窗口

import tkinter as tk
from tkinter import messagebox

def login():
    username = entry_username.get()
    password = entry_password.get()
    if username == "admin" and password == "1234":
        messagebox.showinfo("提示", "登录成功!")
    else:
        messagebox.showerror("错误", "用户名或密码错误!")

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

# 用户名
tk.Label(root, text="用户名:").grid(row=0, column=0, padx=10, pady=5)
entry_username = tk.Entry(root)
entry_username.grid(row=0, column=1, padx=10, pady=5)

# 密码
tk.Label(root, text="密码:").grid(row=1, column=0, padx=10, pady=5)
entry_password = tk.Entry(root, show="*")
entry_password.grid(row=1, column=1, padx=10, pady=5)

# 登录按钮
tk.Button(root, text="登录", command=login).grid(row=2, column=0, columnspan=2, pady=10)

root.mainloop()

6. 总结

  • Tkinter 核心功能:通过控件(如按钮、文本框)和布局(如 packgrid)实现窗口设计。
  • 事件处理:通过 command 或绑定事件响应用户交互。
  • 扩展功能:可以结合其他库(如 Pillow)实现图片处理、图形绘制等。

Tkinter 是快速创建桌面应用的强大工具,适合开发简单的 GUI 程序。如果需要更复杂的 GUI,可以考虑使用 PyQtKivy 等框架。


以下是对 Python Tkinter GUI 编程 的进一步扩展,包括高级控件、事件绑定、自定义窗口样式、主题应用,以及一些实用的综合示例。


7. 高级控件

7.1 菜单(Menu)

Menu 是 Tkinter 提供的菜单栏控件,支持文件菜单、下拉菜单等。

示例:创建菜单栏

import tkinter as tk

def new_file():
    print("新建文件")

def open_file():
    print("打开文件")

def exit_app():
    root.quit()

root = tk.Tk()
root.title("菜单示例")
root.geometry("300x200")

# 创建菜单栏
menu_bar = tk.Menu(root)

# 创建文件菜单
file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="新建", command=new_file)
file_menu.add_command(label="打开", command=open_file)
file_menu.add_separator()  # 分隔线
file_menu.add_command(label="退出", command=exit_app)

# 添加文件菜单到菜单栏
menu_bar.add_cascade(label="文件", menu=file_menu)

# 设置菜单栏
root.config(menu=menu_bar)

root.mainloop()

7.2 消息框(MessageBox)

messagebox 用于显示消息或弹窗,适合提示用户信息或确认操作。

示例:消息框

import tkinter as tk
from tkinter import messagebox

def show_info():
    messagebox.showinfo("提示", "这是一个信息消息框")

def show_warning():
    messagebox.showwarning("警告", "这是一个警告消息框")

def show_error():
    messagebox.showerror("错误", "这是一个错误消息框")

def confirm_exit():
    if messagebox.askyesno("退出", "确定要退出吗?"):
        root.quit()

root = tk.Tk()
root.title("消息框示例")

tk.Button(root, text="信息", command=show_info).pack(pady=10)
tk.Button(root, text="警告", command=show_warning).pack(pady=10)
tk.Button(root, text="错误", command=show_error).pack(pady=10)
tk.Button(root, text="退出", command=confirm_exit).pack(pady=10)

root.mainloop()

7.3 选项卡(Notebook)

Notebookttk 提供的控件,可用于创建选项卡式布局。

示例:选项卡

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("选项卡示例")
root.geometry("400x300")

# 创建 Notebook
notebook = ttk.Notebook(root)

# 创建选项卡
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)

notebook.add(tab1, text="选项卡 1")
notebook.add(tab2, text="选项卡 2")
notebook.pack(expand=1, fill="both")

# 添加内容到选项卡 1
tk.Label(tab1, text="这是选项卡 1 的内容").pack(pady=20)

# 添加内容到选项卡 2
tk.Label(tab2, text="这是选项卡 2 的内容").pack(pady=20)

root.mainloop()

7.4 滑块(Scale)

用于选择范围内的数值。

示例:滑块

import tkinter as tk

def show_value(value):
    label.config(text=f"当前值:{value}")

root = tk.Tk()
root.title("滑块示例")

# 创建滑块
scale = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL, command=show_value)
scale.pack(pady=20)

# 显示当前值
label = tk.Label(root, text="当前值:0")
label.pack()

root.mainloop()

7.5 进度条(Progressbar)

Progressbarttk 提供的控件,用于显示任务进度。

示例:进度条

import tkinter as tk
from tkinter import ttk

def start_progress():
    progress.start(10)  # 每 10ms 前进一步

def stop_progress():
    progress.stop()

root = tk.Tk()
root.title("进度条示例")

# 创建进度条
progress = ttk.Progressbar(root, orient=tk.HORIZONTAL, length=300, mode="indeterminate")
progress.pack(pady=20)

# 创建按钮
tk.Button(root, text="开始", command=start_progress).pack(pady=5)
tk.Button(root, text="停止", command=stop_progress).pack(pady=5)

root.mainloop()

8. 事件绑定

在 Tkinter 中,控件可以绑定事件(如鼠标点击、键盘输入)来触发特定的功能。

8.1 鼠标事件

示例:绑定鼠标点击事件

import tkinter as tk

def on_click(event):
    print(f"鼠标点击位置:({event.x}, {event.y})")

root = tk.Tk()
root.title("鼠标事件示例")

# 创建标签
label = tk.Label(root, text="点击我", font=("Arial", 14), bg="lightblue")
label.pack(pady=20, padx=20)

# 绑定鼠标点击事件
label.bind("<Button-1>", on_click)  # 左键点击

root.mainloop()

8.2 键盘事件

示例:绑定键盘按键事件

import tkinter as tk

def on_key(event):
    print(f"按下的键:{event.char} (键码:{event.keycode})")

root = tk.Tk()
root.title("键盘事件示例")

# 绑定键盘事件
root.bind("<Key>", on_key)

root.mainloop()

9. 自定义窗口样式

9.1 修改窗口图标

import tkinter as tk

root = tk.Tk()
root.title("自定义图标示例")

# 设置窗口图标
root.iconbitmap("icon.ico")  # 确保 icon.ico 文件存在

root.mainloop()

9.2 设置窗口为不可调整大小

import tkinter as tk

root = tk.Tk()
root.title("固定窗口大小")

# 禁止调整窗口大小
root.resizable(False, False)

root.mainloop()

9.3 设置窗口透明度

import tkinter as tk

root = tk.Tk()
root.title("透明窗口示例")

# 设置窗口透明度
root.attributes("-alpha", 0.8)  # 0.0(完全透明)到 1.0(完全不透明)

root.mainloop()

10. 综合示例:简单计算器

以下是一个实现加减乘除功能的简单计算器示例。

import tkinter as tk

def calculate():
    try:
        result = eval(entry.get())  # 计算表达式
        label_result.config(text=f"结果:{result}")
    except Exception as e:
        label_result.config(text="错误!")

root = tk.Tk()
root.title("简单计算器")
root.geometry("300x200")

# 输入框
entry = tk.Entry(root, font=("Arial", 16))
entry.pack(pady=10)

# 计算按钮
button = tk.Button(root, text="计算", font=("Arial", 14), command=calculate)
button.pack(pady=10)

# 结果显示
label_result = tk.Label(root, text="结果:", font=("Arial", 16))
label_result.pack(pady=10)

root.mainloop()

11. Tkinter 主题与美化

Tkinter 的默认样式较为简单,可以通过第三方库 ttkbootstrap 提升界面美观。

安装 ttkbootstrap

pip install ttkbootstrap

示例:使用主题美化

import ttkbootstrap as ttk
from ttkbootstrap.constants import *

root = ttk.Window(themename="cosmo")  # 设置主题
root.title("美化示例")
root.geometry("300x200")

# 创建按钮
button = ttk.Button(root, text="点击我", bootstyle=SUCCESS, command=lambda: print("按钮被点击了!"))
button.pack(pady=20)

root.mainloop()

12. 总结

Tkinter 提供了开发桌面应用的完整工具,适合小型项目或快速原型开发。以下是 Tkinter 的关键点:

  1. 基础知识
    • 控件:按钮、标签、文本框等。
    • 布局:packgridplace
  2. 高级功能
    • 菜单、选项卡、进度条。
    • 消息框与事件绑定。
  3. 美化与优化
    • 使用主题(如 ttkbootstrap)提升界面美观。
    • 自定义窗口样式。

如果需要更复杂的 GUI 功能,可以考虑更强大的框架,如 PyQtKivy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小宝哥Code

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

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

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

打赏作者

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

抵扣说明:

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

余额充值