简单示例
# simple.py
import wx
app = wx.App()
frame = wx.Frame(None, -1, ’simple.py’)
frame.Show()
app.MainLoop()
这是一个简单的例子,下面我们对每一行代码进行解释:
# simple.py
Python 的注释,第一行指定了 Python 解释器的路径。第二行描述了脚本文件的名字。
引入基本的 wxPython 模块 —— core,controls,GDI,misc 和 windows。要使用 wx 模块里的函数和对象,需要使用 wx. 前缀。下一行代码创建一个应该程序:
每个 wxPython 应用程序只能有一个 App 对象。
frame.Show()
先创建一个 wx.Frame 对象 —— 这是一个重要的 container widget,它不须要指定父 widget,它是应用程序中其它 widget 的父 widget。如果一个 widget 的 parent 参数指定为 None(亦即没有父 widget),表示它位于所有 widget 的最高层。创建 wx.Frame widget 后,需要调用 Show() 方法,使窗口显示在屏幕上。
最后一行使程序进入消息的 mainloop。mainloop 是一个无限循环的方法,捕获并派送程序中发生的事件。
虽然这是一个简单的例子,但我们已经可以对窗口作许多操作,如心改变大小、最小化、最大化,实现这些本来需要大量的代码,但 wxPython 已经默认提供了。我们没必要从造“轮子”做起。:)

wx.Frame
wx.Frame 是 wxPython 最重要的 widget 之一。它是一个 container widget,可以容纳其它的 widgets —— 除 frame 和 dialog 外的任何 window。wx.Frame 由一个标题栏、边框和中心的窗口区域组成,其中标题栏和框是可选的。
下面是 wx.Frame 的构造函数:
wx.Size size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, string name = “frame”)
除了第一个参数,其它都是可选的,而且1/3的参数都带有默认值:)
wx.DEFAULT_FRAME_STYLE 是一组默认标志的组合: wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN。下面是一个简短的示例:
# nominimizebox.py
import wx
app = wx.App()
window = wx.Frame(None, style=wx.MAXIMIZE_BOX | wx.RESIZE_BORDER
| wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)
window.Show(True)
app.MainLoop()
可以看到,隐藏了最少化按钮:

Size and Position
我们可以通过两个途径定义程序 widgets 的大小:一是通过 widgets 构造函数的 size 参数,另一个就是调用 widgets 的 SetSize() 方法。
# size.py
import wx
class Size(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(250, 200))
self.Show(True)
app = wx.App()
Size(None, -1, ‘Size’)
app.MainLoop()
在 wx.Frame 的构造函数,我们设置 width(宽)为250px,height(高)为200px。
类似于大小的设置,我们也可以设置应用程序在屏幕上的位置。默认地,窗口被放置在屏幕的左上角 ── 这要视不同的操作系统或者窗口管理器而定。我们可以看到,在 wx.Frame 的构造函数上带有 pos(位置)参数,只要我们提供具体的值,就可以控制窗口的实际位置。
除了利用构造函数,还有几个方法可以完成位置的设置:
| Method | Description |
|---|---|
| Move(wx.Point point) | 移动窗口到指定位置 |
| MoveXY(int x, int y) | 移动窗口到指定位置 |
| SetPosition(wx.Point point) | 设置窗口的位置 |
| SetDimensions(wx.Point point, wx.Size size) | 设置窗口的位置和大小 |
# move.py
import wx
class Move(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)
self.Move((800, 250))
self.Show(True)
app = wx.App()
Move(None, -1, ‘Move’)
app.MainLoop()
特别地,当我们想最大化窗口的时候,可以调用 Maximize() 方法。Centre() 方法可以方便地将窗口放置在屏幕中央。
# centre.py
import wx
class Centre(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)
self.Centre()
self.Show(True)
app = wx.App()
Centre(None, -1, ‘Centre’)
app.MainLoop()
Widgets 之间的通讯
# communicate.py
import wx
class LeftPanel(wx.Panel):
def __init__(self, parent, id):
wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN)
self.text = parent.GetParent().rightPanel.text
button1 = wx.Button(self, -1, ‘+’, (10, 10))
button2 = wx.Button(self, -1, ‘-’, (10, 60))
self.Bind(wx.EVT_BUTTON, self.OnPlus, id=button1.GetId())
self.Bind(wx.EVT_BUTTON, self.OnMinus, id=button2.GetId())
def OnPlus(self, event):
value = int(self.text.GetLabel())
value = value + 1
self.text.SetLabel(str(value))
def OnMinus(self, event):
value = int(self.text.GetLabel())
value = value – 1
self.text.SetLabel(str(value))
class RightPanel(wx.Panel):
def __init__(self, parent, id):
wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN)
self.text = wx.StaticText(self, -1, ‘0′, (40, 60))
class Communicate(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(280, 200))
panel = wx.Panel(self, -1)
self.rightPanel = RightPanel(panel, -1)
leftPanel = LeftPanel(panel, -1)
hbox = wx.BoxSizer()
hbox.Add(leftPanel, 1, wx.EXPAND | wx.ALL, 5)
hbox.Add(self.rightPanel, 1, wx.EXPAND | wx.ALL, 5)
panel.SetSizer(hbox)
self.Centre()
self.Show(True)
app = wx.App()
Communicate(None, -1, ‘widgets communicate’)
app.MainLoop()
在上面的例子中,我们创建左右两个 panels ── 左边的有两个按钮,右边的有一个 static text。单击按钮可以改变 static text 中的数字。我们是如何取得 static text 的引用呢?
在每个 widget 中,都带有一个 parent 参数。在上面的例子中, parent 是一个 panel 的引用(放置 leftPanel 和 rightPanel 的 panel),再通过调用 GetPanel() ,我们取得 frame 的引用,这样就可以通过 frame 取得 rightPanel 的引用,从而最后取得 static text 的引用。
