Python: 基于DearPyGUI的环境变量查看器

2023-11-09


在这里插入图片描述

1. 目的

无论是 Windows 还是 Linux 下, 编辑环境变量总是绕不开的一个基本功。也许你已经熟练使用 vim 来查询和就地替换 PATH, 也许你更喜欢在当前 shell 中临时 export 变量, 又或者你更喜欢 Windows 下的图形界面方式的查看和修改环境变量… 本文带来稍微硬核一点的思路: 使用 Python 查询所有的环境变量, 并使用 DearPyGUI 进行显示。

2. 效果

在这里插入图片描述

3. 实现思路

获取环境变量

Python 自带的 os.environ() 可以获取环境变量, 不过它只提供当前进程下的结果, 一旦在外部进程中修改了环境变量, os.environ() 并不能感知到。 对于 Windows 来说, 可以从注册表中获取最新的环境变量, 对应的 Python 模块是 winreg.

分隔环境变量取值

绝大多数环境变量是 key=value 的形式, value 是一个具体的字符串。
少数环境变量如 PATH , 取值是形如 key=value1;value2;...key=value1:value2:... 形式, 根据不同操作系统,分隔符不同,共同特点是 value 是字符串, 需要 split 后再显示为多行。

界面显示

DearImGUI 提供了很棒的显示思路, DearPyGUI 则封装了 DearImGUI. 按官方 Demo 修改即可初步达到显示效果, 其他则可以自行 hack 源码寻找灵感。

4. 代码实现

安装依赖

pip install dearpygui

编写源码:
env_var_editor.py:

######################################################################
# Env var editor
# Author: ChrisZZ <imzhuo@foxmail.com>
# Homepage: https://github.com/zchrissirhcz
######################################################################
import dearpygui.dearpygui as dpg
import sledpkg_env_var as spev
import os
import sledpkg as sp

dpg.create_context()

def env_var_value_callback(sender, app_data, user_data):
    print(f"[env_var_value_callback] sender: {sender}, \t app_data: {app_data}, \t user_data: {user_data}")

def get_env_vars():
    env_var_names = dict(os.environ.items()).keys()
    res = dict()
    for name in env_var_names:
        res[name] = spev.get_env(name)
    return res

def get_sorted_env_var_names(env_vars):
    env_var_names = sorted(list(env_vars.keys()))
    return env_var_names

def get_env_var_value_list(env_var):
    if sp.is_windows():
        path_delimeter = ';'
    else:
        path_delimeter = ':'
    items = env_var.split(path_delimeter)
    res = [_ for _ in items if len(_) > 0]
    return res

def save_env_var():
    spev.print_path()
    spev.append_env('Path', [
        R'C:\Users\zz\work\sledpkg'
    ])
    print("-------------")
    spev.print_path()
    print("-------------")
    env_vars = get_env_vars()
    path = env_vars['PATH'].split(';')
    for item in path:
        print(item)

env_var_items = []
selected_env_var_name = None

def show_env_var_value_list(env_var_value_list):
    global env_var_items

    for item in env_var_items:
        dpg.delete_item(item)
    env_var_items = []

    for env_var_value in env_var_value_list:
        item = dpg.add_input_text(default_value=env_var_value, parent=env_var_value_group, callback=env_var_value_callback)
        env_var_items.append(item)

def add_env_var_value(sender, app_data, user_data):
    print(f"[add_env_var_value] sender: {sender}, \t app_data: {app_data}, \t user_data: {user_data}")
    global env_var_items
    item = dpg.add_input_text(default_value='', parent=env_var_value_group)#, callback=env_var_value_callback)
    env_var_items.append(item)
    print('  selected_env_var_name:', selected_env_var_name)
    print('  value is:', spev.get_env(selected_env_var_name))

with dpg.window():
    with dpg.group(horizontal=True):
        env_vars = get_env_vars()
        sorted_env_var_names = get_sorted_env_var_names(env_vars)

        with dpg.group(horizontal=False):
            dpg.add_text('Names')
            with dpg.group(horizontal=True):
                dpg.add_button(label='+')
                dpg.add_button(label='-')
            env_var_name_listbox = dpg.add_listbox(sorted_env_var_names, width=300, num_items=40)

        with dpg.group(horizontal=False):
            dpg.add_text('Values')
            with dpg.group(horizontal=True):
                dpg.add_button(label='+', callback=add_env_var_value)
                dpg.add_button(label='-')
                dpg.add_button(label='save', callback=save_env_var)
            env_var_value_list = get_env_var_value_list(sorted_env_var_names[0])
            env_var_value_group = dpg.add_group(horizontal=False)
            dummy = dpg.add_drag_float(label="float", parent=env_var_value_group, width=700)
            show_env_var_value_list(env_var_value_list)

def env_var_name_listbox_callback(sender, app_data, user_data):
    print(f"[env_var_name_listbox_callback] sender: {sender}, \t app_data: {app_data}, \t user_data: {user_data}")
    global selected_env_var_name
    selected_env_var_name = app_data

    env_var_name = app_data
    env_var_value = spev.get_env(env_var_name)
    env_var_value_list = get_env_var_value_list(env_var_value)
    print(env_var_value)
    show_env_var_value_list(env_var_value_list)


with dpg.item_handler_registry(tag="widget handler") as handler:
    dpg.set_item_callback(env_var_name_listbox, callback=env_var_name_listbox_callback)

dpg.create_viewport(title='Environment Variable Viewer')
dpg.setup_dearpygui()

dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python: 基于DearPyGUI的环境变量查看器 的相关文章

  • 尝试读取转储时“无法加载符号”

    我的一个应用程序有时会在 Win XP 计算机上导致 BSOD 为了了解更多信息 我加载了生成的 dmp 文件 来自 C Windows Minidump 但在执行此操作时在大部分读数中收到此消息 Symbols can not be lo
  • 打开文件路径在 python 中不起作用[重复]

    这个问题在这里已经有答案了 我正在编写一个数据库程序 personica 是我的测试主题 我通常在文件路径的位置有一个变量 但出于测试和演示的目的 我只有一个字符串 在我的计算机上的这个确切位置有一个文本文件 顺便说一句 因为我很偏执 所以
  • 如何使用格式保存 Tkinter 文本小部件的内容

    我在 python 中使用 Tkinter 在文本窗口中显示输出 我发现使用 get 功能我可以从此窗口检索文本内容 但我有用不同背景颜色标记的文本部分 是否可以将内容与这些颜色一起复制到文件 例如 html 或 doc 中 没有对你想要的
  • 使用 scipy、python、numpy 进行非线性 e^(-x) 回归

    下面的代码为我提供了一条最佳拟合线的平坦线 而不是沿着 e x 模型的一条适合数据的漂亮曲线 谁能告诉我如何修复下面的代码以使其适合我的数据 import numpy as np import matplotlib pyplot as pl
  • 我可以在pycharm中的断点处进入交互模式吗

    我是一个相当新的 Pycharm 3 用户 正在从事 django 项目 我可以在 pycharm3 中的断点处进入交互模式吗 这可能吗 当程序在断点处停止时 我尝试过工具 gt 打开调试命令行 但我没有看到控制台打开 我怎样才能让它发挥作
  • 如何使用Peewee查询多个相似的数据库?

    我遇到了使用 Peewee 查询多个数据库的问题 我有 2 个现有的 mysql 数据库 让我们将它们命名为 A 和 B 结构相似 因为它是两个 Bugzilla 数据库 我使用 Pwiz 生成模型 modelsA py 和 modelsB
  • 在 Python 中通过网络发送对象的最佳方式是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要通过网络发送对象 我将使用 Twisted 并且我刚刚开始查看它的文档 据我所知 python实现套接字的唯一方式是通过文本 那么我如何使
  • Python:两个列表之间的成对比较:列表 a >= 列表 b?

    如果我想检查列表中的所有元素 a 1 2 3 6 大于或等于另一个列表中对应的元素 b 0 2 3 5 如果 a i gt b i 对于所有i的 则返回 true 否则返回 false 这有逻辑功能吗 比如a gt b 谢谢 你可以这样做
  • 在python中检测按下了哪些键

    我需要知道现在按下的是哪个键 我不想捕获一些特定的按键来触发事件或类似的事情 我想知道现在按下了哪些键并显示它们的列表 我还需要捕获特殊键 如 F1 F12 shift alt home windows 等 基本上是键盘上的所有键 我如何在
  • Python-使用元组作为列表索引[重复]

    这个问题在这里已经有答案了 我有一个元组列表 tuples list 1 0 2 3 3 2 2 0 我想访问二维数组的元素a例如 使用其中一些元组 for i in range 3 print a tuples list i 应该输出的值
  • 如何仅在按下某个键时触发鼠标单击?在Python中

    我想制作一个程序 或者当我单击某个键时 鼠标会自动单击 只要我单击该键 如果我不单击该键 它就会停止 我不希望只在触摸按键一次时才发生点击 而是只要按住按键就发生点击 也可以像雷蛇突触鼠标一样按下鼠标左键触发点击 任何想法 EDIT 1 这
  • 如何动态选择要在flask中使用的模板目录?

    默认情况下 Flask 使用存储在 template 目录中的模板文件 flaskapp application py templates hello html 有没有办法根据登录的用户动态选择模板目录 这就是我想要的目录结构 flaska
  • 内置模块位于哪里?

    我尝试查找列出的所有目录sys path但我找不到任何builtins py文件 那么它在哪里呢 从字面上看 该模块内置于 python 解释器中 gt gt gt import builtins gt gt gt builtins
  • 如何将动态数据传递给装饰器

    我正在尝试编写一个基本的 CRUD 控制器类来执行以下操作 下列的 class BaseCrudController model field validation template dir expose self template dir
  • `numpy.diff` 和 `scipy.fftpack.diff` 在微分时给出不同的结果

    我正在尝试计算一些数据的导数 并且正在尝试比较有限差分的输出和谱方法的输出 但结果却截然不同 我无法弄清楚到底为什么 考虑下面的示例代码 import numpy as np from scipy import fftpack as sp
  • 如何使用 PySpark 预处理图像?

    我有一个项目 需要为 1 设置大数据架构 AWS S3 SageMaker 的概念验证使用 PySpark 预处理图像 2 执行 PCA and 3 训练一些机器或深度学习模型 我的问题是了解如何使用 PySpark 操作图像数据 但无法在
  • 重写 __cmp__ python 函数

    嗨 我是压倒一切的 cmp 如果传递的第二个对象是None 或者如果它不是一个实例someClass 然后返回 1 我不明白这里到底发生了什么 class someClass def cmp self obj if obj None ret
  • 如何通过解析导入来组合并获取单个 Python 文件

    我正在尝试获取单个 Python 文件作为输出 我有一个 Python 脚本 其中有多个此类导入 from that import sub 导入来自所有本地模块 而不是来自系统或 Python 库 有什么方法可以解决这些问题并获得一个完整的
  • 如何使用多阶段构建减小 python (docker) 图像大小?

    我正在寻找一种使用 python 和 Dockerfile 创建多阶段构建的方法 例如 使用以下图像 第一张图片 安装所有编译时要求 并安装所有需要的 python 模块 第二张图片 将所有已编译 构建的包从第一个映像复制到第二个映像 而不
  • 收到 Python 错误“来自:无法读取 /var/mail/Bio”

    我正在运行一个 bio python 脚本 这会导致以下错误 from can t read var mail Bio 由于我的脚本与邮件没有任何关系 我不明白为什么我的脚本在 var mail 中查找 这里似乎有什么问题 我怀疑这会有帮助

随机推荐

  • Java常用类:System类

    文章目录 System类概述 1 arraycopy 方法 概述 语法 举例 2 currentTimeMillis 方法 概述 语法 举例 3 gc 方法 概述 语法 举例 4 exit int status 方法 概述 语法 举例 Sy
  • openwrt18.06.4配置strongswan对接山石网科(hillstone)记录①

    首先感谢https blog csdn net d9394952 article details 90734469 原贴作者 摸索了一个礼拜 将过程记录如下 首先将路由器连上网 更新opkg root OpenWrt ping www ba
  • aivms--CentOS7.6安装/JDK1.8/ThingsBoard CE /PostgreSQL

    先决条件 yum install y nano wget yum install y https dl fedoraproject org pub epel epel release latest 7 noarch rpm 1 安装JDK8
  • Catowice City【Codeforces 1248 F】【BFS】

    Codeforces Round 594 Div 2 F 一开始是听闻有人说这是一道Tarjan好题 然后就点进来做了 但是想来想去 却想了个另类的法子 我们可以看到 如果N个人都要选择的话 那么每个人都只能是审判者 或者是参赛者 所以 我
  • hutool工具常用API

    hutool工具常用API 依赖 工具API 1 convert 2 DataUtil 3 StrUtil 4 ClassPathResource 5 ReflectUtil 6 NumberUtil 7 BeanUtil 8 CollUt
  • 使用C++11变长参数模板 处理任意长度、类型之参数实例

    变长模板 变长参数是依靠C 11新引入的参数包的机制实现的 一个简单的例子是std tuple的声明 template
  • Python六大基本数据类型介绍

    Python基本数据类型 一 数字型 一 整型 二 浮点型 三 布尔型 四 复数类型 二 字符串 三 列表 四 元组 五 集合 六 字典 一 数字型 一 整型 1 整型 int 在数字中 正整数 0 负整数都称为整型 例 intvar 10
  • 零知识证明zkSNARK

    最近接触学习零知识证明 很是头疼 没有一些背景知识 只能硬看了 而且也没有别的好方法 为什么要学习零知识证明 因为区块链的去中心化 导致信息都是公开透明的 比特币 以太坊 EOS等目前绝大部分项目区块链上的交易都是公开的 发送者的地址 金额
  • 试用版MindMaster思维导图转XMind方法分享

    在用MindMaster做导图的时候主题总是达到上限 于是想换成没有上限的XMind 就打算把已经做好的导图转到XMind上 现在网上的方法是通过导出docx文件或者复制大纲到word中然后再复制到XMind中 但受试用版限制 没办法导出w
  • 调用兄弟目录中的模块

    使用sys path append把父目录的加到模块搜索路径列表中即可 下面是具体原理分析 比如目前的目录结构如下 parDir dir1 test1 py dir2 test2 py 现在我需用在test1 py中导入dir2的test1
  • 合泰BS8116A-3触摸芯片开发踩坑指南

    一 硬件说明 引脚图 接线 说明 由于用到了唤醒检测 所以KEY16引脚用作IRQ中断唤醒功能 未使用引脚拉低 二 IIC配置说明 1 最大波特率 实际单片机配置最好不要设置波特率100Khz容易出错 50Khz就可以了 2 从机地址 注意
  • OpenCV基本知识

    1 OpenCV概述 1 什么是OpenCV 开源C C 计算机视觉库 面向实时应用进行优化 跨操作系统 硬件 窗口管理器 通用图像 视频载入 存储和获取 由中 高层API构成 为Intel 公司的 Integrated Performan
  • Vue ly-tab组件使用

    Vue ly tab组件的使用 目录 Vue ly tab组件的使用 安装 引入 使用 安装 这里使用指定版本安装 如果安装其他版本使用方法可能不一致 npm install ly tab 2 1 2 S 或者 cnpm install l
  • 深入理解采样定理 + Matlab 仿真 Sa 函数的采样与恢复

    建议配合国宝老师的视频食用 信号与线性系统分析 吴大正 郭宝龙 文章目录 1 采样的说明 1 为什么要取样 2 什么是取样 2 采样定理 1 为什么要有奈奎斯特频率 2 什么是采样定理 3 信号的恢复 4 Matlab的Sa函数取样仿真 1
  • nginx通过四层代理实现端口转发

    公司原有的测试数据库在主机192 168 10 5上边 现在数据库转移到了192 168 10 4上 为了不让各个地方都需要更改地址 现在需要一个四层代理工具 将原来请求到192 168 10 5的3306端口转发到192 168 10 4
  • ChatGPT数据泄露,技术细节公布

    事件发生后 OpenAI 临时关闭了 ChatGPT 服务以调查问题 后续 Open AI 的首席执行官 Sam Altman 也亲自发了推文 承认他们确实遭遇了重大问题 不过当时并没有公布问题的细节 只表示是一个开源库的错误导致的 由于一
  • 支持WIN7的VSCode版本

    我有台13年底买的电脑 装的WIN7 使用时发现 最新的VSCode已经不支持WIN7 目前VSCode官网上写的最低支持WIN8 经过确认 最后支持WIN7的版本是1 70 3 不论32位还是64位 都是这个版本
  • easyui 下拉框联动

    supplierCode combobox onChange function n o var supplierCodes n join ajax type post url pageContext request contextPath
  • 前端代码 录音样式 类似微信发送语音

    先来上图 wxml代码 不是小程序的就换成div
  • Python: 基于DearPyGUI的环境变量查看器

    文章目录 1 目的 2 效果 3 实现思路 获取环境变量 分隔环境变量取值 界面显示 4 代码实现 1 目的 无论是 Windows 还是 Linux 下 编辑环境变量总是绕不开的一个基本功 也许你已经熟练使用 vim 来查询和就地替换 P