Как настроить макет пользовательского интерфейса для Tkinter- Python, используя JSON? - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь упростить способ создания графического интерфейса. Мне нравится идея, что визуальные элементы 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__] нарушает абстракцию реализации пространства имен»

Что это значит? Как я могу реализовать это, чтобы вышеуказанная идея не нарушалась?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...