教你30分鐘使用Python制作自己的記事本
第一步:為什么我們需要「基礎窗口」?(新手必懂?。?/h2>
常見錯誤:直接寫window.show()但窗口不顯示?
正確邏輯:程序運行流程圖

代碼詳解(逐行解釋)
import sys # 必須!用于接收系統(tǒng)參數(shù)(比如文件路徑)
from PyQt6.QtWidgets import QApplication, QMainWindow # 從PyQt庫導入兩個核心組件
# 1?? 創(chuàng)建應用對象(靈魂!所有PyQt程序必須有)
app = QApplication(sys.argv) # sys.argv = 系統(tǒng)傳遞的命令行參數(shù)(比如打開的文件名)
# 2?? 創(chuàng)建主窗口(你的「畫布」)
window = QMainWindow() # 100% 會用到的窗口類型
window.setWindowTitle("我的迷你記事本") # 設置標題(為什么叫"窗口"?因為它是所有UI的容器?。?
window.resize(500, 400) # 設置大?。▽?00px, 高400px)
# 3?? 顯示窗口(關鍵!)
window.show() # ? 為什么必須寫?因為窗口默認是「隱形」的!
# ? 如果不寫這行,程序會直接結束,你永遠看不到窗口!
# 4?? 進入事件循環(huán)(讓程序「活」起來)
sys.exit(app.exec()) # ? 為什么叫「事件循環(huán)」?因為程序會一直監(jiān)聽用戶操作(點擊、輸入等)
思考題:
如果我刪掉 sys.exit(app.exec()) 會怎樣?
答案:程序會立刻結束!你只能看到一閃而過的窗口(就像打開一個網(wǎng)頁立刻關閉)。
第二步:為什么需要QTextEdit?(小白必看?。?/h2>
常見錯誤:用QLineEdit(單行輸入框)做記事本 → 無法輸入多行文字!
正確選擇:QTextEdit= 專為多行文本設計的編輯器
代碼詳解(添加編輯器):
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit # 新增導入
app = QApplication(sys.argv)
window = QMainWindow()
window.setWindowTitle("我的迷你記事本")
window.resize(700, 500) # 寬高調(diào)大一點(記事本需要更多空間)
# ? 關鍵步驟:把編輯器設置為窗口的「中央內(nèi)容」
editor = QTextEdit() # 創(chuàng)建編輯器對象
window.setCentralWidget(editor) # 設置為窗口的主區(qū)域
# ? 為什么叫「中央」?因為窗口可以有頂部菜單、底部狀態(tài)欄,編輯器占中間大塊
思考題:
如果我把 window.setCentralWidget(editor) 寫成 window.setWidget(editor) 會怎樣?
答案:報錯!setCentralWidget 是 QMainWindow 的專屬方法(PyQt 設計的規(guī)范)。
第三步:菜單欄怎么設計?(不是復制粘貼?。?/h2>
常見錯誤:直接寫menubar = menuBar()→ 無菜單!
正確邏輯:菜單 = 1個主菜單 + 多個子菜單項
代碼詳解(分步構建菜單):
# 1?? 創(chuàng)建菜單欄(必須先有窗口才有菜單欄)
menubar = window.menuBar() # 獲取窗口的菜單欄對象
# 2?? 添加「文件」主菜單(為什么叫「主菜單」?因為它在最左邊)
file_menu = menubar.addMenu("文件") # 創(chuàng)建菜單項
# 3?? 在「文件」里添加子菜單(每個子菜單是用戶點擊的按鈕)
open_action = file_menu.addAction("打開文件") # 添加「打開」按鈕
save_action = file_menu.addAction("保存文件") # 添加「保存」按鈕
# 4?? 設置快捷鍵(為什么需要?因為用戶習慣Ctrl+S?。?
save_action.setShortcut("Ctrl+S") # 40% 用戶會用快捷鍵
思考題:
為什么「打開」和「保存」要用 addAction 而不是 addButton?
答案:QAction 是 PyQt 的統(tǒng)一事件處理單元(不是按鈕!),它能綁定到菜單/按鈕/工具欄。
第四步:實現(xiàn)「打開文件」功能(關鍵?。?/h2>
常見錯誤:忘記with open→ 文件沒關閉 → 內(nèi)存泄漏!
正確邏輯:用戶點擊 → 彈出文件選擇框 → 讀取文件 → 顯示到編輯器
代碼詳解(帶思考注釋):
def open_file(self):
# ? 為什么用 QFileDialog.getOpenFileName?因為這是PyQt的標準文件選擇器
path, _ = QFileDialog.getOpenFileName(
self, # 父窗口(確保彈窗在記事本內(nèi)部)
"打開文件", # 窗口標題
"", # 默認打開路徑(留空表示當前目錄)
"Text Files (*.txt);;All Files (*)" # 文件過濾器(顯示.txt和所有文件)
)
# ? 為什么需要檢查 path?因為用戶可能點了「取消」!
if path:
# ? 為什么用 'r' 和 utf-8?因為讀取文本文件,且支持中文
with open(path, 'r', encoding='utf-8') as f:
self.editor.setText(f.read()) # 將文件內(nèi)容放入編輯器
# ? 為什么更新狀態(tài)欄?讓用戶知道發(fā)生了什么
self.statusBar().showMessage(f"已打開: {path}")
思考題:
如果用戶打開一個 .jpg 文件會怎樣?
答案:程序會崩潰!因為 f.read() 讀的是二進制,不是文本。這就是為什么需要文件過濾器("Text Files (*.txt)")。
第五步:實現(xiàn)「字數(shù)統(tǒng)計」(小白最愛的功能?。?/h2>
常見錯誤:用self.editor.text()→ 會包含HTML標簽!
正確邏輯:實時監(jiān)聽文字變化 → 計算純文本字數(shù)
代碼詳解(關鍵在textChanged信號):
# 1?? 初始化狀態(tài)欄(在 initUI 里)
self.statusBar().showMessage("準備就緒") # 初始狀態(tài)
# 2?? 監(jiān)聽文字變化(核心?。?
self.editor.textChanged.connect(self.update_status) # 當文字變化時,自動調(diào)用 update_status
# 3?? 實現(xiàn)統(tǒng)計函數(shù)
def update_status(self):
text = self.editor.toPlainText() # ? 為什么用 toPlainText?因為這是純文本!
char_count = len(text) # 字符數(shù)(含空格)
line_count = len(text.split('\n')) # 行數(shù)(按換行符分割)
# 更新狀態(tài)欄(為什么用 f-string?因為可讀性高!)
self.statusBar().showMessage(f"字數(shù): {char_count} | 行數(shù): {line_count}")
思考題:
為什么 text.split('\n') 能算行數(shù)?如果用戶用的是 \r\n(Windows換行符)會怎樣?
答案:split('\n') 會把 \r\n 當成兩個字符,導致行數(shù)多1。正確做法:用 text.splitlines()(PyQt內(nèi)置方法,自動處理換行符)。
第六步:為什么需要「類結構」?(小白的終極困惑)
常見錯誤:把所有代碼寫在全局(導致變量混亂?。?/p>
正確邏輯:用類封裝所有功能→ 代碼清晰 + 方便綁定槽函數(shù)
為什么這樣寫?
class SimplePad(QMainWindow): # 繼承自QMainWindow(讓記事本擁有窗口能力)
def __init__(self):
super().__init__() # 初始化父類(必須!)
self.initUI() # 自己寫的初始化方法
def initUI(self):
# 這里放所有界面初始化代碼(窗口、編輯器、菜單等)
# ? 為什么不用全局變量?因為:1. 代碼可讀性高 2. 便于多人協(xié)作 3. 避免變量覆蓋
思考題:
如果我刪掉 super().__init__() 會怎樣?
答案:窗口會報錯!因為 QMainWindow 的初始化邏輯沒執(zhí)行(PyQt要求必須調(diào)用父類構造函數(shù))。
最終代碼(完整版,帶詳細注釋)
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTextEdit, QFileDialog, QFontDialog, QMenuBar, QStatusBar
class SimplePad(QMainWindow):
def __init__(self):
super().__init__() # 1?? 必須初始化父類
self.initUI() # 2?? 初始化界面
def initUI(self):
# ?? 1. 設置窗口基礎屬性
self.setWindowTitle("SimplePad - 我的第一個記事本")
self.resize(800, 600) # 更大的窗口(方便看字數(shù))
# ?? 2. 創(chuàng)建文本編輯器(核心?。?
self.editor = QTextEdit()
self.setCentralWidget(self.editor) # 設置為窗口中央內(nèi)容
# ?? 3. 創(chuàng)建菜單欄(分步驟構建)
menubar = self.menuBar() # 獲取菜單欄
# 文件菜單
file_menu = menubar.addMenu("文件")
file_menu.addAction("新建").triggered.connect(self.editor.clear) # 新建 → 清空
file_menu.addAction("打開").triggered.connect(self.open_file) # 打開 → 綁定函數(shù)
save_action = file_menu.addAction("保存")
save_action.setShortcut("Ctrl+S") # 快捷鍵
save_action.triggered.connect(self.save_file) # 保存 → 綁定函數(shù)
# 格式菜單
format_menu = menubar.addMenu("格式")
format_menu.addAction("字體設置").triggered.connect(self.change_font)
# ?? 4. 狀態(tài)欄(字數(shù)統(tǒng)計)
self.statusBar().showMessage("準備就緒")
self.editor.textChanged.connect(self.update_status) # 關鍵!監(jiān)聽文字變化
# ?? 5. 打開文件(帶錯誤處理)
def open_file(self):
path, _ = QFileDialog.getOpenFileName(
self, "打開文件", "", "Text Files (*.txt);;All Files (*)"
)
if path: # ? 檢查用戶是否選擇了文件
with open(path, 'r', encoding='utf-8') as f:
self.editor.setText(f.read())
self.statusBar().showMessage(f"已打開: {path}")
# ?? 6. 保存文件(帶用戶友好提示)
def save_file(self):
path, _ = QFileDialog.getSaveFileName(
self, "保存文件", "", "Text Files (*.txt)"
)
if path:
content = self.editor.toPlainText() # ? 純文本!
with open(path, 'w', encoding='utf-8') as f:
f.write(content)
self.statusBar().showMessage(f"已保存: {path}")
# ?? 7. 字體設置(用標準對話框)
def change_font(self):
font, ok = QFontDialog.getFont()
if ok:
self.editor.setFont(font)
# ?? 8. 字數(shù)統(tǒng)計(實時更新?。?
def update_status(self):
text = self.editor.toPlainText()
char_count = len(text)
line_count = len(text.splitlines()) # ? 正確處理換行符!
self.statusBar().showMessage(f"字數(shù): {char_count} | 行數(shù): {line_count}")
# ?? 啟動程序
if __name__ == "__main__":
app = QApplication(sys.argv)
window = SimplePad()
window.show()
sys.exit(app.exec())
以上就是教你30分鐘使用Python制作自己的記事本的詳細內(nèi)容,更多關于Python記事本的資料請關注腳本之家其它相關文章!
相關文章
Python3.5 win10環(huán)境下導入kera/tensorflow報錯的解決方法
這篇文章主要介紹了Python3.5 win10環(huán)境下導入keras/tensorflow報錯的解決方法,較為詳細的分析了Python3.5在win10環(huán)境下導入keras/tensorflow提示錯誤的原因與相關解決方法,需要的朋友可以參考下2019-12-12
2026年最值得投入學習的PythonAI框架top10排行榜
本文推薦了2026年最值得投入學習的PythonAI框架,從Num社區(qū)活躍度、生產(chǎn)就就緒度、學習曲線和前景指數(shù)四個維度綜合評分,這些框架適用于不同從數(shù)據(jù)分析師到企業(yè)AI應用工程師的各種角色2026-04-04
PyQt6/PySide6中QTreeView類的實現(xiàn)
QTreeView是PyQt6或PySide6庫中用于顯示分層數(shù)據(jù)的控件,本文主要介紹了PyQt6/PySide6中QTreeView類的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2025-04-04

