更新默认字典键值后,在PyQt脚本中无法获取更新内容
问题描述
我需要在将默认字典用于另一脚本的GUI展示前,为其添加新的键值对,于是实现了MyClass类:
class MyClass: def __init__(self): self.my_dict = { 'dict1' : { 'col1' : value1, 'col2' : value2, ... }, 'dict2' : { 'col1' : value1, 'col2' : value2, } ... } def set_attribute(self, dict, col, val): self.my_dict[dict][col] = val def set_attributes(self, dict, **kwargs): for col, val in kwargs.items(): self.set_attribute(dict, col, val) def get_attribute(self, dict, col): if dict in self.my_dict: return self.my_dict[dict].get(col) return None if __name__ == '__main__': my_obj = MyClass() # 注:原代码此处存在语法错误,get_attribute是MyClass的方法,不是字典的方法 value = my_obj.get_attribute('dict', 'col1') * .011 my_obj.set_attribute('dict1', 'col3', value)
在直接运行该类的测试代码时,更新字典添加新列的操作有效,但运行另一脚本main.py时,仅能获取默认字典内容,无法看到更新后的键值对。main.py代码如下:
from PyQt5 import QtWidgets from dictclass import MyClass class MainWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) print(myclass_obj.my_dict) if __name__ == '__main__': import sys myclass_obj = MyClass() app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
原因分析
- 测试代码的更新仅作用于本地实例:
MyClass中的if __name__ == '__main__'代码块只有在直接运行dictclass.py时才会执行,此时创建的my_obj是该脚本内的本地实例,更新操作只针对这个实例。而运行main.py时,dictclass.py是作为模块被导入的,其if __name__ == '__main__'代码块不会触发,main.py中创建的myclass_obj是全新的、未经过任何修改的MyClass实例,自然只有默认字典内容。 - 原测试代码存在语法错误:原代码中
my_obj.my_dict.get_attribute(...)写法错误,get_attribute是MyClass类的方法,不是字典对象的方法,正确调用方式应为my_obj.get_attribute(...)。
解决方案
根据不同的需求场景,有两种常用解决方式:
方式一:在main.py中直接执行更新逻辑
如果更新操作需要和GUI流程结合,直接在main.py创建实例后执行更新:
from PyQt5 import QtWidgets from dictclass import MyClass class MainWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) print(myclass_obj.my_dict) if __name__ == '__main__': import sys myclass_obj = MyClass() # 在这里执行字典更新操作 value = myclass_obj.get_attribute('dict1', 'col1') * .011 myclass_obj.set_attribute('dict1', 'col3', value) app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
方式二:在MyClass初始化时自动完成更新
如果更新逻辑是固定的,希望所有MyClass实例都带有更新后的字典,可以把更新逻辑放到__init__方法中:
class MyClass: def __init__(self): self.my_dict = { 'dict1' : { 'col1' : value1, 'col2' : value2, ... }, 'dict2' : { 'col1' : value1, 'col2' : value2, } ... } # 初始化时自动执行更新 value = self.get_attribute('dict1', 'col1') * .011 self.set_attribute('dict1', 'col3', value) # 避免用dict作为参数名(它是Python内置类型),改为dict_name def set_attribute(self, dict_name, col, val): self.my_dict[dict_name][col] = val def set_attributes(self, dict_name, **kwargs): for col, val in kwargs.items(): self.set_attribute(dict_name, col, val) def get_attribute(self, dict_name, col): if dict_name in self.my_dict: return self.my_dict[dict_name].get(col) return None
额外提示
如果需要在多个脚本间共享同一个MyClass实例的状态,可以考虑使用单例模式,或者通过参数将实例传递到GUI窗口中,确保所有操作都作用于同一个实例。
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

