GUI设计问题
我在用tkinter,但我想问的问题可能比较普遍。
这是我第一次设计图形用户界面(GUI)。我把每个对象都建模成一个类,但我不太明白怎么把GUI的类结构和其他类结构结合起来。
比如说,我有一些生物:
# this is before I had any GUI in my code
class Creature:
def current_position() # returns real-time x, y coords
# ...
我想把它们显示成在画布上移动的圆圈。我觉得把运动的图形表现放在class Creature
里的一个方法update_display
里是合理的。但是,这样的话,class Creature
就得知道关于GUI的细节。此外,class App(tkinter.Tk)
里的redraw
方法也需要知道所有现存的Creature
实例的列表,以便调用它们的update_display
方法。这就造成了太多的依赖关系。
那正确的做法是什么呢?
1 个回答
4
这个大家都认可的模式叫做模型/视图/控制器。你有一个控制器对象,它既了解所有的生物(也就是你的“模型”),也了解图形用户界面(也就是你的“视图”)。控制器的任务就是把这两者连接起来。比如说,你的视图可以有一个叫“draw_creature”的方法,它接受一个生物作为输入。然后,控制器会遍历所有生物,把它们一个一个传给视图。或者,每个生物都有一个“draw”方法,接受视图作为参数,视图会请求每个生物自己画自己,同时把视图的引用传给它。
有了这个模式,你可以轻松地拥有多个视图,而生物不需要更新来了解这些视图。同样地,你可以改变存储和管理生物的方式,而视图也不需要知道这些变化。