вопрос дизайна графического интерфейса - PullRequest
2 голосов
/ 25 января 2011

Я использую 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 должен знать подробности о GUI.Кроме того, class App(tkinter.Tk) с методом redraw потребуется знать список всех существующих экземпляров Creature, чтобы вызвать их методы update_display.Это слишком большая зависимость.

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

1 Ответ

4 голосов
/ 25 января 2011

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

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

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