Ross Wan's World!

Python, Ajax, PHP and Linux.

wxPython:实例入门

Posted by Ross Wan 于 2008/03/06

简单示例

#!/usr/bin/python
# simple.py

import wx

app = wx.App()
frame = wx.Frame(None, -1, ‘simple.py’)
frame.Show()
app.MainLoop()

       这是一个简单的例子,下面我们对每一行代码进行解释:

#!/usr/bin/python
# simple.py

       Python 的注释,第一行指定了 Python 解释器的路径。第二行描述了脚本文件的名字。

import wx

       引入基本的 wxPython 模块 —— core,controls,GDI,misc 和 windows。要使用 wx 模块里的函数和对象,需要使用 wx. 前缀。下一行代码创建一个应该程序:

app = wx.App()

       每个 wxPython 应用程序只能有一个 App 对象。

frame = wx.Frame(None, -1, ‘simple.py’)
frame.Show()

       先创建一个 wx.Frame 对象 —— 这是一个重要的 container widget,它不须要指定父 widget,它是应用程序中其它 widget 的父 widget。如果一个 widget 的 parent 参数指定为 None(亦即没有父 widget),表示它位于所有 widget 的最高层。创建 wx.Frame widget 后,需要调用 Show() 方法,使窗口显示在屏幕上。

app = wx.App()

       最后一行使程序进入消息的 mainloop。mainloop 是一个无限循环的方法,捕获并派送程序中发生的事件。
      
       虽然这是一个简单的例子,但我们已经可以对窗口作许多操作,如心改变大小、最小化、最大化,实现这些本来需要大量的代码,但 wxPython 已经默认提供了。我们没必要从造“轮子”做起。:)

wx.Frame

        wx.Frame 是 wxPython 最重要的 widget 之一。它是一个 container widget,可以容纳其它的 widgets —— 除 frame 和 dialog 外的任何 window。wx.Frame 由一个标题栏、边框和中心的窗口区域组成,其中标题栏和框是可选的。

       下面是 wx.Frame 的构造函数:

wx.Frame(wx.Window parent, int id=-1, string title=”, wx.Point pos = wx.DefaultPosition,
  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。下面是一个简短的示例:

#!/usr/bin/python
# 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() 方法。

#!/usr/bin/python
# 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) 设置窗口的位置和大小
#!/usr/bin/python
# 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() 方法可以方便地将窗口放置在屏幕中央。

#!/usr/bin/python
# 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 之间的通讯

#!/usr/bin/python
# 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 的引用呢?

self.text = parent.GetParent().rightPanel.text

       在每个 widget 中,都带有一个 parent 参数。在上面的例子中, parent 是一个 panel 的引用(放置 leftPanel 和 rightPanel 的 panel),再通过调用 GetPanel() ,我们取得 frame 的引用,这样就可以通过 frame 取得 rightPanel 的引用,从而最后取得 static text 的引用。

Advertisements

一条回应 to “wxPython:实例入门”

  1. Ross Wan said

    翻译自:The wxPython tutorial

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

 
%d 博主赞过: