Thursday, August 17, 2006

WxPython 编程指南 1.3 扩展“空壳程序”


上面的这个空壳程序已经让我有了一个好的开始,不过除了用于教学这个程序几乎没什么用处。上面这个程序虽然简单但是难于扩展。

所以我们将扩展这个应用程序,给他添加一些方法和功能。列表1.2列出了我们将要进行的下一个迭代,我们将它命名位spare.py

列表1.2 spare版本的空壳程序

#!/usr/bin/env python

"""Spare.py is a starting point for a wxPython program."""

import wx

class Frame(wx.Frame):

pass

class App(wx.App):

def OnInit(self):

self.frame=Frame(parent=None,title="spare")

self.frame.Show()

self.SetTopWindow(self.frame)

return True

if __name__=='__main__':

app=App()

app.MainLoop()

这个版本的程序仍然很简单只有12行,但是我们为其增加了一些重要的部分。上面程序的第一行称为环境变量行。它类似于python的注释行,不过在某些操作系统中比如Linux/Unix操作系统中这行告诉操作系统python解析器的位置。如果这个文件的操作权限是可执行的,那么我们就可以通过命令行来运行这个文件:

spare.py

这行只会在类Unix系统和MacOS中被识别,其他操作系统会忽略它。尽管你可能不不会使用这些操作系统,但是为了保持平台无关性建议还是加上它。第二行是文档字符串它是文档的注释,最终被放在模块的__doc__属性中。Python的文档字符串为程序提供了内省的能力,我们建议你在模块、类和方法的内部尽量使用文档字符串。PyCrustIDE工具可以有效的利用文档字符串为开发提供更多的信息。

在上面的程序中我们还改变了创建Frame对象的方法,较之bare中直接创建Frame对象不同,在这里我们创建了自己的Frame子类。这样的好处是你可以在Frame中增加其他组件。事实上当实际开发的时候你一般会建立一个单独的Frame模块以便可以扩展。

接下来我们在应用程序镇南关增加了frame对象的引用。就像例子中那样你会发现在增加一个对象属性是多么的简单。

之后我们在OnInit方法中调用了App类的SetTopWindow方法,它继承自是wx.App的方法,它告诉应用那个对象是应用程序的主窗口对象。一个wxPython程序中可以有多个窗口但是只能有一个主窗口,那么就可以通过上面的方法来设置那个是主窗口。

最后一部分是Python中的一种习惯用法,它用来判断那个模块是程序的主入口。我们通过判断模块的’__name__’属性来达到这个目的:

if __name__=='__main__':

app=App()

app.MainLoop()

如果要运行的模块已经导入那么它的’__name__’属性和文件名是相同的(不包括扩展名),比如:

>>> import spare

>>> spare.__name__

'spare

但是如果程序已经开始运行,但是模块没有导入,这时Python则使用缺省的名称,把模块的名称设置为缺省的‘__main__,这样我们就有办法直接运行模块。我们利用这个特性将模块当作一个程序运行。

如果之前我们不错测试就直接运行的化会造成模块中的代码冲突,而且也难于测试。

No comments: