1. 项目概述:用Python快速打造个人记事本
每次看到Windows自带的记事本,我都会想:如果能自己做一个功能更强大的版本该多好。今天我要分享的,就是如何用Python在30分钟内打造一个完全属于自己的记事本应用。这个项目特别适合刚学完Python基础想练手的同学,也适合想了解GUI开发的老手快速入门。
我们将使用PyQt6这个强大的GUI框架,它比Tkinter更现代、功能更丰富。最终成品将具备基本的文本编辑功能,包括新建、打开、保存文件,以及简单的文本格式设置。虽然功能简单,但包含了GUI开发的核心要素:窗口布局、组件交互和文件操作。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具选型
2.1 为什么选择PyQt6
在Python的GUI框架中,PyQt6有几个明显优势:
- 跨平台支持(Windows/macOS/Linux)
- 丰富的组件库(超过620个类)
- 成熟的文档和社区支持
- 与Qt Designer工具无缝集成
相比Tkinter,PyQt6的界面更现代;相比wxPython,它的API更一致。对于记事本这种需要处理文件操作和文本编辑的项目,PyQt6的QTextEdit和QFileDialog组件能大大简化开发。
2.2 安装配置步骤
首先确保已安装Python 3.6+,然后通过pip安装PyQt6:
bash复制pip install PyQt6
推荐使用VS Code作为编辑器,安装Python扩展后可以获得更好的代码提示。如果遇到PyQt6模块无法导入的问题,检查:
- Python环境是否正确(命令行执行
python --version) - pip是否与当前Python版本匹配
- 防火墙是否阻止了包下载
注意:国内用户可以使用阿里云镜像加速安装:
pip install PyQt6 -i https://mirrors.aliyun.com/pypi/simple/
3. 核心功能实现
3.1 主窗口搭建
我们从最基本的QMainWindow开始:
python复制from PyQt6.QtWidgets import QApplication, QMainWindow
app = QApplication([])
window = QMainWindow()
window.setWindowTitle("我的Python记事本")
window.setGeometry(100, 100, 800, 600)
window.show()
app.exec()
这段代码创建了一个800×600像素的窗口。QMainWindow提供了标准应用程序框架,包括菜单栏、工具栏和状态栏的预设区域。
3.2 添加文本编辑区域
使用QTextEdit作为核心编辑组件:
python复制from PyQt6.QtWidgets import QTextEdit
text_edit = QTextEdit()
window.setCentralWidget(text_edit)
现在窗口已经有了可编辑区域。我们可以通过text_edit.setFontPointSize(14)等方法来调整字体样式。
3.3 实现文件操作功能
3.3.1 新建文件
python复制def new_file():
text_edit.clear()
3.3.2 打开文件
python复制from PyQt6.QtWidgets import QFileDialog
def open_file():
file_path, _ = QFileDialog.getOpenFileName(window, "打开文件")
if file_path:
with open(file_path, 'r') as f:
text_edit.setText(f.read())
3.3.3 保存文件
python复制def save_file():
file_path, _ = QFileDialog.getSaveFileName(window, "保存文件")
if file_path:
with open(file_path, 'w') as f:
f.write(text_edit.toPlainText())
常见问题:如果QFileDialog卡死,可能是由于系统主题冲突。可以尝试设置
QApplication.setStyle('Fusion')来使用内置样式。
4. 界面优化与功能扩展
4.1 添加菜单栏
python复制from PyQt6.QtGui import QAction
menu_bar = window.menuBar()
file_menu = menu_bar.addMenu("文件")
new_action = QAction("新建", window)
new_action.triggered.connect(new_file)
file_menu.addAction(new_action)
# 类似添加打开、保存等动作
4.2 添加工具栏
python复制toolbar = window.addToolBar("常用工具")
toolbar.addAction(new_action)
4.3 状态栏显示信息
python复制status_bar = window.statusBar()
status_bar.showMessage("就绪")
5. 进阶功能实现
5.1 文本搜索功能
python复制def find_text():
search_text, ok = QInputDialog.getText(window, "查找", "输入查找内容:")
if ok and search_text:
cursor = text_edit.document().find(search_text)
if not cursor.isNull():
text_edit.setTextCursor(cursor)
5.2 字体设置对话框
python复制from PyQt6.QtWidgets import QFontDialog
def set_font():
font, ok = QFontDialog.getFont()
if ok:
text_edit.setCurrentFont(font)
5.3 添加最近打开文件列表
python复制recent_files = []
def update_recent_files(file_path):
if file_path in recent_files:
recent_files.remove(file_path)
recent_files.insert(0, file_path)
if len(recent_files) > 5:
recent_files.pop()
6. 项目打包与分发
6.1 使用PyInstaller打包
安装PyInstaller:
bash复制pip install pyinstaller
打包命令:
bash复制pyinstaller --onefile --windowed my_notepad.py
6.2 解决打包常见问题
- 图标不显示:添加
--icon=app.ico参数 - 缺少依赖:使用
--add-data手动添加 - 杀毒软件误报:建议代码签名
7. 性能优化技巧
7.1 延迟加载大文件
python复制def open_large_file(file_path):
with open(file_path, 'r') as f:
for line in f:
text_edit.append(line)
QApplication.processEvents() # 保持UI响应
7.2 自动保存功能
python复制from PyQt6.QtCore import QTimer
autosave_timer = QTimer()
autosave_timer.timeout.connect(lambda: save_file() if current_file else None)
autosave_timer.start(300000) # 每5分钟
8. 项目扩展思路
- 语法高亮:集成QSyntaxHighlighter
- Markdown预览:使用QWebEngineView
- 云同步:结合requests库调用API
- 插件系统:通过importlib动态加载
9. 常见问题排查
-
界面卡顿:
- 检查是否有耗时操作在主线程
- 使用QThread处理后台任务
-
中文乱码:
- 确保文件以UTF-8编码打开
- 添加
# -*- coding: utf-8 -*-到文件开头
-
样式不生效:
- 检查QSS语法是否正确
- 确保样式表在组件初始化后应用
10. 完整代码示例
python复制import sys
from PyQt6.QtWidgets import (QApplication, QMainWindow, QTextEdit,
QFileDialog, QInputDialog, QFontDialog)
from PyQt6.QtGui import QAction
class Notepad(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 文本编辑区域
self.text_edit = QTextEdit()
self.setCentralWidget(self.text_edit)
# 菜单栏
menubar = self.menuBar()
# 文件菜单
file_menu = menubar.addMenu('文件')
new_action = QAction('新建', self)
new_action.triggered.connect(self.new_file)
file_menu.addAction(new_action)
open_action = QAction('打开', self)
open_action.triggered.connect(self.open_file)
file_menu.addAction(open_action)
save_action = QAction('保存', self)
save_action.triggered.connect(self.save_file)
file_menu.addAction(save_action)
# 编辑菜单
edit_menu = menubar.addMenu('编辑')
find_action = QAction('查找', self)
find_action.triggered.connect(self.find_text)
edit_menu.addAction(find_action)
font_action = QAction('字体', self)
font_action.triggered.connect(self.set_font)
edit_menu.addAction(font_action)
# 窗口设置
self.setWindowTitle('我的Python记事本')
self.setGeometry(100, 100, 800, 600)
def new_file(self):
self.text_edit.clear()
def open_file(self):
file_path, _ = QFileDialog.getOpenFileName(self, "打开文件")
if file_path:
with open(file_path, 'r', encoding='utf-8') as f:
self.text_edit.setText(f.read())
def save_file(self):
file_path, _ = QFileDialog.getSaveFileName(self, "保存文件")
if file_path:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(self.text_edit.toPlainText())
def find_text(self):
search_text, ok = QInputDialog.getText(self, "查找", "输入查找内容:")
if ok and search_text:
cursor = self.text_edit.document().find(search_text)
if not cursor.isNull():
self.text_edit.setTextCursor(cursor)
def set_font(self):
font, ok = QFontDialog.getFont()
if ok:
self.text_edit.setCurrentFont(font)
if __name__ == '__main__':
app = QApplication(sys.argv)
notepad = Notepad()
notepad.show()
sys.exit(app.exec())
这个记事本虽然简单,但包含了GUI开发的核心概念。我在实际开发中发现,PyQt6的文档字符串非常完善,遇到问题时多查看官方文档往往能快速找到解决方案。对于更复杂的项目,可以考虑使用Qt Designer来设计界面,再用pyuic6工具转换为Python代码,这样能大大提高开发效率。
