Я пытаюсь упростить способ создания графического интерфейса. Мне нравится идея, что визуальные элементы GUI хранятся в файле данных, таком как файл JSON, а затем интерпретируются Python для настройки пользовательского интерфейса.
Это JSON файл, определяющий макет пользовательского интерфейса:
{
"main screen": {
"target file button" : {
"type" : "Button",
"init" : {
"text": "Choose Target File"
},
"grid" : {
"row" : 0,
"column": 0,
"columnspan": 2
}
},
"delete button" : {
"type" : "Button",
"init" : {
"text": "Delete"
},
"grid" : {
"row" : 1,
"column": 0
}
}
}
}
И вот код, который его использует:
import tkinter
import json
class UserInterface(tkinter.Tk):
def __init__(self, layout_path):
super().__init__()
self.layout = self.dict_from_jsonfile(layout_path)
self.init_widgets()
def init_widgets(self):
self.widgets = {}
for key, value in self.layout['main'].items():
self.widgets[key] = tkinter.__dict__[value['type']](master=self, **value['init'])
self.widgets[key].grid(**value['grid'])
def dict_from_jsonfile(self, path, **kwargs):
with open(path, 'r') as f:
data = json.load(f, **kwargs)
return data
if __name__ == '__main__':
UserInterface("./ui_layout.json").mainloop()
Обратите внимание, что я использую атрибут tkinter.__dict__
для перевода JSON строк в объекты tkinter.
Однако эта ссылка в документации Python говорит, что использование атрибута __dict__
является проблемой, говоря:
«использование [__dict__
] нарушает абстракцию реализации пространства имен»
Что это значит? Как я могу реализовать это, чтобы вышеуказанная идея не нарушалась?