【问题标题】:wxPython: Enabling and disabling widgets dynamically, getting settings from a csv filewxPython:动态启用和禁用小部件,从 csv 文件获取设置
【发布时间】:2012-01-01 18:56:28
【问题描述】:

我有一个小程序,其中包含许多小部件,例如复选框、textctrls、statictexts...

我所有小部件的值都存储在字典中。我正在保存设置,例如这本字典在 csv 文件中。当我从这个文件导入设置并更新我的字典时,我的所有小部件都应该通过调用“def enable_controls”根据字典中的值启用或禁用。但小部件始终处于启用状态,即使值为“False”。

这里是sn-p的代码:

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)

【问题讨论】:

  • StartValues 字典中存储了哪些数据。以什么方式?
  • 如果它们都被启用,看起来你不是在传递布尔值,而是其他类型。我猜这与我回答的上一个问题有关。在这种情况下,如果您直接从 CSV 文件中获取值,它们很可能是字符串,并且任何非空字符串的计算结果为 True。请注意,这意味着bool("False")True!使用cb2 = "true" == config.StartValues['Checkbox2'].lower() 之类的东西会更好。 lower 用于捕捉单词的所有可能大小写,但要注意拼写错误...
  • 如果您不需要专门为人类可读的 csv 格式,使用 cPickle 会更有效,因为它可以维护您的所有对象类型。您将避免必须将字符串值转换回去。

标签: python dictionary casting widget wxpython


【解决方案1】:

正如我在 cmets 中所说,不要使用 bool(config.StartValues['Checkbox2']) 进行数据转换。 bool 返回True 用于 评估为00.0 或空序列或映射的任何内容。在这种情况下,"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)

【讨论】:

  • 谢谢你的回答,里卡多!这就是我的猜测,所有值都被评估为“真”。但我真的不明白我应该如何在我的代码中使用 'cb2 = "true" == config.StartValues['Checkbox2'].lower()' 部分
  • 已编辑以包含一个示例。 cb2 部分只是为了减少转换值的次数! :D
  • 您也可以在读取值时转换它们,然后在代码的其他任何地方正常使用它们。
  • 它有效!但只能这样:def evalBooleans(self, value): return value == "True" True 和 False 的第一个字母是大写字母,所以我不需要 .lower()
  • 是的,当然 :) 正如我告诉你的,这只是一种防止用户在文件中键入“true”或“TRUE”的方法! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多