2011-01-25 5 views
2

Я использую tkinter, но мой вопрос, вероятно, общий.gui дизайн вопрос

Это первый раз, когда я проектирую графический интерфейс. Каждый из моих объектов моделируется как класс. Я не понимаю, как связать иерархию классов GUI с остальной иерархией классов.

К примеру, у меня есть существа:

# this is before I had any GUI in my code 
class Creature: 
    def current_position() # returns real-time x, y coords 
    # ... 

Я хочу, чтобы отобразить их в виде кругов, которые перемещаются на холсте. Мне показалось разумным, что графическое представление движения должно быть обеспечено методом update_display в class Creature. Однако это означает, что class Creature должен знать подробности о графическом интерфейсе. Кроме того, class App(tkinter.Tk) с методом redraw должен был бы узнать список всех существующих экземпляров Creature, чтобы вызвать их методы update_display. Это слишком большая зависимость.

Каков правильный подход?

ответ

4

Общепринятый шаблон для этого называется модель/вид/контроллер. У вас есть объект-контроллер, который знает обо всех существах (ваша «модель») и о графическом интерфейсе (ваш «вид»). Затем контроллер отвечает за подключение двух. Например, ваше представление может иметь метод draw_creature, который принимает тварь как вход. Затем контроллер будет перебирать существ, а затем поочередно переходить к представлению. Или у каждого существа есть метод «рисования», который принимает представление как параметр, и представление запрашивает у каждого существа рисование, передавая ему ссылку на представление.

С помощью этого шаблона вы можете легко иметь несколько видов, но существам не нужно обновляться, чтобы знать о них. Аналогично, вы можете изменить, как вы храните и управляете существами, и представление не нуждается в этом ничего знать.

+0

спасибо. Есть ли какая-нибудь ссылка, на которую я должен пойти, чтобы больше узнать об этом? (Или это так же просто, как кажется?) – max

+0

С одним подходом казалось бы, что существам нужно будет знать, использую ли я tk или какую-либо другую инфраструктуру графического интерфейса - иначе как они могут рисовать себя, даже когда передают представление как ссылка? При использовании другого подхода графический интерфейс должен знать много о существах, если он может нарисовать их только на основе ссылки на создание существа. Это все же лучше, чем то, с чем я боролся изначально - но он не полностью устраняет зависимость между графическим интерфейсом и моделью. Или я что-то не понял? – max

+0

@max - вы правы. Количество развязки является фактором того, сколько времени вы хотите инвестировать. Как правило, ваша модель должна быть неагностической. Однако мнение должно быть известно о объектах, с которыми он должен работать. Вы не можете создать представление и использовать его для всех возможных моделей. Представление нуждается в свободной связи с вашими существами. Например, он может знать, чтобы вызвать «get_position» или «get_name» и т. Д. Абстракция просто означает, что он не должен знать, как создаются, сохраняются и т. Д. –

Смежные вопросы