Python 桌面 GUI 入门开发:从 tkinter 窗口到简易记事本
很多 Python 初学者在掌握变量、函数、文件读写之后,会希望做一个真正"看得见、点得动"的程序。tkinter 就是 Python 标准库自带的桌面 GUI 开发工具,不需要额外安装第三方库,就可以创建窗口、按钮、输入框、菜单和文件选择框。
本文会从最基础的窗口开始,逐步介绍 Label、Button、Entry 控件、按钮点击事件、文件选择框,最后完成一个简单的记事本工具。
一、tkinter 简介
tkinter 是 Python 对 Tk GUI 工具包的封装,它有几个非常适合入门的特点:
- Python 标准库自带,安装 Python 后通常可以直接使用
- API 简单,适合快速做小工具
- 支持 Windows、macOS、Linux
- 可以创建按钮、文本框、菜单、弹窗、文件选择框等常见桌面界面
导入方式如下:
python
import tkinter as tk
如果需要弹窗、文件选择框,还可以导入:
python
from tkinter import filedialog, messagebox
二、创建第一个窗口
一个最小的 tkinter 程序通常包含三步:
- 创建主窗口
- 添加控件
- 进入事件循环
示例:
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 入门开发的核心内容:
- 创建桌面窗口
- 使用
Label、Button、Entry - 绑定按钮点击事件
- 调用文件选择框
- 编写一个完整的简易记事本工具
tkinter 很适合用来开发个人效率工具、批处理小工具、文件处理界面和学习型项目。后续可以继续扩展这个记事本,比如增加查找替换、字体设置、快捷键、最近打开文件列表等功能。