Python 图形用户界面设计问题

Python 图形用户界面设计问题,python,design-patterns,user-interface,tkinter,Python,Design Patterns,User Interface,Tkinter,我使用tkinter,但我的问题可能是一般性的 这是我第一次设计GUI。我的每个对象都建模为一个类。我不明白如何将GUI类层次结构与类层次结构的其余部分联系起来 例如,我有一些生物: # this is before I had any GUI in my code class Creature: def current_position() # returns real-time x, y coords # ... 我想将它们显示为在画布上移动的圆圈。在我看来,应该通过类生物中的

我使用tkinter,但我的问题可能是一般性的

这是我第一次设计GUI。我的每个对象都建模为一个类。我不明白如何将GUI类层次结构与类层次结构的其余部分联系起来

例如,我有一些生物:

# this is before I had any GUI in my code
class Creature:
  def current_position() # returns real-time x, y coords
    # ...
我想将它们显示为在画布上移动的圆圈。在我看来,应该通过
类生物
中的
更新显示
方法提供运动的图形表示似乎是合理的。然而,这意味着
类生物
必须了解GUI的详细信息。此外,具有
重画
方法的
类应用程序(tkinter.Tk)
需要知道所有现有
生物
实例的列表,以便调用它们的
更新显示
方法。这太依赖了


正确的方法是什么?

对此,普遍接受的模式称为模型/视图/控制器。您有一个控制器对象,它既知道所有生物(您的“模型”)又知道GUI(您的“视图”)。然后,控制器负责将两者连接起来。例如,您的视图可能有一个“绘制生物”方法,该方法接受生物作为输入。然后,控制器将遍历这些生物,然后逐个传递给视图。或者,每个生物都有一个“绘制”方法,该方法接受一个视图作为参数,该视图要求每个生物绘制自己,并向其传递对该视图的引用


有了这个模式,你可以很容易地拥有多个视图,但是生物不需要更新就可以了解它们。同样,您可以更改存储和管理生物的方式,而视图不需要了解任何相关信息

多谢各位。有什么参考资料我应该去读更多的吗?(或者它看起来很简单吗?)有一种方法,生物似乎需要知道我是在使用tk还是其他GUI框架——否则,即使将视图作为参考传递给它们,它们怎么能绘制自己?另一种方法是,如果GUI能够仅仅基于生物引用绘制生物,那么它需要了解很多关于生物的信息。它仍然比我最初遇到的问题要好,但它并没有完全消除GUI和模型之间的依赖关系。还是我误解了什么?@max-你说得对。脱钩的程度是你想投入多少时间的一个因素。通常,您的模型应该是视图不可知的。然而,视图需要知道它必须处理的对象。无法创建视图并使其适用于所有可能的模型。视图需要与您的生物松散耦合。例如,它可以知道调用“get_position”或“get_name”等。抽象仅仅意味着它不必知道它们是如何创建、存储等的。@max:google代表“model view controller”获取更多信息。网上有很多参考资料。Wikipedia的描述可能和其他描述一样好。@max:另一条评论:仅仅因为视图需要传递一个对象,所以它不必是对象。视图仅向控制器公开一个接口。例如,它将公开一个“draw”方法,该方法接受一个具有方法“get_position”的可绘制对象。由你决定一个生物对象是否是“可绘制”的,或者控制器是否获取一个模型对象并将其转换为“可绘制”的对象。因此,视图不需要知道“生物”本身,只需要知道可绘制的对象。一个生物是否可以直接拖拉取决于你。