wxPython: динамическое включение и отключение виджетов, получение настроек из файла csv - PullRequest
1 голос
/ 01 января 2012

У меня есть небольшая программа со многими виджетами, такими как флажки, textctrls, statictexts, ...

Значения всех моих виджетов хранятся в словаре. Я сохраняю настройки, например этот словарь в CSV-файл. Когда я импортирую настройки из этого файла и обновляю свой словарь, все мои виджеты должны быть включены или отключены в зависимости от значения в словаре, вызвав «def enable_controls». Но виджеты всегда включены, даже если значение равно «Ложь».

Вот фрагмент кода:

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)

Правильно ли я выполняю преобразование типов в bool?

Редактировать: Вот как я пишу и читаю из моего 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 голосов
/ 01 января 2012

Как я уже сказал в комментариях, не используйте bool(config.StartValues['Checkbox2']) для преобразования данных. bool возвращает True для всего, что не оценивается как 0, 0.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)
...