Python结合JSON实现动态按钮管理程序

 更新时间:2025年04月24日 08:16:48   作者:winfredzhang  
这篇文章主要为大家详细介绍了如何使用Python的wxPython库结合JSON配置文件,开发一个支持动态按钮创建,文件执行和配置管理的桌面应用程序,感兴趣的可以了解下

在开发桌面应用程序时,动态生成用户界面元素并根据配置文件灵活管理是一项常见需求。本文将介绍如何使用Python的wxPython库结合JSON配置文件,开发一个支持动态按钮创建、文件执行和配置管理的桌面应用程序。该应用允许用户通过设置界面配置按钮名称和关联的Python脚本,自动生成按钮并支持脚本执行,同时将配置持久化保存到JSON文件中。

项目背景

该应用的目标是实现以下功能:

  • 动态按钮生成:根据JSON配置文件动态创建按钮,按钮显示中文名称,点击后执行指定的Python脚本。
  • 设置界面:提供一个设置窗口,允许用户配置初始路径、按钮名称和关联的Python脚本。
  • 文件管理:为每个按钮创建独立文件夹,将选中的Python脚本复制到对应文件夹,并记录路径。
  • 代码预览:点击按钮时,在主窗口的文本区域显示关联Python脚本的源代码。
  • 配置持久化:将所有配置信息保存到JSON文件中,支持后续加载。

以下是实现该应用的详细步骤和代码解析。

技术栈

Python 3.x:核心编程语言。

wxPython:用于构建跨平台的GUI界面。

JSON:用于存储和加载配置信息。

标准库:os、shutil用于文件操作,subprocess用于执行Python脚本。

实现步骤

1. 项目结构

项目主要包含以下文件:

main.py:主程序文件,包含GUI逻辑和核心功能。

config.json:配置文件,存储按钮和路径信息(运行时自动生成)。

2. 主窗口设计

主窗口(MainFrame类)包含以下主要组件:

  • 菜单栏:包含“选项”菜单,点击“设置”打开配置窗口。
  • 按钮面板:使用wx.WrapSizer动态排列按钮。
  • 文本区域:使用wx.TextCtrl(多行只读模式)显示Python脚本的源代码。

主窗口通过以下步骤初始化:

  • 加载config.json配置文件(若不存在则创建默认配置)。
  • 初始化菜单栏和GUI组件。
  • 根据配置文件动态生成按钮。

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

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列表动态生成。每个按钮绑定一个点击事件,触发时:

  • 读取关联Python脚本的源代码并显示在文本区域。
  • 使用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.path
    try:
        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脚本。
  • 保存/取消按钮:保存配置或关闭窗口。

保存逻辑:

  • 验证输入完整性。
  • 根据选择的Python脚本文件名创建同名文件夹。
  • 将脚本复制到新文件夹。
  • 更新配置并保存到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)
        return
        
    folder_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_path
    self.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。

运行结果

到此这篇关于Python结合JSON实现动态按钮管理程序的文章就介绍到这了,更多相关Python JSON动态按钮程序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于python和flask实现http接口过程解析

    基于python和flask实现http接口过程解析

    这篇文章主要介绍了基于python和flask实现http接口过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 基于numpy中数组元素的切片复制方法

    基于numpy中数组元素的切片复制方法

    今天小编就为大家分享一篇基于numpy中数组元素的切片复制方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)

    Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)

    这篇文章主要介绍了Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • 解决Python3 被PHP程序调用执行返回乱码的问题

    解决Python3 被PHP程序调用执行返回乱码的问题

    今天小编就为大家分享一篇解决Python3 被PHP程序调用执行返回乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • python实现自动生成SQL语句

    python实现自动生成SQL语句

    在数据处理和管理中,SQL(Structured Query Language)是一种非常重要的语言,本文主要介绍了如何使用python实现自动生成SQL语句,需要的可以参考下
    2024-04-04
  • pytorch DataLoaderj基本使用方法详解

    pytorch DataLoaderj基本使用方法详解

    这篇文章主要为大家介绍了pytorch DataLoaderj基本使用方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Python装饰器实现几类验证功能做法实例

    Python装饰器实现几类验证功能做法实例

    下面小编就为大家带来一篇Python装饰器实现几类验证功能做法实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • python 爬取古诗文存入mysql数据库的方法

    python 爬取古诗文存入mysql数据库的方法

    这篇文章主要介绍了python 爬取古诗文存入mysql数据库的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • 在Django下创建项目以及设置settings.py教程

    在Django下创建项目以及设置settings.py教程

    今天小编就为大家分享一篇在Django下创建项目以及设置settings.py教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 使用Python封装excel操作指南

    使用Python封装excel操作指南

    这篇文章主要给大家介绍了关于使用Python封装excel操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论