官方文档地址:wxpython.org,此文档记录了阅读官网文档过程的翻译
什么是wxPython?
wxPython是一个基于Python编程语言的用于创建桌面图形用户界面(GUI) 应用程序的跨平台工具包。Python程序员可以通过它轻松地创建拥有健壮的、功能丰富的图形用户界面的程序。wxPython是基于一系列Python扩展模块实现的,这些模块封装了使用C++编写的流行的跨平台库wxWidgets的GUI组件。
和Python以及wxWidgets一样,wxPython也是开源的,这意味着任何人都可以免费使用,且源码可供任何人查看和修改。此外,任何人都可以为项目贡献修复或增强功能。
wxPython是跨平台工具包,相同的程序可以在多个平台上运行,而无需进行任何修改。目前支持的平台有:Microsoft Windows、Mac OS X、macOS、Linux和其他带有GTK2或GTK3库的类Unix系统。在大部分的情况下,应用使用每个平台的原生widgets提供了100%的原生外观和体验。
因为使用了Python作为编程语言,wxPython程序具有简单、易读和易理解的特点。
什么是wxPython Phoenix?
wxPython的Phoenix(凤凰)项目是一个全新的、从头开始重新实现的wxPython版本,旨在让wxPython“更好、更强、更快”。换言之,新的实现专注于wxPython的速度、可维护性和扩展性,同时移除在wxPython Classic的长期发展历程中积累的无用代码。
多年以来,这个项目一直在断断续续地开发,大部分时间都是在幕后进行的。在过去几年中,自动化快照构建(automated snapshot builds)已经为那些敢于尝试的用户提供了使用机会,许多人最终开始在他们的项目中使用这些快照,甚至用于生产版本。虽然还有一些次要的事情需要完成,但封装了wxWidgets代码的新wxPython扩展模块的核心部分已经稳定很长时间了。
由于进行了一些清理、重组、简化和规范化操作,wxPython Phoenix并不完全向后兼容wxPython Classic。这是有意为之的,是有目的的,是经过设计的。然而,一般来说,API 的差异往往比较小,有些应用程序可以在进行少量甚至不进行任何修改的情况下使用Phoenix。在一些其他情况下,正确的方法在经典版(Classic)中也是可用的,只是那些错误的方法才从Phoenix中被移除了。更多信息详见迁移指南文档:docs.wxpython.org/MigrationGu…。
新的wxPython API参考文档,包括所有针对Python的扩展和定制,以及wx.lib包的文档,位于以下网址:docs.wxpython.org/。
Hello World
每种编程语言和用户界面工具包都需要有一个Hello World示例。这几乎是一个不成文的规定。🤔他们的意图显然是告诉你一切你需要知道的信息,以便你为自己选择合适的语言或工具包。下面是wxPython的Hello World:
# 首先,引入wxPython包
import wx
# 接下来,创建一个应用对象
app = wx.App()
# 然后是一个frame(窗口)
frm = wx.Frame(None, title="Hello World")
# 显示窗口
frm.Show()
# 启动事件循环
app.MainLoop()
示例使用五行代码创建并显示了一个窗口,并运行了一个事件处理器。
什么,你觉得五行代码太多了?好吧,好吧。那就用一行代码 😛 :
import wx; a=wx.App(); wx.Frame(None, title="Hello World").Show(); a.MainLoop()
Hello World,第二部分
现在让我们给Hello World示例增加一点“血肉”,以便更好地了解创建一个wxPython应用程序的全过程。最终运行的应用程序参考下面的截图:
以下是源代码,代码中的文档字符串和注释将帮助你理解它是如何工作的。helloworld2.py (Source)
#!/usr/bin/env python
"""
更丰富的Hello World
"""
import wx
class HelloFrame(wx.Frame):
"""
一个用于输出Hello World的frame(窗口)
"""
def __init__(self, *args, **kw):
# 确保父级的__init__被调用
super(HelloFrame, self).__init__(*args, **kw)
# 在窗口里创建一个panel(容器)
pnl = wx.Panel(self)
# 设置字体加粗
st = wx.StaticText(pnl, label="Hello World!")
font = st.GetFont()
font.PointSize += 10
font = font.Bold()
st.SetFont(font)
# 创建一个sizer(布局管理器)来管理子控件的布局
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(st, wx.SizerFlags().Border(wx.TOP|wx.LEFT, 25))
pnl.SetSizer(sizer)
# 创建一个菜单栏
self.makeMenuBar()
# 创建一个状态栏
self.CreateStatusBar()
self.SetStatusText("Welcome to wxPython!")
def makeMenuBar(self):
"""
菜单栏由菜单组成,而菜单则由菜单项组成。
这个方法
这个方法构建了一组菜单,并为菜单项被选中时要调用的处理程序绑定了事件。
"""
# 创建一个file菜单,拥有Hello和Exit两个菜单项
fileMenu = wx.Menu()
# “\t...” 的语法定义了一个快捷键Ctrl-H,该快捷键也可以触发相同的事件。
# 也即后续wx.EVT_MENU绑定的事件。
helloItem = fileMenu.Append(-1, "&Hello...\tCtrl-H",
"Help string shown in status bar for this menu item")
fileMenu.AppendSeparator()
# 当使用预定义ID时,我们不需要指定菜单项的标签。
exitItem = fileMenu.Append(wx.ID_EXIT)
# 现在为“关于”项添加一个帮助菜单。
helpMenu = wx.Menu()
aboutItem = helpMenu.Append(wx.ID_ABOUT)
# 创建菜单栏,并将两个菜单添加到其中。“&”符号表示下一个字母是该菜单项的“助记符”。在
# 支持该功能的平台上,这些字母会被下划线标出,并且可以通过键盘触发。
menuBar = wx.MenuBar()
menuBar.Append(fileMenu, "&File")
menuBar.Append(helpMenu, "&Help")
# 将菜单栏添加到窗口中
self.SetMenuBar(menuBar)
# 最后,为每个菜单项的EVT_MENU事件关联一个处理函数。
# 当某个菜单项被激活时,相应的处理函数将被调用。
self.Bind(wx.EVT_MENU, self.OnHello, helloItem)
self.Bind(wx.EVT_MENU, self.OnExit, exitItem)
self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)
def OnExit(self, event):
"""关闭窗口,结束程序。"""
self.Close(True)
def OnHello(self, event):
"""向用户问好。"""
wx.MessageBox("Hello again from wxPython")
def OnAbout(self, event):
"""显示关于对话框"""
wx.MessageBox("This is a wxPython Hello World sample",
"About Hello World 2",
wx.OK|wx.ICON_INFORMATION)
if __name__ == '__main__':
# 当这个模块被运行(而不是被导入)时,创建应用程序、创建窗口、显示窗口,并启动事件循环。
app = wx.App()
frm = HelloFrame(None, title='Hello World 2')
frm.Show()
app.MainLoop()