JSON實現動態按鈕管理的Python應用

在開發桌面應用程序時,動態生成用戶界面元素并根據配置文件靈活管理是一項常見需求。本文將介紹如何使用Python的wxPython庫結合JSON配置文件,開發一個支持動態按鈕創建、文件執行和配置管理的桌面應用程序。該應用允許用戶通過設置界面配置按鈕名稱和關聯的Python腳本,自動生成按鈕并支持腳本執行,同時將配置持久化保存到JSON文件中。

C:\pythoncode\new\output\DynamicButtonRunPy.py

項目背景

該應用的目標是實現以下功能:

  1. 動態按鈕生成:根據JSON配置文件動態創建按鈕,按鈕顯示中文名稱,點擊后執行指定的Python腳本。
  2. 設置界面:提供一個設置窗口,允許用戶配置初始路徑、按鈕名稱和關聯的Python腳本。
  3. 文件管理:為每個按鈕創建獨立文件夾,將選中的Python腳本復制到對應文件夾,并記錄路徑。
  4. 代碼預覽:點擊按鈕時,在主窗口的文本區域顯示關聯Python腳本的源代碼。
  5. 配置持久化:將所有配置信息保存到JSON文件中,支持后續加載。

以下是實現該應用的詳細步驟和代碼解析。

技術棧

  • Python 3.x:核心編程語言。
  • wxPython:用于構建跨平臺的GUI界面。
  • JSON:用于存儲和加載配置信息。
  • 標準庫osshutil用于文件操作,subprocess用于執行Python腳本。

實現步驟

1. 項目結構

項目主要包含以下文件:

  • main.py:主程序文件,包含GUI邏輯和核心功能。
  • config.json:配置文件,存儲按鈕和路徑信息(運行時自動生成)。

2. 主窗口設計

主窗口(MainFrame類)包含以下主要組件:

  • 菜單欄:包含“選項”菜單,點擊“設置”打開配置窗口。
  • 按鈕面板:使用wx.WrapSizer動態排列按鈕。
  • 文本區域:使用wx.TextCtrl(多行只讀模式)顯示Python腳本的源代碼。

主窗口通過以下步驟初始化:

  1. 加載config.json配置文件(若不存在則創建默認配置)。
  2. 初始化菜單欄和GUI組件。
  3. 根據配置文件動態生成按鈕。

代碼片段(主窗口初始化):

class MainFrame(wx.Frame):def __init__(self):super().__init__(None, title="動態按鈕程序", size=(800, 600))self.config = self.load_config()self.init_ui()self.load_buttons()def load_config(self):try:with open('config.json', 'r', encoding='utf-8') as f:return json.load(f)except FileNotFoundError:return {'base_path': '', 'buttons': []}

3. 動態按鈕生成

按鈕根據config.json中的buttons列表動態生成。每個按鈕綁定一個點擊事件,觸發時:

  1. 讀取關聯Python腳本的源代碼并顯示在文本區域。
  2. 使用subprocess.run執行腳本。

按鈕生成代碼:

def load_buttons(self):self.button_sizer.Clear(True)for btn_config in self.config.get('buttons', []):btn = wx.Button(self.button_panel, label=btn_config['name'])btn.path = btn_config['path']btn.Bind(wx.EVT_BUTTON, self.on_button_click)self.button_sizer.Add(btn, 0, wx.ALL, 5)self.button_panel.Layout()

點擊事件處理:

def on_button_click(self, event):button = event.GetEventObject()py_path = button.pathtry:with open(py_path, 'r', encoding='utf-8') as f:self.memo.SetValue(f.read())except Exception as e:self.memo.SetValue(f"讀取文件失敗: {str(e)}")try:subprocess.run(['python', py_path], check=True)except Exception as e:wx.MessageBox(f"執行文件失敗: {str(e)}", "錯誤", wx.OK | wx.ICON_ERROR)

4. 設置窗口設計

設置窗口(SettingsDialog類)是一個模態對話框,包含以下組件:

  • 路徑選擇器:使用DirBrowseButton選擇初始路徑。
  • 文本輸入框:輸入按鈕名稱。
  • 文件選擇器:使用FileBrowseButton選擇Python腳本。
  • 保存/取消按鈕:保存配置或關閉窗口。

保存邏輯:

  1. 驗證輸入完整性。
  2. 根據選擇的Python腳本文件名創建同名文件夾。
  3. 將腳本復制到新文件夾。
  4. 更新配置并保存到config.json

代碼片段(保存邏輯):

def on_save(self, event):button_name = self.name_input.GetValue()py_file = self.file_browser.GetValue()base_path = self.dir_browser.GetValue()if not all([button_name, py_file, base_path]):wx.MessageBox("請填寫所有字段", "錯誤", wx.OK | wx.ICON_ERROR)returnfolder_name = os.path.splitext(os.path.basename(py_file))[0]target_folder = os.path.join(base_path, folder_name)os.makedirs(target_folder, exist_ok=True)target_file = os.path.join(target_folder, os.path.basename(py_file))shutil.copy(py_file, target_file)if 'buttons' not in self.config:self.config['buttons'] = []self.config['base_path'] = base_pathself.config['buttons'].append({'name': button_name,'path': target_file,'folder': target_folder})with open('config.json', 'w', encoding='utf-8') as f:json.dump(self.config, f, ensure_ascii=False, indent=4)self.EndModal(wx.ID_OK)

5. JSON配置文件

config.json的結構如下:

{"base_path": "/path/to/base","buttons": [{"name": "按鈕1","path": "/path/to/base/script1/script1.py","folder": "/path/to/base/script1"},{"name": "按鈕2","path": "/path/to/base/script2/script2.py","folder": "/path/to/base/script2"}]
}

配置文件通過json模塊讀寫,確保支持中文字符(使用ensure_ascii=False)。

6. 運行程序

程序入口:

if __name__ == '__main__':app = wx.App()frame = MainFrame()frame.Show()app.MainLoop()

運行后,主窗口顯示動態按鈕,點擊“選項 -> 設置”打開配置窗口,完成配置后自動更新按鈕列表。

使用方法

  1. 運行main.py,首次運行會創建空的config.json
  2. 點擊“選項 -> 設置”,在設置窗口中:
    • 選擇初始路徑。
    • 輸入按鈕名稱。
    • 選擇Python腳本。
    • 點擊“保存”。
  3. 新按鈕將出現在主窗口,點擊按鈕可查看源代碼并執行腳本。
  4. 配置信息自動保存到config.json

運行結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78027.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

序章:寫在前面

目錄 為什么要學習 Python?那么,Python 到底是什么呢?Python 的用戶多嗎?Python 的語法究竟是怎樣的?C 語言JavaPython Python 好學嗎? 為什么要學習 Python? 這個問題或許會讓不少人感到不解。…

onlyoffice歷史版本功能實現,版本恢復功能,編輯器功能實現 springboot+vue2

文章目錄 oonlyoffice歷史版本功能實現 (編輯器功能實現)springbootvue2前提 需要注意把這個 (改成自己服務器的ip或者域名) 改成 自己服務器的域名或者地址1. onloyoffice 服務器部署 搜索其他文章2. 前段代碼 vue 22.1 需要注意把這個 (改成自己服務器…

解決ubuntu server修改為中文后亂碼問題(改回英文)

操作步驟 1.安裝英文語言包 sudo apt-get install language-pack-en2.編輯/etc/default/locale文件 sudo vim /etc/default/locale修改為以下內容: LANG"en_US.UTF-8" LANGUAGE"en_US:en" LC_ALL"en_US.UTF-8"3.應用配置 sudo l…

安卓的Launcher 在哪個環節進行啟動

安卓Launcher在系統啟動過程中的關鍵環節啟動,具體如下: 內核啟動:安卓設備開機后,首先由引導加載程序啟動Linux內核。內核負責初始化硬件設備、建立內存管理機制、啟動系統進程等基礎工作,為整個系統的運行提供底層支…

數據通信學習筆記之OSPF其他內容2

OSPF 與 BFD 聯動 網絡上的鏈路故障或拓撲變化都會導致設備重新進行路由計算,所以縮短路由協議的收斂時間對于提高網絡的性能是非常重要的。 OSPF 與 BFD 聯動就是將 BFD 和 OSPF 關聯起來,一旦與鄰居之間的鏈路出現故障,BFD 對完品以&…

數據庫原理及應用mysql版陳業斌實驗四

🏝?專欄:Mysql_貓咪-9527的博客-CSDN博客 🌅主頁:貓咪-9527-CSDN博客 “欲窮千里目,更上一層樓。會當凌絕頂,一覽眾山小。” 目錄 實驗四索引與視圖 1.實驗數據如下 student 表(學生表&…

[密碼學實戰]密評考試訓練系統v1.0程序及密評參考題庫(獲取路徑在文末)

[密碼學實戰]密評考試訓練系統v1.0程序及密評參考題庫 引言:密評考試的重要性與挑戰 商用密碼應用安全性評估(簡稱"密評") 作為我國密碼領域的重要認證體系,已成為信息安全從業者的必備技能。根據國家密碼管理局最新數據,截至2024年6月,全國僅有3000余人持有…

藍橋杯練習題2

動態規劃 動態規劃三大題型:計數問題、最值問題、存在性問題; 【最小權值】-- 最值問題 【題目分析】 import java.util.Arrays; Arrays類中的一個方法:Arrays.fill(int[] m,int n) //給 int 類型(或者char類型/Long類型...)的數組全部空間…

【集群IP管理分配技術_DHCP】二、DHCP核心功能與技術實現

一、智能 IP 地址分配功能與技術實現? 1.1 功能概述? 智能 IP 地址分配是 DHCP 中間件的核心功能之一,它打破了傳統 DHCP 固定的分配模式,能夠根據網絡的實時狀態、客戶端類型、接入位置等多種因素,動態且合理地分配 IP 地址。例如&#…

實現AWS Lambda函數安全地請求企業內部API返回數據

需要編寫一個Lambda函數在AWS云上運行,它需要訪問企業內部的API獲取JSON格式的數據,企業有網關和防火墻,API有公司的okta身份認證,通過公司的域賬號來授權訪問,現在需要創建一個專用的域賬號,讓Lambda函數訪問Secret Manager,來獲取賬號密碼,然后通過配置訪問公司內部A…

子網劃分的學習

定長子網劃分(Fixed-length Subnetting) 也叫做固定長度子網劃分,是指在一個IP網絡中,把網絡劃分成若干個大小相等的子網,每個子網的子網掩碼長度是一樣的。 一、定長子網劃分的背景 在早期的IP地址分配中&#xff0…

3.QT-信號和槽|自定義槽函數|自定義信號}自定義的語法}帶參數的信號和槽(C++)

信號和槽 Linux信號 Signal 系統內部的通知機制. 進程間通信的方式. 信號源:誰發的信號.信號的類型:哪種類別的信號信號的處理方式:注冊信號處理函數,在信號被觸發的時候自動調用執行. Qt中的信號和Linux中的信號,雖…

如何在 Element UI 中優雅地使用 `this.$loading` 顯示和隱藏加載動畫

如何在 Element UI 中優雅地使用 this.$loading 顯示和隱藏加載動畫 在現代 Web 應用開發中,用戶體驗至關重要。當執行耗時操作(如網絡請求或數據處理)時,顯示一個友好的加載動畫可以讓用戶知道系統正在工作,而不是卡…

動態加載內容時selenium如何操作?

當處理動態加載的內容時,Selenium 是一個非常強大的工具,因為它可以模擬真實用戶的瀏覽器行為,等待頁面元素加載完成后再進行操作。以下是使用 Selenium 獲取動態加載內容的詳細步驟和代碼示例。 一、安裝 Selenium 和 ChromeDriver &#…

力扣第446場周賽

有事沒趕上, 賽后模擬了一下, 分享一下我的解題思路和做題感受 1.執行指令后的得分 題目鏈接如下:力扣 給你兩個數組:instructions 和 values,數組的長度均為 n。 你需要根據以下規則模擬一個過程: 從下標 i 0 的第一個指令開…

三維點擬合平面ransac c++

理論 平面的一般定義 在三維空間中,一個平面可以由兩個要素唯一確定: 法向量 n(a,b,c):垂直于平面的方向 平面上一點 平面上任意一點 p(x,y,z) 滿足: ( p ? p 0 ) ? n 0 (p - p0) * n 0 (p?p0)?n0 即 a ( x ? x 0 ) …

基于LSTM-AutoEncoder的心電信號時間序列數據異常檢測(PyTorch版)

心電信號(ECG)的異常檢測對心血管疾病早期預警至關重要,但傳統方法面臨時序依賴建模不足與噪聲敏感等問題。本文使用一種基于LSTM-AutoEncoder的深度時序異常檢測框架,通過編碼器-解碼器結構捕捉心電信號的長期時空依賴特征&#…

Docker 部署 PostgreSQL 數據庫

Docker 部署 PostgreSQL 數據庫 基于 Docker 部署 PostgreSQL 數據庫一、拉取 PostgreSQL 鏡像二、運行 PostgreSQL 容器三、運行命令參數詳解四、查看容器運行狀態 基于 Docker 部署 PostgreSQL 數據庫 一、拉取 PostgreSQL 鏡像 首先,確保你的 Docker 環境已正確…

MySQL性能調優(四):MySQL的執行原理(MYSQL的查詢成本)

文章目錄 MySQL性能調優數據庫設計優化查詢優化配置參數調整硬件優化 1.MySQL的執行原理-21.1.MySQL的查詢成本1.1.1.什么是成本1.1.2.單表查詢的成本1.1.2.1.基于成本的優化步驟實戰1. 根據搜索條件,找出所有可能使用的索引2. 計算全表掃描的代價3. 計算使用不同索…

用 Go 優雅地清理 HTML 并抵御 XSS——Bluemonday

1、背景與動機 只要你的服務接收并回顯用戶生成內容(UGC)——論壇帖子、評論、富文本郵件正文、Markdown 等——就必須考慮 XSS(Cross?Site Scripting)攻擊風險。瀏覽器在解析 HTML 時會執行腳本;如果不做清理&#…