最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

280行Python代碼打造一個(gè)帶語法高亮的IDE

 更新時(shí)間:2026年05月06日 08:23:21   作者:winfredzhang  
本文詳細(xì)介紹了一個(gè)基于wxPython和Scintilla實(shí)現(xiàn)的桌面IDE的開發(fā)過程,涵蓋語法高亮,多線程處理,跨平臺I/O讀取等核心技術(shù),感興趣的小伙伴可以了解下

本文以 PyEditor v2(py_editor.py)的完整源碼為藍(lán)本,逐層拆解一個(gè)生產(chǎn)級桌面 IDE 的構(gòu)建邏輯。全文約 6000 字,涵蓋 wxPython 控件體系、Scintilla 語法高亮原理、多線程 I/O 流讀取、跨平臺差異處理、JSON 配置持久化、以及進(jìn)程生命周期管理六大主題。無論你是 wxPython 初學(xué)者,還是希望在自己的項(xiàng)目中嵌入代碼編輯能力的開發(fā)者,本文都能為你提供可直接復(fù)用的設(shè)計(jì)模式。

一、總體架構(gòu):三層結(jié)構(gòu),職責(zé)分明

在深入單個(gè)類之前,先從鳥瞰視角理解整個(gè)程序的組織方式。

py_editor.py
├── PythonEditor(stc.StyledTextCtrl 子類)
│     └── 負(fù)責(zé):語法高亮、行號、代碼折疊、縮進(jìn)指示
├── OutputPanel(wx.Panel 子類)
│     └── 負(fù)責(zé):彩色富文本輸出、只讀控制臺
└── MainFrame(wx.Frame 子類)
      ├── _build_ui()       UI 布局與控件裝配
      ├── _save/load_settings()  JSON 配置持久化
      ├── _refresh_proj_list()   目錄遍歷與項(xiàng)目發(fā)現(xiàn)
      ├── _load_file()      文件讀取與編輯器同步
      ├── _on_save/run/stop()    核心業(yè)務(wù)邏輯
      └── _on_close()       退出守衛(wèi)

這種分層方式有三個(gè)好處:視圖與邏輯解耦(編輯器不知道運(yùn)行邏輯)、狀態(tài)集中管理_cur_path_process、_proj_map 全在 MainFrame)、子組件可復(fù)用OutputPanel 可以直接移植到其他項(xiàng)目)。

二、語法高亮核心:PythonEditor與 Scintilla

2.1 為什么用wx.stc.StyledTextCtrl

wxPython 提供兩種多行文本控件:

控件優(yōu)點(diǎn)缺點(diǎn)
wx.TextCtrlAPI 簡單無語法高亮,性能差
wx.stc.StyledTextCtrlScintilla 引擎,專業(yè)級API 較復(fù)雜

StyledTextCtrl(STC)是 Scintilla 文本編輯組件的 wxPython 封裝。Scintilla 被 Notepad++、Code::Blocks、Geany 等編輯器廣泛使用,擁有詞法分析、代碼折疊、自動補(bǔ)全等專業(yè)特性。

2.2 詞法分析器的綁定

self.SetLexer(stc.STC_LEX_PYTHON)

這一行將內(nèi)置的 Python 詞法分析器綁定到控件上。Scintilla 內(nèi)置了數(shù)十種語言的詞法分析器(C、Java、HTML、SQL 等),通過 SetLexer 一行即可切換。綁定后,Scintilla 會在每次文本變更時(shí)自動進(jìn)行詞法分析,將文檔拆分為不同類型的 Token。

2.3 樣式系統(tǒng):Token → 顏色

Scintilla 的樣式系統(tǒng)基于"樣式編號"(Style Number)。每個(gè) Token 類型都有一個(gè)預(yù)定義的整數(shù)編號:

tok = {
    stc.STC_P_DEFAULT:      "#CDD6F4",   # 普通文本
    stc.STC_P_COMMENTLINE:  "#6C7086",   # 單行注釋 #...
    stc.STC_P_NUMBER:       "#FAB387",   # 數(shù)字字面量
    stc.STC_P_STRING:       "#A6E3A1",   # 字符串
    stc.STC_P_WORD:         "#CBA6F7",   # 關(guān)鍵字(def, if, for...)
    stc.STC_P_CLASSNAME:    "#F9E2AF",   # 類名
    stc.STC_P_DEFNAME:      "#89B4FA",   # 函數(shù)名
    stc.STC_P_OPERATOR:     "#89DCEB",   # 運(yùn)算符
    ...
}
for t, c in tok.items():
    self.StyleSetForeground(t, c)
    self.StyleSetBackground(t, "#1E1E2E")

這里使用了 Catppuccin Mocha 配色方案——一套在 GitHub 上擁有數(shù)千星的精心設(shè)計(jì)的暗色主題。每種 Token 類型都有獨(dú)立的前景色和背景色,實(shí)現(xiàn)精確的視覺區(qū)分。

關(guān)鍵細(xì)節(jié): 必須先調(diào)用 StyleClearAll() 讓所有樣式繼承 STC_STYLE_DEFAULT 的字體設(shè)置,再逐個(gè)覆蓋顏色。否則自定義字體不會生效。

2.4 關(guān)鍵字分級

self.SetKeyWords(0,
    "and as assert async await break class ...")  # 語言關(guān)鍵字(紫色)
self.SetKeyWords(1,
    "abs all any bin bool ... self cls ...")       # 內(nèi)建函數(shù)(青色)

Scintilla 支持最多 9 級關(guān)鍵字列表(SetKeyWords(0~8))。Python 詞法分析器默認(rèn)使用 0 和 1 兩級,分別對應(yīng) STC_P_WORDSTC_P_WORD2。通過給兩級關(guān)鍵字設(shè)置不同顏色,用戶可以直觀區(qū)分 for(控制流關(guān)鍵字)和 print(內(nèi)建函數(shù))。

2.5 行號與折疊邊距

Scintilla 支持最多 5 個(gè)左側(cè)"邊距"(Margin),每個(gè)邊距可獨(dú)立配置類型和寬度:

# 邊距 0:行號
self.SetMarginType(0, stc.STC_MARGIN_NUMBER)
self.SetMarginWidth(0, 50)

# 邊距 1:折疊標(biāo)記
self.SetMarginType(1, stc.STC_MARGIN_SYMBOL)
self.SetMarginMask(1, stc.STC_MASK_FOLDERS)
self.SetMarginSensitive(1, True)   # 允許鼠標(biāo)點(diǎn)擊
self.SetProperty("fold", "1")      # 啟用折疊解析

SetMarginSensitive(True) 是實(shí)現(xiàn)點(diǎn)擊折疊的關(guān)鍵——它讓該邊距響應(yīng) EVT_STC_MARGINCLICK 事件:

def _on_margin(self, e):
    if e.GetMargin() == 1:
        self.ToggleFold(self.LineFromPosition(e.GetPosition()))

點(diǎn)擊行號旁的折疊圖標(biāo),ToggleFold 會自動展開或折疊該塊。Scintilla 根據(jù) Python 的縮進(jìn)規(guī)則自動識別可折疊的代碼塊。

2.6 輔助視覺特性

# 當(dāng)前行高亮
self.SetCaretLineVisible(True)
self.SetCaretLineBackground("#313244")

# 縮進(jìn)指示線(虛線)
self.SetIndentationGuides(stc.STC_IV_LOOKBOTH)

# 右側(cè) 88 列參考線
self.SetEdgeMode(stc.STC_EDGE_LINE)
self.SetEdgeColumn(88)

這些都是專業(yè)編輯器的標(biāo)配。88 列參考線遵循 Black 格式化工具的默認(rèn)行長度(比 PEP 8 的 79 列更寬松,是現(xiàn)代 Python 項(xiàng)目的主流選擇)。

三、輸出面板:OutputPanel的彩色控制臺實(shí)現(xiàn)

class OutputPanel(wx.Panel):
    def append(self, text, color="#CDD6F4"):
        self.txt.SetDefaultStyle(wx.TextAttr(wx.Colour(color)))
        self.txt.AppendText(text)

wx.TextCtrl 配合 wx.TE_RICH2 樣式標(biāo)志支持富文本。SetDefaultStyle 在追加文字前設(shè)置當(dāng)前默認(rèn)樣式,AppendText 使用該樣式寫入文本。這種方式實(shí)現(xiàn)了簡潔的彩色輸出:

  • 白色 #CDD6F4:標(biāo)準(zhǔn)輸出(stdout)
  • 紅色 #F38BA8:錯(cuò)誤輸出(stderr)
  • 藍(lán)色 #89B4FA:系統(tǒng)信息(文件路徑、運(yùn)行提示)
  • 灰色 #6C7086:工作目錄等次要信息

wx.TE_READONLY 防止用戶誤修改輸出內(nèi)容,wx.BORDER_NONE 使控件與父面板無縫融合。

四、布局系統(tǒng):Sizer 與 SplitterWindow 的嵌套

4.1 wxPython 的布局哲學(xué)

wxPython 使用"Sizer"(布局管理器)而不是絕對像素坐標(biāo)來布局控件。這使得界面在不同 DPI、不同操作系統(tǒng)下都能正確縮放。本程序使用三層布局:

root_vbox(垂直 BoxSizer)
├── 工具欄 Panel(固定高度 54px)
├── 分割線 StaticLine
└── main_sp(水平 SplitterWindow)
      ├── left Panel(項(xiàng)目列表,210px 初始寬度)
      └── right_sp(垂直 SplitterWindow)
            ├── 編輯器 Panel(600px 初始寬度)
            └── 輸出 Panel(余下空間)

4.2 SplitterWindow 的關(guān)鍵參數(shù)

main_sp = wx.SplitterWindow(root, style=wx.SP_LIVE_UPDATE | wx.SP_3DSASH)
main_sp.SetMinimumPaneSize(80)
main_sp.SplitVertically(left, right_sp, sashPosition=210)
  • SP_LIVE_UPDATE:拖動分隔條時(shí)實(shí)時(shí)重繪,而不是松手后才刷新
  • SP_3DSASH:3D 風(fēng)格分隔條(在 Windows 上效果明顯)
  • SetMinimumPaneSize(80):防止拖動時(shí)將某一面板縮小到消失
  • sashPosition=210:初始分隔位置(像素)

4.3 工具欄的 Sizer 裝配

工具欄是一個(gè)橫向 BoxSizer,混合使用了固定控件和彈性間距:

tbs.Add(logo, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, 14)
tbs.AddSpacer(20)
# ... 添加各個(gè)控件 ...

wx.ALIGN_CENTER_VERTICAL 讓所有控件在 54px 高的工具欄中垂直居中對齊,是工具欄布局的標(biāo)準(zhǔn)寫法。

五、配置持久化:JSON 的讀寫策略

5.1 配置文件路徑的確定

_APP_DIR  = os.path.dirname(os.path.abspath(__file__))
_CFG_NAME = os.path.splitext(os.path.basename(__file__))[0]
_CFG_PATH = os.path.join(_APP_DIR, f"{_CFG_NAME}.json")

__file__ 獲取程序自身路徑,再用 os.path.splitext 去掉后綴,得到與程序同名的 JSON 文件路徑(如 py_editor.json)。這種策略的優(yōu)點(diǎn)是無需硬編碼文件名——改名后配置文件自動跟著改名,不會產(chǎn)生孤立配置。

工程提示: 生產(chǎn)級應(yīng)用通常應(yīng)將配置寫入用戶目錄(%APPDATA%~/.config/),避免程序目錄因權(quán)限問題無法寫入。對于單用戶工具,放在程序目錄更簡單直接。

5.2 保存的內(nèi)容

cfg = {
    "folder":   self.folder_ctrl.GetValue().strip(),
    "name":     self.name_ctrl.GetValue().strip(),
    "cur_path": self._cur_path,        # 上次打開的文件完整路徑
    "win_x": pos.x, "win_y": pos.y,   # 窗口位置
    "win_w": size.width, "win_h": size.height,  # 窗口尺寸
}

保存的是用戶狀態(tài),而不是程序內(nèi)部狀態(tài)。這遵循"配置應(yīng)反映用戶意圖"的原則:下次啟動時(shí),窗口回到上次的位置和大小,自動打開上次編輯的文件。

5.3 加載時(shí)的防御性編程

def _load_settings(self):
    if not os.path.isfile(_CFG_PATH):
        return                # 首次運(yùn)行,無配置文件,靜默跳過
    try:
        with open(_CFG_PATH, "r", encoding="utf-8") as f:
            cfg = json.load(f)
        # 每個(gè)字段都用 .get() 帶默認(rèn)值讀取
        folder = cfg.get("folder", "")
        ...
        cur = cfg.get("cur_path", "")
        if cur and os.path.isfile(cur):   # 文件可能已被刪除
            self._load_file(cur, silent=True)
    except Exception as e:
        print(f"[加載設(shè)置失敗] {e}")   # 失敗不崩潰,只打印

三層防御:

  1. 文件不存在時(shí)直接返回(首次運(yùn)行)
  2. 每個(gè)字段用 .get(key, default) 讀?。嫒菖f版配置)
  3. 恢復(fù)文件前檢查文件是否仍存在(文件可能被移動或刪除)

六、項(xiàng)目發(fā)現(xiàn):os.walk的遞歸目錄遍歷

6.1 設(shè)計(jì)決策:什么算一個(gè)"項(xiàng)目"?

程序約定:如果一個(gè)子目錄中存在與目錄同名的 .py 文件,則視其為項(xiàng)目。

例如:projects/hello/hello.py ?,projects/utils/helper.py ?(目錄名與文件名不同)。

這個(gè)約定簡單且自然——它與"保存"邏輯保持一致(保存時(shí)自動創(chuàng)建同名目錄和文件)。

6.2os.walk的遍歷邏輯

for dirpath, dirnames, filenames in os.walk(folder):
    dirnames.sort()   # 原地排序,確保遍歷順序穩(wěn)定
    for fname in sorted(filenames):
        if not fname.endswith(".py"):
            continue
        stem = fname[:-3]                          # 去掉 .py
        if os.path.basename(dirpath) == stem:      # 目錄名 == 文件主名
            full    = os.path.join(dirpath, fname)
            rel     = os.path.relpath(dirpath, folder)
            display = rel.replace(os.sep, " / ")   # 統(tǒng)一路徑分隔符為 " / "
            self._proj_map[display] = full
            self.proj_list.Append(display)

os.walk 默認(rèn)是深度優(yōu)先遍歷。dirnames.sort() 讓同級目錄按字母順序遍歷(os.walk 修改 dirnames 會影響遍歷順序)。os.path.relpath 將絕對路徑轉(zhuǎn)為相對路徑,讓列表顯示更簡潔:不顯示 /Users/alice/projects/hello,而是顯示 hello

_proj_map 是一個(gè)字典,將列表中的顯示名映射到實(shí)際文件路徑。這種"顯示名 → 數(shù)據(jù)"的映射模式在 UI 編程中極為常見,避免了在列表控件中存儲原始數(shù)據(jù)。

6.3 自動觸發(fā)刷新

self.folder_ctrl.Bind(wx.EVT_TEXT, self._on_folder_text)

def _on_folder_text(self, event):
    folder = self.folder_ctrl.GetValue().strip()
    if folder and os.path.isdir(folder):
        self._refresh_proj_list(folder)

監(jiān)聽文件夾輸入框的文字變化事件:用戶手動輸入路徑時(shí)(不僅是通過對話框選擇),只要路徑合法即自動刷新列表。這提升了鍵盤用戶的體驗(yàn)。

七、進(jìn)程管理:子進(jìn)程的啟動、監(jiān)控與終止

這是整個(gè)程序最復(fù)雜的部分,涉及多線程、跨平臺 I/O、進(jìn)程生命周期管理三個(gè)交叉問題。

7.1 為什么必須用線程?

wxPython(以及幾乎所有 GUI 框架)要求所有 UI 操作必須在主線程執(zhí)行。如果在主線程中阻塞等待子進(jìn)程輸出,整個(gè) UI 將凍結(jié)(無法移動窗口、按鈕無響應(yīng))。解決方案是在子線程中運(yùn)行進(jìn)程,通過 wx.CallAfter 將 UI 更新調(diào)度回主線程:

threading.Thread(target=_run, daemon=True).start()

# 子線程內(nèi)部:
wx.CallAfter(self.output.append, line, color)   # 安全地從子線程更新 UI

daemon=True 確保主窗口關(guān)閉時(shí)子線程自動退出,不會造成程序懸掛。

7.2 跨平臺的 stdout/stderr 混合讀取

同時(shí)讀取 stdoutstderr 是一個(gè)經(jīng)典難題。直接順序讀取會產(chǎn)生死鎖(進(jìn)程等待寫 stderr,而你在阻塞讀 stdout)。程序針對不同平臺使用了不同策略:

Unix/macOS(selectors 多路復(fù)用):

import selectors
sel = selectors.DefaultSelector()
sel.register(proc.stdout, selectors.EVENT_READ, "out")
sel.register(proc.stderr, selectors.EVENT_READ, "err")
open_fds = 2
while open_fds > 0:
    for key, _ in sel.select(timeout=0.1):
        line = key.fileobj.readline()
        if line:
            color = "#CDD6F4" if key.data == "out" else "#F38BA8"
            wx.CallAfter(self.output.append, line, color)
        else:
            sel.unregister(key.fileobj)
            open_fds -= 1
sel.close()

selectors 模塊是對 select/poll/epoll 系統(tǒng)調(diào)用的高層封裝。sel.select(timeout=0.1) 會等待任意一個(gè)文件描述符可讀,返回就緒的描述符列表。當(dāng) readline() 返回空字符串時(shí),說明該流已關(guān)閉(進(jìn)程結(jié)束),計(jì)數(shù)器 open_fds 遞減,兩個(gè)流都關(guān)閉后退出循環(huán)。這是真正的并發(fā)讀取,不會有任何死鎖風(fēng)險(xiǎn)。

Windows(雙線程讀取):

def _rd(stream, color):
    for line in stream:
        wx.CallAfter(self.output.append, line, color)
t1 = threading.Thread(target=_rd, args=(proc.stdout, "#CDD6F4"), daemon=True)
t2 = threading.Thread(target=_rd, args=(proc.stderr, "#F38BA8"), daemon=True)
t1.start(); t2.start(); t1.join(); t2.join()

Windows 上 selectors 僅支持 socket,不支持管道(pipe),因此改用兩個(gè)獨(dú)立線程分別阻塞讀取兩個(gè)流。join() 確保兩個(gè)流都讀完后才繼續(xù)執(zhí)行后續(xù)邏輯(檢查退出碼)。

7.3 退出碼的處理

proc.wait()
rc = proc.returncode
if rc == 0:
    wx.CallAfter(self.output.append,
                 f"\n? 進(jìn)程結(jié)束,退出碼: {rc}\n", "#A6E3A1")
else:
    wx.CallAfter(self.output.append,
                 f"\n? 進(jìn)程異常,退出碼: {rc}\n", "#F38BA8")

Unix 慣例:退出碼 0 表示正常結(jié)束,非 0 表示異常。Python 未捕獲異常時(shí)退出碼為 1。

7.4 工作目錄的切換

proc = subprocess.Popen(
    [sys.executable, py_path],
    ...
    cwd=cwd,   # cwd = os.path.dirname(py_path)
)

cwd 參數(shù)讓子進(jìn)程的工作目錄設(shè)置為腳本所在的子文件夾。這意味著腳本內(nèi)部的相對路徑(如 open("data.csv"))會相對于腳本目錄解析,而不是 IDE 的啟動目錄。這是 IDE 最基礎(chǔ)的行為之一,一行代碼即可實(shí)現(xiàn)。

7.5 停止進(jìn)程

def _on_stop(self, event):
    if self._process and self._process.poll() is None:
        self._process.terminate()

poll() 是非阻塞的進(jìn)程狀態(tài)檢查:返回 None 表示進(jìn)程仍在運(yùn)行,返回退出碼表示已結(jié)束。terminate() 在 Unix 上發(fā)送 SIGTERM,在 Windows 上調(diào)用 TerminateProcess。對于需要強(qiáng)制殺死的情況,可改用 kill()(Unix SIGKILL)。

八、文件加載的狀態(tài)同步

_load_file 是一個(gè)細(xì)節(jié)豐富的方法,負(fù)責(zé)加載文件后的全面狀態(tài)同步:

def _load_file(self, full_path, silent=False):
    with open(full_path, "r", encoding="utf-8") as f:
        code = f.read()

    self.editor.SetText(code)
    self.editor.EmptyUndoBuffer()    # ← 清空撤銷歷史

    self._cur_path = full_path
    stem = os.path.splitext(os.path.basename(full_path))[0]
    self.name_ctrl.SetValue(stem)    # ← 同步名稱輸入框

    # 在列表中高亮對應(yīng)項(xiàng)
    for i, (disp, path) in enumerate(self._proj_map.items()):
        if path == full_path:
            self.proj_list.SetSelection(i)
            break

    cwd = os.path.dirname(full_path)
    self._set_status(f"工作目錄: {cwd}", "#6C7086", field=1)  # ← 更新狀態(tài)欄

EmptyUndoBuffer() 的必要性: SetText() 會被記錄為一個(gè)可撤銷操作。如果不清空撤銷歷史,用戶按 Ctrl+Z 會撤銷掉整個(gè)文件內(nèi)容,回到空白狀態(tài)。清空后,撤銷歷史從當(dāng)前狀態(tài)重新開始,符合用戶預(yù)期。

silent 參數(shù): 程序啟動時(shí)恢復(fù)上次文件使用 silent=True,不向輸出面板追加加載消息。用戶主動點(diǎn)擊列表時(shí)使用 silent=False,會輸出加載路徑提示。這種"靜默/非靜默"模式是 UI 編程的常見技巧。

九、關(guān)閉守衛(wèi):_on_close的職責(zé)

def _on_close(self, event):
    if self._process and self._process.poll() is None:
        self._process.terminate()    # 關(guān)閉時(shí)殺掉子進(jìn)程
    self._save_settings()            # 保存配置
    event.Skip()                     # 允許窗口真正關(guān)閉

event.Skip() 是 wxPython 中容易踩坑的地方。綁定 EVT_CLOSE 后,必須調(diào)用 event.Skip() 才能讓窗口實(shí)際關(guān)閉。如果只處理事件而不調(diào)用 Skip(),窗口關(guān)閉事件會被消費(fèi)掉,窗口將無法關(guān)閉。

十、設(shè)計(jì)亮點(diǎn)與可改進(jìn)之處

亮點(diǎn)總結(jié)

設(shè)計(jì)決策實(shí)現(xiàn)效果
Scintilla 詞法分析器無需自己解析代碼,直接獲得專業(yè)級高亮
selectors + 雙線程的平臺適配跨平臺零死鎖的實(shí)時(shí)輸出流
_proj_map 字典列表顯示與文件路徑完全解耦
os.walk + 目錄名匹配無需配置文件即可發(fā)現(xiàn)所有項(xiàng)目
EmptyUndoBuffer加載文件后撤銷歷史正確重置
daemon=True 子線程主窗口關(guān)閉時(shí)線程自動清理
配置文件與程序同名重命名程序時(shí)配置自動跟隨

可進(jìn)一步擴(kuò)展的方向

1. 自動補(bǔ)全

Scintilla 內(nèi)置 AutoCompShow() 方法,配合 Python 的 jedi 庫可以實(shí)現(xiàn)上下文感知的代碼補(bǔ)全:

import jedi
script = jedi.Script(self.editor.GetText(), path=self._cur_path)
completions = script.complete(line, col)
words = "\n".join(c.name for c in completions)
self.editor.AutoCompShow(0, words)

2. 實(shí)時(shí)語法檢查

利用 py_compileast.parse 在保存時(shí)檢查語法錯(cuò)誤,將錯(cuò)誤行用紅色標(biāo)記顯示在行號邊距。

3. 多文件標(biāo)簽頁

將單一的編輯器替換為 wx.aui.AuiNotebook,每個(gè)標(biāo)簽頁承載一個(gè) PythonEditor 實(shí)例,即可支持同時(shí)編輯多個(gè)文件。

4. 虛擬環(huán)境支持

目前 sys.executable 使用運(yùn)行 IDE 的解釋器。增加虛擬環(huán)境選擇器(一個(gè)路徑輸入框),將可執(zhí)行路徑替換為 venv 內(nèi)的 python,即可讓每個(gè)項(xiàng)目使用獨(dú)立的依賴環(huán)境。

5. stdin 交互

當(dāng)前實(shí)現(xiàn)使用 PIPE 捕獲輸出,但沒有連接 stdin。如果腳本調(diào)用 input(),進(jìn)程會阻塞??梢栽谳敵雒姘宓撞刻砑右粋€(gè)輸入框,通過 proc.stdin.write() 向子進(jìn)程發(fā)送數(shù)據(jù)。

結(jié)語

PyEditor v2 用不到 300 行 Python 代碼實(shí)現(xiàn)了一個(gè)功能完整的桌面 IDE 原型,涵蓋了語法高亮、項(xiàng)目管理、進(jìn)程控制、配置持久化等所有核心特性。它的價(jià)值不在于替代 VS Code,而在于展示了如何用 wxPython 的標(biāo)準(zhǔn)工具集構(gòu)建專業(yè)級桌面應(yīng)用。

Scintilla 的強(qiáng)大、subprocess 的靈活、os.walk 的簡潔、selectors 的跨平臺優(yōu)雅——這些 Python 標(biāo)準(zhǔn)庫和第三方庫的組合,讓一個(gè)人用一個(gè)下午就能寫出在生產(chǎn)環(huán)境中可用的工具。這正是 Python 作為"膠水語言"最迷人的地方。

本文源碼完整可運(yùn)行,依賴安裝:pip install wxpython,Python 3.8+ 適用。

以上就是280行Python代碼打造一個(gè)帶語法高亮的IDE的詳細(xì)內(nèi)容,更多關(guān)于Python實(shí)現(xiàn)帶語法高亮IDE的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

石门县| 兰考县| 井陉县| 彰武县| 高安市| 印江| 康马县| 喜德县| 水城县| 和林格尔县| 公主岭市| 新营市| 松溪县| 恩施市| 呈贡县| 新民市| 靖西县| 西宁市| 读书| 上饶县| 枣庄市| 凤台县| 嘉义县| 吐鲁番市| 德州市| 洪江市| 丹阳市| 庆阳市| 桂平市| 高碑店市| 石台县| 宜川县| 双桥区| 汝南县| 潞西市| 渝中区| 怀来县| 文昌市| 寿阳县| 崇仁县| 博野县|