【经验积累】使用 ConfigParser 保存UI界面参数

本文介绍了一种使用ConfigParser在Python中实现配置文件参数实时保存与读取的方法,通过字典存储配置项,确保软件重启后仍能记住并加载上次设置的参数,特别适用于小型工具软件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在项目中需要一个简单的参数配置工具,逻辑比较简单,但是有个需求:希望之前设置的参数能在下次打开的时候能记住之前的参数
在这里插入图片描述


问题解决

既然要保存数据 那就要使用ConfigParser,于是建立一个配置数据的字典,然后实时将字典的值保存到配置文件中

# -*- coding: utf-8 -*-
'''
# -*- coding: utf-8 -*-
'''
* File Name   : setting.py
* Description : 解析配置文件模块
* Input       : None
# '''

import ConfigParser
from collections import OrderedDict

# 研发TAB 配置参数配置值选项
save_conf_dict = {"com": "COM4",
                  "ntc0": 0,
                  "pwr": 0,
                  "pwr_val"  : 2500,
                  "ntc1_c1r1": 0,
                  "ntc1_c1r2": 0,
                  "ntc1_c2r1": 103,
                  "ntc1_c2r2": 10175,
                  "ntc1_c3r1": 155,
                  "ntc1_c3r2": 10229,
                  "ntc1_c4r1": 203,
                  "ntc1_c4r2": 10168,
                  "ntc1_c5r1": 252,
                  "ntc1_c5r2": 10140,
                  "ntc1_c6r1": 302,
                  "ntc1_c6r2": 10094,
                  "ntc1_c7r1": 351,
                  "ntc1_c7r2": 9981,
                  "ntc1_c8r1": 403,
                  "ntc1_c8r2": 9987,
                }

# 当前页操作记录函数
tab_dict = {"tab_idx": 0}

# 生产TAB
fac_conf_dict = {"com": "COM4",
                 "usb": "USB0::0x0957::0x0618::MY52120051::INSTR",
                 }

class setting_decode():
  def __init__(self, file_path):
    self.dtb = OrderedDict({"CONF": save_conf_dict,
                            "TAB": tab_dict,
                            "FAC": fac_conf_dict,
                            })
    self.is_file = False
    self.config = ConfigParser.ConfigParser()
    try:
      self.config.readfp(open(file_path, "r"))
      self.is_file = True
    except:
      pass
    # 解析需要读取的配置文件的所有选项
    for title in self.dtb.keys():
      if not self.config.has_section(title):
        self.config.add_section(title)
      for item in self.dtb[title].keys():
        if not self.config.has_option(title, item):
          self.config.set(title, item, self.dtb[title][item])
        else:
          self.dtb[title][item] = self.config.get(title, item)
    # 保存配置数据
    if not self.is_file:
      with open(file_path, 'w') as configfile:
        self.config.write(configfile)

  def write_item(self, fun, item, value):
      self.dtb[fun][item] = value
      self.config.set(fun, item, value)
      self.config.write(open('default_setting.inf', "r+"))

用法的话只要在参数修改的地方调用对应的参数修改地方,就能实现数据的实时保存

# 类的实例化
self.setting = setting_decode('default_setting.inf')

# 启动的时候加载配置数据
def set_ui_init(self, conf_dict):
	self.ntc_edit.setText(str(conf_dict["ntc0"]))
	self.pwr_edit.setText(str(conf_dict["pwr"]))
	self.val_edit.setText(str(conf_dict["pwr_val"]))
	self.ntc_c1r1_edit.setText(str(conf_dict["ntc1_c1r1"]))
	self.ntc_c1r2_edit.setText(str(conf_dict["ntc1_c1r2"]))
	self.ntc_c2r1_edit.setText(str(conf_dict["ntc1_c2r1"]))
	self.ntc_c2r2_edit.setText(str(conf_dict["ntc1_c2r2"]))
	self.ntc_c3r1_edit.setText(str(conf_dict["ntc1_c3r1"]))
	self.ntc_c3r2_edit.setText(str(conf_dict["ntc1_c3r2"]))
	self.ntc_c4r1_edit.setText(str(conf_dict["ntc1_c4r1"]))
	self.ntc_c4r2_edit.setText(str(conf_dict["ntc1_c4r2"]))
	self.ntc_c5r1_edit.setText(str(conf_dict["ntc1_c5r1"]))
	self.ntc_c5r2_edit.setText(str(conf_dict["ntc1_c5r2"]))
	self.ntc_c6r1_edit.setText(str(conf_dict["ntc1_c6r1"]))
	self.ntc_c6r2_edit.setText(str(conf_dict["ntc1_c6r2"]))
	self.ntc_c7r1_edit.setText(str(conf_dict["ntc1_c7r1"]))
	self.ntc_c7r2_edit.setText(str(conf_dict["ntc1_c7r2"]))
	self.ntc_c8r1_edit.setText(str(conf_dict["ntc1_c8r1"]))
	self.ntc_c8r2_edit.setText(str(conf_dict["ntc1_c8r2"]))
	
# 程序中UI空间触发修改的地方
def set_ntc0_cb(self):
	ntc0 = self.get_edit_num(self.ntc_edit)
	self.setting.write_item("CONF", "ntc0", ntc0)
	scmd = UART_CMD.cmd_0x01(ntc0)
	self.uart_send(scmd)

总结

将字典作为配置参数,并实时保存到配置文件,在上电读取数据,是一个很好的实现数据防丢失的方式,在小工具上实现,能减少很多重复性的输入


后记(库BUG)

在使用 visa 库的是否发现,如果保存的数据中包含 “::” , 在下次启动的启动的时候,就会无法读取数据,并且强行关闭软件之后,保存的内容都变成了列表,出现异常之后修改的,存储数据,
在这里插入图片描述

  • 解决方式,在存储于读取包含这类字字符的地方,使用 其他符号转换一下,可以在内饰规避这个问题
    读取匹配:
usb_str = self.setting.dtb["FAC"]["usb"].replace("_", "::")
if usb_str == self.usbs_dict[item]:
	return usb_pos

存储数据:

usb_str = str(self.usb_com.currentText())
self.dyb_hw = self.rm.open_resource(usb_str)
self.usb_com_btn.setText(u"关闭")
usb_str = usb_str.replace("::", "_")
self.setting.write_item("FAC", "usb", usb_str)

最终的数据存储格式:

[FAC]
com = COM4
usb = ASRL5_INSTR

如此修改之后,就没有再次发现这个配置文件出现异常了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值