天天看点

Python图形用户界面tkinter模块模型、视图、控制器样式面向对象的GUI

tkinter是python中可用于构建gui的众多工具集之一。

以上代码可以显示一个空白的根窗口。可以将其看成是应用程序的最外层容器,创建其他插件(widget)的时候就需要用到它。如果关闭屏幕上的窗口,则相应的窗口对象就会被销毁。所有的应用程序都只有一个主窗口;此外,还可以通过toplevel这个小插件来创建额外的窗口。

tkinter小插件包括button, canvas, checkbutton, entry, frame, label, listbox, menu, message, menubutton, text, toplevel等。

在python中字符串、整数、浮点数以及布尔值都是不可变的,于是tkinter自带了一些类型;他们可以就地更新,并可以在其值发生变化时通知相关的插件。

tkinter中的可变类型

不可变类型

可变类型

int

intvar

string

stringvar

bool

booleanvar

double

doublevar

顾名思义,视图用于把信息显示给用户;模型则只是存储数据;控制器则可以更新应用程序的模型,并进而出发相应的视图发生变化。

如下例子实现点击按钮之后标签上的计数增加:

如果我们不仅希望能增加counter的值,还希望能降低它的值。则我们需要添加另一个按钮和另一个控制器函数。代码如下:

上述实现代码看起来有点傻,<code>click_up</code>和<code>click_down</code>做的事情看起来几乎是一样的,应该将它们合成一个。这时,我们应该显示的把counter传递给函数,而不是使用全局变量。

tkinter要求由按钮(以及别的插件)出发的控制器函数不能含有参数,目的就是为了以同一种方式去调用它们。我们要做的事情就是:对这个带有两个参数的函数进行处理,使其变成一个不带参数的函数。

一个好一点的做法是使用lambda函数,它使我们能够创建一个没有名字的单行函数。

这段代码分别为两个按钮创建了一个不带参数的lambda函数,这两个lambda函数会将正确的值传进click。

控制布局,就可以使用pack,也可以使用grid,但是不能两者都用。

可以使用rowspan和columnspan设置插件所占据的行数,默认为1。

几乎所有真实的gui都是以类和对象来建造的:他们讲模型、视图和控制器一起放到一个干净整洁的包(package)中。例如下面的计数器函数,其模型是counter类的一个名为<code>self.state</code>的成员变量,其控制器是<code>upclick</code>和<code>quitclick</code>方法。

参考资料:

《python编程实践》

《practical programming an introduction to computer science using python》

转载:http://blog.csdn.net/foreverling/article/details/44902547