Я использую 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
. Это слишком большая зависимость.
Каков правильный подход?
спасибо. Есть ли какая-нибудь ссылка, на которую я должен пойти, чтобы больше узнать об этом? (Или это так же просто, как кажется?) – max
С одним подходом казалось бы, что существам нужно будет знать, использую ли я tk или какую-либо другую инфраструктуру графического интерфейса - иначе как они могут рисовать себя, даже когда передают представление как ссылка? При использовании другого подхода графический интерфейс должен знать много о существах, если он может нарисовать их только на основе ссылки на создание существа. Это все же лучше, чем то, с чем я боролся изначально - но он не полностью устраняет зависимость между графическим интерфейсом и моделью. Или я что-то не понял? – max
@max - вы правы. Количество развязки является фактором того, сколько времени вы хотите инвестировать. Как правило, ваша модель должна быть неагностической. Однако мнение должно быть известно о объектах, с которыми он должен работать. Вы не можете создать представление и использовать его для всех возможных моделей. Представление нуждается в свободной связи с вашими существами. Например, он может знать, чтобы вызвать «get_position» или «get_name» и т. Д. Абстракция просто означает, что он не должен знать, как создаются, сохраняются и т. Д. –