У меня проблемы с созданием функции Python, которая запускает объекты TkInter, с командами, привязанными к кнопкам меню, используя спецификации кнопок, хранящиеся в словаре.
ПОЛОЖЕНИЕ
Я строю графический интерфейс в Python, используя TkInter. Я написал класс Display (основанный на классе GuiMaker в Lutz, "Programming Python"), который должен обеспечивать окно для ввода данных для различных объектов, поэтому команды и отображение любого экземпляра будут различаться. Я хотел бы настроить эти специфичные для сущности команды и отображения в файле словаря. Файл оценивается при запуске сценария, а его словарь передается в функцию запуска при вызове экземпляра Display. Но команды экземпляров не могут найти методы экземпляров, которые я пытаюсь связать с ними.
ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ В РАБОТАХ ФУНКЦИЙ
Это не проблема, когда экземпляр Display запускается с конфигурациями, указанными в выделенной функции. Например, это прекрасно работает:
def launchEmployee():
display = ''
menuBar = [('File', 0, [('Save', 0, (lambda: display.onSave()))])]
title = 'Employee Data Entry'
display_args = {'title': title,
'menuBar': menuBar}
display = DisplayScreen(**display_args)
Подклассы DisplayScreen от GuiMaker, у которого есть методы для обработки объекта menuBar для создания меню. У него есть метод onSave ().
После этого экземпляр Display находит и запускает собственный метод onSave () при нажатии кнопки «Сохранить».
СПЕЦИФИКАЦИЯ ИЗ ФАЙЛА СЛОВАРЯ НЕ РАБОТАЕТ
Но это не работает, когда я пытаюсь запустить экземпляр Display из функции запуска, извлекая его спецификацию из словаря, хранящегося в отдельном файле.
config_file:
{'menuBar':[('File', 0, [('Save', 0, (lambda: display.onSave()))])],
'title': 'Employee Data Entry'}
файл скрипта:
config = eval(open('config_file', 'r').read())
def launchDisplay(config):
display = ''
display = DisplayScreen(**config)
Запустите этот способ, нажав кнопку «Сохранить», появится сообщение об отсутствии глобального объекта «display».
ТЕОРИЯ: СЛОВАРЬ СЛУЧАЙНО ОБРАЗИТСЯ К ОБЪЕКТАМ В ОБЛАСТИ ПРИ ЗНАКЕ () ВЫЗОВ
Я предполагаю, что в случае функции 'display' является строковым объектом, отсутствие метода onSave () не является проблемой для присвоения menuBar, потому что его проверка на метод откладывается внутри лямбда-функции , Когда экземпляр Display назначается объекту 'display', это перегружает предыдущее назначение строкового объекта, но Python по-прежнему знает об 'display' и переходит к нему, когда запрашивается его метод onSave ().
Если это так, то случай конфигурации завершается неудачей, поскольку объект 'display' вообще не существует, когда словарь конфигурации создается путем оценки. Это не вызывает ошибку при вызове eval (), потому что, опять же, лямбда-функция скрывает объект от проверки до вызова. Но при вызове Python ищет объект «display» в области видимости в момент вызова eval (), где ничего не находит, а затем сообщает об ошибке.
НО: ВЫДЕЛЕНИЕ EVAL () ВЫЗОВ В ОБЛАСТИ НЕ ПОМОГАЕТ
Но я попытался переместить оценку файла словаря в функцию и после создания строкового объекта 'display', но это тоже не сработало.
SO:
Что здесь происходит?
Как я могу указать методы, которые будут привязаны к командам в словаре, к которому нужно обращаться при создании экземпляра экранного объекта? Действительно, кажется, что лучше указывать эти экраны в файле конфигурации, чем в множестве дублирующих функций.