Python缺省的窗口类库为Tkinter。Tkinter是一个简单的库,它包含很多设计良好的管理器。然而,它的不足之处就是缺乏基本平台优美的外表,此外,另一个不足之处就是不能在C++中使用Tkinter,这就使原型的建立更加困难。
Python具有很多可交替使用的窗口类库,有一些是不依赖于平台,如PyQt和wxPython,而另一些是依赖于平台的,比如PythonWin。PyQt和wxPython都是分别基于Qt和wxWindows C++ 类库。
这就意味着你可以在Python建立程序原型,并很容易地将原型转移到C++环境中,因为这些类结构都是基本一样的。可以通过使用C++代码来取代独立模块而重新使用原型代码,这样可以增加程序性能,而不需要全部重新编写原型。另一个好处是:使用Python可以很容易地学会一个新的类库。
下面的范例建立了一个带有菜单栏和文本框的窗体,能够允许你打开一个文件和在文本框中显示文件的内容。它并不是一个功能完全的文本编辑器,因为在其他操作中,它不允许你存储经过更改的文本。
import sys
from wxPython.wx import *
class Frame(wxFrame):
def __init__(self, parent, id, title):
wxFrame.__init__(self,
parent, id, title, wxPoint(200, 200),wxSize(200,
200))
EVT_SIZE(self,
self.OnSize)
#self.panel
= wxPanel(self, -1, wxDLG_PNT(self, wxPoint(0,
0)),wxDLG_SZE(self, wxSize(200,200)))
self.panel
= wxPanel(self, -1, wxDLG_PNT(self, wxPoint(0,
0)),self.GetClientSize())
self.Text
= wxTextCtrl(self.panel, -1,
"",
wxDLG_PNT(self.panel, wxPoint(0, 0)),
#wxDLG_SZE(self.panel, wxSize(200,200)),
self.GetClientSize(),
wxTE_AUTO_URL
|
wxHSCROLL
|
wxTE_MULTILINE)
self.Menubar
= wxMenuBar(wxMB_DOCKABLE)
EVT_MENU(self,
0x201, self.OnMenuClose)
EVT_MENU(self,
0x202, self.OnFileOpen)
FileMenu
= wxMenu("", wxMENU_TEAROFF)
FileMenu.Append(0x202,
"Open", "")
FileMenu.Append(0x201,
"Exit", "")
self.Menubar.Append(FileMenu,
"File")
self.SetMenuBar(self.Menubar)
def OnCloseWindow(self, event):
self.Destroy()
event.Skip()
def OnSize(self, event):
size
= self.GetClientSize()
self.Text.SetSize(size)
self.panel.SetSize(size)
event.Skip()
def OnMenuClose(self, event):
self.Close()
event.Skip()
def OnFileOpen(self, event):
dlg
= wxFileDialog(self)
btn
= dlg.ShowModal()
if
(btn == wxID_OK):
filename
= dlg.GetFilename()
file
= open(filename, "r")
contents
= file.read()
file.close()
self.Text.Clear()
self.Text.AppendText(contents)
return
WxFrame是wxWindows中主要的SDI窗口类,能够为程序的主窗口提供所有期望的窗体功能。对于MDI窗口,对话框,叠状窗体等都有相应的类。WxWindows是一个功能完整的GUI类库,它可以由统一的字符编码标准支持。
Frame类包含一个constructor (__init__)和一些事件处理器。在构造器中,我建立文本框和一个菜单栏。我也可以注册事件处理器,注册事件处理器与C++中的代码方式有些区别。
在wxPython中,事件注册系统可以被各种函数处理。在C++版本中,事件注册由一套宏来处理,这套宏与你所见到的MFC代码和其他的GUI类库很相似。.如果你忽略Python和C++中语法的区别,你可以由C++推断出Python的语法,因为二者在很大程度都很相似。
Frame类定义程序的主窗口。现在我们需要定义程序中的类。
classTheApp(wxApp):
def
OnInit(self):
frame
= Frame(NULL, -1, "WxPythonDemo")
frame.Show(true)
self.SetTopWindow(frame)
return
true
以上代码简单地把Frame类与程序类联系在一起。现在我们所有做的是建立程序类的事件并启动主程序。
theApp = TheApp(0)
theApp.MainLoop()
当你在系统中运行以上代码时,可以注意到:窗口,菜单等都呈现很优美的外观,使用操作系统变得更加好看。我在Lunix操作系统中也编写了类似的代码,然后将这一代码转移到Windows XP操作系统的机器并运行它(没有任何改变),GUI在Windows操作系统中看起来非常完整和优美。
因为wxWindows专门用于跨平台的开发,这就具备很多有助于程序的开发的功能。例如,有很多类可以用于文件系统访问和文件路径的设计。在任何功能中,你都可以用wxWindows的功能来进行GUI的开发。
文本作者Mike Owens是一名Allscripts Healthcare解决方案的软件工程师,他从事软件行业已逾八年。