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.mzph.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 时会执行脚本;如果不做清理&#…