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

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

