Python 桌面 GUI 入门开发:从 tkinter 窗口到简易记事本

Python 桌面 GUI 入门开发:从 tkinter 窗口到简易记事本

很多 Python 初学者在掌握变量、函数、文件读写之后,会希望做一个真正"看得见、点得动"的程序。tkinter 就是 Python 标准库自带的桌面 GUI 开发工具,不需要额外安装第三方库,就可以创建窗口、按钮、输入框、菜单和文件选择框。

本文会从最基础的窗口开始,逐步介绍 LabelButtonEntry 控件、按钮点击事件、文件选择框,最后完成一个简单的记事本工具。

一、tkinter 简介

tkinter 是 Python 对 Tk GUI 工具包的封装,它有几个非常适合入门的特点:

  • Python 标准库自带,安装 Python 后通常可以直接使用
  • API 简单,适合快速做小工具
  • 支持 Windows、macOS、Linux
  • 可以创建按钮、文本框、菜单、弹窗、文件选择框等常见桌面界面

导入方式如下:

python 复制代码
import tkinter as tk

如果需要弹窗、文件选择框,还可以导入:

python 复制代码
from tkinter import filedialog, messagebox

二、创建第一个窗口

一个最小的 tkinter 程序通常包含三步:

  1. 创建主窗口
  2. 添加控件
  3. 进入事件循环

示例:

python 复制代码
import tkinter as tk

root = tk.Tk()
root.title("我的第一个 tkinter 窗口")
root.geometry("400x250")

label = tk.Label(root, text="Hello, tkinter!")
label.pack(pady=30)

root.mainloop()

代码说明:

  • tk.Tk():创建主窗口
  • title():设置窗口标题
  • geometry():设置窗口大小,格式是 宽x高
  • Label:显示文本
  • pack():把控件放到窗口中
  • mainloop():启动事件循环,让窗口保持运行并响应用户操作

如果没有 mainloop(),窗口会一闪而过。

三、Label、Button、Entry 控件

tkinter 中最常用的三个基础控件是:

  • Label:显示文本
  • Button:按钮
  • Entry:单行输入框

示例:输入姓名,点击按钮后显示欢迎信息。

python 复制代码
import tkinter as tk


def say_hello():
    name = name_entry.get()
    result_label.config(text=f"你好,{name}!")


root = tk.Tk()
root.title("控件示例")
root.geometry("400x220")

title_label = tk.Label(root, text="请输入你的名字:", font=("Microsoft YaHei", 12))
title_label.pack(pady=10)

name_entry = tk.Entry(root, width=30)
name_entry.pack(pady=5)

hello_button = tk.Button(root, text="打招呼", command=say_hello)
hello_button.pack(pady=10)

result_label = tk.Label(root, text="", fg="blue")
result_label.pack(pady=10)

root.mainloop()

这里的关键点是:

  • Entry.get() 可以获取输入框内容
  • Label.config() 可以修改控件属性
  • Button(command=函数名) 可以绑定点击事件

注意:command=say_hello 后面不要写括号。如果写成 command=say_hello(),函数会在程序启动时立即执行,而不是点击按钮时执行。

四、点击按钮事件

GUI 程序和命令行程序最大的区别是:GUI 程序通常由用户操作驱动。

按钮点击、输入内容、选择文件、关闭窗口,这些都属于事件。我们可以把一个函数绑定给按钮:

python 复制代码
def on_click():
    print("按钮被点击了")

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

当用户点击按钮时,on_click 函数就会执行。

如果希望按钮事件操作界面上的控件,可以在函数里调用控件的方法:

python 复制代码
def clear_text():
    entry.delete(0, tk.END)

其中:

  • 0 表示从第一个字符开始
  • tk.END 表示到末尾
  • delete(0, tk.END) 表示清空输入框

五、文件选择框

桌面工具经常需要打开或保存文件。tkinter 提供了 filedialog 模块。

选择一个文件:

python 复制代码
from tkinter import filedialog

file_path = filedialog.askopenfilename(
    title="选择文件",
    filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)

选择保存路径:

python 复制代码
file_path = filedialog.asksaveasfilename(
    title="保存文件",
    defaultextension=".txt",
    filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)

常见参数:

  • title:对话框标题
  • filetypes:允许选择的文件类型
  • defaultextension:默认文件扩展名

如果用户取消选择,返回值通常是空字符串,所以实际开发中要判断一下:

python 复制代码
if not file_path:
    return

六、制作一个简单记事本工具

下面我们做一个完整的小工具:简易记事本。

功能包括:

  • 新建文件
  • 打开 .txt 文件
  • 保存文件
  • 另存为
  • 编辑多行文本
  • 底部状态栏显示当前文件路径

这个项目用到:

  • Tk 主窗口
  • Menu 菜单
  • Text 多行文本框
  • Scrollbar 滚动条
  • filedialog 文件选择框
  • messagebox 提示框

七、完整源代码

可以把下面代码保存为 simple_notepad.py

python 复制代码
import tkinter as tk
from tkinter import filedialog, messagebox
from pathlib import Path


class SimpleNotepad:
    def __init__(self, root):
        self.root = root
        self.root.title("Python tkinter 简易记事本")
        self.root.geometry("800x560")

        self.current_file = None

        self.create_menu()
        self.create_editor()
        self.create_status_bar()

    def create_menu(self):
        menu_bar = tk.Menu(self.root)

        file_menu = tk.Menu(menu_bar, tearoff=False)
        file_menu.add_command(label="新建", command=self.new_file)
        file_menu.add_command(label="打开", command=self.open_file)
        file_menu.add_command(label="保存", command=self.save_file)
        file_menu.add_command(label="另存为", command=self.save_as_file)
        file_menu.add_separator()
        file_menu.add_command(label="退出", command=self.root.quit)

        menu_bar.add_cascade(label="文件", menu=file_menu)
        self.root.config(menu=menu_bar)

    def create_editor(self):
        editor_frame = tk.Frame(self.root)
        editor_frame.pack(fill=tk.BOTH, expand=True)

        scrollbar = tk.Scrollbar(editor_frame)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.text_area = tk.Text(
            editor_frame,
            wrap=tk.WORD,
            undo=True,
            font=("Consolas", 12),
            yscrollcommand=scrollbar.set
        )
        self.text_area.pack(fill=tk.BOTH, expand=True)
        scrollbar.config(command=self.text_area.yview)

    def create_status_bar(self):
        self.status_var = tk.StringVar()
        self.status_var.set("未保存的新文件")

        status_bar = tk.Label(
            self.root,
            textvariable=self.status_var,
            anchor="w",
            relief=tk.SUNKEN
        )
        status_bar.pack(side=tk.BOTTOM, fill=tk.X)

    def new_file(self):
        if not self.confirm_discard_changes():
            return

        self.text_area.delete("1.0", tk.END)
        self.current_file = None
        self.root.title("Python tkinter 简易记事本")
        self.status_var.set("未保存的新文件")

    def open_file(self):
        if not self.confirm_discard_changes():
            return

        file_path = filedialog.askopenfilename(
            title="打开文件",
            filetypes=[("文本文件", "*.txt"), ("Python 文件", "*.py"), ("所有文件", "*.*")]
        )

        if not file_path:
            return

        try:
            path = Path(file_path)
            content = path.read_text(encoding="utf-8")
        except UnicodeDecodeError:
            content = Path(file_path).read_text(encoding="gbk")
        except OSError as error:
            messagebox.showerror("打开失败", f"无法打开文件:\n{error}")
            return

        self.text_area.delete("1.0", tk.END)
        self.text_area.insert("1.0", content)
        self.current_file = Path(file_path)
        self.update_title_and_status()

    def save_file(self):
        if self.current_file is None:
            self.save_as_file()
            return

        try:
            content = self.text_area.get("1.0", tk.END)
            self.current_file.write_text(content, encoding="utf-8")
        except OSError as error:
            messagebox.showerror("保存失败", f"无法保存文件:\n{error}")
            return

        messagebox.showinfo("保存成功", "文件已保存。")
        self.update_title_and_status()

    def save_as_file(self):
        file_path = filedialog.asksaveasfilename(
            title="另存为",
            defaultextension=".txt",
            filetypes=[("文本文件", "*.txt"), ("Python 文件", "*.py"), ("所有文件", "*.*")]
        )

        if not file_path:
            return

        self.current_file = Path(file_path)
        self.save_file()

    def confirm_discard_changes(self):
        return messagebox.askyesno("确认操作", "当前内容可能尚未保存,是否继续?")

    def update_title_and_status(self):
        if self.current_file is None:
            self.root.title("Python tkinter 简易记事本")
            self.status_var.set("未保存的新文件")
            return

        self.root.title(f"{self.current_file.name} - Python tkinter 简易记事本")
        self.status_var.set(str(self.current_file))


def main():
    root = tk.Tk()
    app = SimpleNotepad(root)
    root.mainloop()


if __name__ == "__main__":
    main()

八、代码结构说明

这个记事本把功能封装到了 SimpleNotepad 类中:

  • create_menu():创建菜单栏
  • create_editor():创建文本编辑区域和滚动条
  • create_status_bar():创建底部状态栏
  • new_file():新建文件
  • open_file():打开文件
  • save_file():保存当前文件
  • save_as_file():另存为文件
  • confirm_discard_changes():继续操作前弹出确认提示
  • update_title_and_status():更新窗口标题和状态栏

这种写法比把所有代码都堆在全局更清晰,也方便后续添加功能。

九、Windows 下运行说明

1. 安装 Python

在 Windows 上可以从 Python 官网下载安装包:

text 复制代码
https://www.python.org/downloads/

安装时建议勾选:

text 复制代码
Add python.exe to PATH

安装完成后,打开命令提示符或 PowerShell,输入:

powershell 复制代码
python --version

如果能看到 Python 版本号,说明安装成功。

2. 保存代码文件

把完整源代码保存为:

text 复制代码
simple_notepad.py

例如保存到桌面或 D:\python_gui_demo 文件夹。

3. 运行程序

进入代码所在目录:

powershell 复制代码
cd D:\python_gui_demo

运行:

powershell 复制代码
python simple_notepad.py

如果窗口正常打开,就说明程序运行成功。

4. 常见问题

如果提示 python 不是内部或外部命令,通常是 Python 没有加入环境变量。可以重新安装 Python 并勾选 Add python.exe to PATH,或者使用:

powershell 复制代码
py simple_notepad.py

如果文件打开后中文乱码,可以根据文件编码调整读取方式。本文示例已经先尝试 utf-8,失败后再尝试 gbk,可以覆盖大多数 Windows 文本文档。

十、总结

通过本文你已经完成了 tkinter 入门开发的核心内容:

  • 创建桌面窗口
  • 使用 LabelButtonEntry
  • 绑定按钮点击事件
  • 调用文件选择框
  • 编写一个完整的简易记事本工具

tkinter 很适合用来开发个人效率工具、批处理小工具、文件处理界面和学习型项目。后续可以继续扩展这个记事本,比如增加查找替换、字体设置、快捷键、最近打开文件列表等功能。

相关推荐
川石课堂软件测试1 小时前
软件测试|常见面试题整理
数据库·python·jmeter·mysql·appium·postman·prometheus
做个文艺程序员1 小时前
Multi-Agent 系统实战:用 Python + LangGraph 搭建多智能体协作工作流
python·多智能体·langgraph·multi-agent
bang冰冰1 小时前
Trae工具安装和使用教程(新手零基础入门,全程无坑)
java·人工智能·python
User_芊芊君子1 小时前
聊聊自由开发者常用的学习机会全解析
开发语言·人工智能·python
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第40题:Java中的深拷贝和浅拷贝有什么区别
java·开发语言·后端·面试
xh didida2 小时前
算法 -- 位运算
开发语言·c++·算法
谙弆悕博士2 小时前
快速学C语言——第2章:编程规范与代码风格
服务器·c语言·开发语言·经验分享·程序人生·学习方法·业界资讯
weixin_376593222 小时前
使用pyhon脚本方式将超链接保存到第一列以数字方式显示
python
byzh_rc2 小时前
[AI编程从入门到入土] 装饰器decorator
开发语言·python·ai编程