wxPython:动态启用和禁用组件,从csv文件获取设置

1 投票
1 回答
1721 浏览
提问于 2025-04-17 09:21

我有一个小程序,里面有很多小部件,比如复选框、文本框、静态文本等等。

我把所有小部件的值存储在一个字典里。我会把这些设置,比如这个字典,保存在一个csv文件中。当我从这个文件导入设置并更新我的字典时,所有的小部件应该根据字典里的值来决定是启用还是禁用,这个过程是通过调用“def enable_controls”来完成的。但是不管字典里的值是什么,即使是“False”,小部件总是处于启用状态。

这里是代码片段:

def enable_controls(self):
    self.Checkbox1.SetValue(bool(config.StartValues['Checkbox1']))
    self.Checkbox1TextCtrl.Enable(bool(config.StartValues['Checkbox1']))
    self.Checkbox1StaticText.Enable(bool(config.StartValues['Checkbox1']))

    self.Checkbox2.SetValue(bool(config.StartValues['Checkbox2']))
    self.Checkbox2TextCtrl.Enable(bool(config.StartValues['Checkbox2']))
    self.Checkbox2StaticText.Enable(bool(config.StartValues['Checkbox2']))

当我不动态赋值的时候,这个功能是正常的:

def enable_controls(self):
    self.Checkbox1.SetValue(False)
    self.Checkbox1TextCtrl.Enable(False)
    self.Checkbox1StaticText.Enable(False)

    self.Checkbox2.SetValue(False)
    self.Checkbox2TextCtrl.Enable(False)
    self.Checkbox2StaticText.Enable(False)

我在把值转换成布尔类型时,做得对吗?

补充:这是我如何读写csv文件的:

def onButtonSave(self, event):
    import csv
    getValues(self, StartValues)
    writer = csv.writer(open('Test.csv', 'wb'))
    for key, value in sorted(config.StartValues.items()):
        writer.writerow([key, value])

def onButtonLoad(self, event):
    import csv
    reader = csv.reader(open('Test.csv', 'rb'))
    config.StartValues = dict(x for x in reader)
    enable_controls(self)

1 个回答

2

正如我在评论中提到的,不要用 bool(config.StartValues['Checkbox2']) 来进行数据转换。bool 这个东西会把任何不等于 00.0 或空的序列和映射的东西都当作 True。所以在这种情况下,像 "True""False" 这样的字符串都会被当作 True

用字符串比较或者类似的方法会更好,但要小心用户输入的拼写错误,如果你让他们编辑文件的话!

编辑:使用示例...

def evalBooleans(value):
    """Assumes we're getting either booleans or strings!"""
    return (value if isinstance(value, bool)
                else value.lower() == "true")

cb2 = evalBooleans(config.StartValues['Checkbox2'])
self.Checkbox2.SetValue(cb2)
self.Checkbox2TextCtrl.Enable(cb2)
self.Checkbox2StaticText.Enable(cb2)

撰写回答