Предоставление глобальных данных конфигурации для объектов в рамках пользовательского интерфейса - PullRequest
0 голосов
/ 30 января 2012

Я работаю над библиотекой виджетов на основе текстового интерфейса и решил, что настало время предоставить пользователю моей библиотеки возможность инкапсулировать конфигурацию всего приложения через объект приложения, например:

class App:

    def __init__(self, screen_size_tuple):
        self.screen_size = screen_size_tuple

    def get_screen_size(self):
        return self.screen_size

class Widget:

    def __init__(self, rows, cols, y, x, foo, bar, app):
        self.rows = rows
        self.original_dimensions = (rows, cols)
        self.original_coords = (y, x)
        #etc, etc
        self.app = app
        self.fullscreen = False     

    def self.toggle_fullscreen(self):
        if self.fullscreen != True:
            self.y = 0
            self.x = 0
            self.rows = self.app.screen_size[0] # y value from the application object
            self.cols = self.app.screen_size[1] # x value from the application object
        else:
            self.y = self.original_coords[0]
            self.x = self.original_coords[1]
            self.rows = self.original_dimensions[0]
            self.cols = self.original-dimensions[1]

Мой вопрос двоякий: во-первых, когда я использую эту тактику, как мне избежать передачи экземпляра класса App каждому виджету при создании? Рекомендуется ли делегировать создание виджета самому объекту приложения? Во-вторых, есть ли название для этого шаблона проектирования при правильном использовании? Это немного похоже на внедрение наблюдателя или зависимости, но я не уверен, что эти шаблоны применимы здесь.

Заранее спасибо =)

1 Ответ

1 голос
/ 30 января 2012

Если вам нужна конфигурация «на уровне приложения, но не на глобальном уровне», есть несколько общих шаблонов:

  1. Используйте ваш объект app для создания объектов виджета, например, app.create(WidgetClass)
  2. Передайте приложение через иерархию виджетов, например:

a = App()

f = FrameWidget()
a.add(f) # sets FrameWidget's config to a's config

b = ButtonWidget()
f.add(b) # sets ButtonWidget's config to f's config, which happens to be a's

c = CheckboxWidget()
f.add(c) # sets CheckboxWidget's config to f's config, also a's
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...