wxPython簡單入門

wxPython簡介

  wxPython 是 Python 語言的一套優秀的 GUI 圖形庫,允許 Python 程序員很方便的創建完整的、功能鍵全的  GUI 用戶界面。 wxPython 是作爲優秀的跨平臺 GUI 庫 wxWidgets 的 Python 封裝和 Python 模塊的方式提供給用戶的。就如同Python和wxWidgets一樣,wxPython也是一款開源軟件,並且具有非常優秀的跨平臺能力,能夠運行在32位windows、絕大多數的Unix或類Unix系統、Macintosh OS X上。

本文地址:http://www.cnblogs.com/archimedes/p/wxpython-begin.html,轉載請註明源地址。

首先看一個例子,它創建了一個有一個文本框的窗口用來顯示鼠標的位置:

import wx
class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "My Frame", size = (300, 300))
        panel = wx.Panel(self, -1)
        panel.Bind(wx.EVT_MOTION, self.OnMove)
        wx.StaticText(panel, -1, "Pos:", pos = (10, 12))
        self.posCtrl = wx.TextCtrl(panel, -1, "", pos = (40, 10))

    def OnMove(self, event):
        pos = event.GetPosition()
        self.posCtrl.SetValue("%s, %s" %(pos.x, pos.y))
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame()
    frame.Show(True)
    app.MainLoop()

運行後出現下面的界面:

漂亮的界面是一個GUI程序必不可少的一部分,wxPython可以做到這一點,加之Python強大的功能和簡潔的語法,使用得它在Python的GUI中成爲一種主流。

創建最小的空的wxPython程序

#coding=utf-8 
import wx  #導入必須的Python包
class App(wx.App): #子類化wxPython應用程序類
    def OnInit(self):  #定義一個應用程序的初始化方法
        frame = wx.Frame(parent = None, title = 'Bare')
        frame.Show()
        return True
app = App()  #創建一個應用程序類的實例
app.MainLoop() #進入這個應用程序的主事件循環

運行後出現下面的界面:

1、導入wxPython
你需要做的第一件事就是導入這個主要的wxPython包,這個包名爲wx:
import wx
一旦這個包被導入,你就可以引用wxPython的類、函數和常量(它們以wx爲前綴),如下所示:
class App(wx.App):

對於導入順序需要注意的是:你從wxPython導入其它東西之前必須先導入wx。通常情況下,Python中的模塊導入順序無關。但是wxPython中的不同,它是一個複雜的模塊。當你第一次導入wx模塊時, wxPython要對別的wxPython模塊執行一些初始化工作。例如wxPython中的一些子包,如xrc模塊,它在wx模塊導入之前不能夠正確的工作,我們必須按下面順序導入:

import wx            
from wx import xrc

以上的導入順序只針對wxPython的模塊, Python的模塊導入順序沒關係。例如:

import sys
import wx
import os
from wx import xrc
import urllib

2 使用應用程序和框架工作
一旦你導入了wx模塊,你就能夠創建你的應用程序 (application)對象和框架(frame)對象。每個wxPython程序必須有一個application對象和至少一個frame對象。 application對象必須是wx.App的一個實例或你在OnInit()方法中定義的一個子類的一個實例。當你的應用程序啓動的時候, OnInit()方法將被wx.App父類調用。
下面的代碼演示瞭如何定義我們的 wx.App的子類:

class App(wx.App):
    def OnInit(self):
        frame = wx.Frame(parent = None, id= -1, title = 'Bare')
        frame.Show()
        return True

 上面我們定義了一個名爲 App的子類。我們通常在 OnInit()方法中創建frame對象。上面的 wx.Frame接受三個參數,僅第一個是必須的,其餘的都有默認值。
調用 Show()方法使 frame可見,否則不可見。我們可以通過給 Show()一個布爾值參數來設定 frame的可見性:

frame.Show(False)    # 使框架不可見.
frame.Show(True)     # True是默認值,使框架可見.
frame.Hide()         # 等同於frame.Show(False)

定義一個應用程序的初始化方法注意:我們沒有爲我們的應用程序類 定義一個 __init__()方法。在 Python中,這就意味着父方法 wx.App.__init()__將在對象創建時被自動調用。如果你定義你自己的 __init__()方法,不要忘了調用其基類的 __init()__方法,示例如下:

class App(wx.App):
     def__init__(self):
         wx.App.__init__(self)

如果你忘了這樣做, wxPython不將被初始化並且你的 OnInit()方法也不將得到調用。

創建一個應用程序實例並進入它的主事件循環

這步是創建 wx.App子類的實例,並調用它的 MainLoop()方法:

app = App()
app.MainLoop()

一旦進入主事件循環,控制權將轉交給 wxPython。wxPython GUI程序主要響應用戶的鼠標和鍵盤事件。當一個應用程序的所有框架被關閉後,這個app.MainLoop()方法將返回且程序退出。

擴展這個最小的空的wxPython程序

#coding=utf-8
#!/usr/bin/env python #1
# 在如linux和unix等操作系統上,它告訴操作系統如
# 何找到執行程序的解釋器。如果這個程序被給予的可執行權限(例如使用chmod命令),
# 我們可以在命令行下僅僅鍵入該程序的名字來運行這個程序:這行在其它的操作系統上將被忽略。但是包含它可以實現代碼的跨平臺

""""Spare.py is a atarting point for a wxpython program."""
#這是文檔字符串,當模塊中的第一句是字符串的時候,這個字符串就成
#了該模塊的文檔字符串並存儲在該模塊的 __doc__屬性中。
import wx
class Frame(wx.Frame):  # 定義了我們自己的Frame類作爲 wx.Frame的子類
    pass
class App(wx.App):
    def OnInit(self):
        self.frame = Frame(parent=None, title='Spare')  # 將對frame實例的引用作爲應用程序實例的一個屬性
        self.frame.Show()
        self.SetTopWindow(self.frame)  # SetTopWindow()方法是一個可選的方法,它讓wxPython
                                       # 方法知道哪個框架或對話框將被認爲是主要的。一個wxPython程序可以有幾個
                                       # 框架,其中有一個是被設計爲應用程序的頂級窗口的
        return True
if __name__ == '__main__':  # Python中通常用來測試該模塊是作爲程序獨立運行還是被另一模
                             # 塊所導入。我們通過檢查該模塊的__name__屬性來實現
    app = App()
    app.MainLoop()

運行結果和上面的一樣,但是程序結構更加的完整

實現最終的hello.py程序:

#coding=utf-8
#!/usr/bin/env python
import wx
class Frame(wx.Frame):  # 定義一個 wx.Frame的子類,以便我們更容量控制框架的內容和外觀
    """ Frame class that displays an image."""
    def __init__(self, image, parent=None, id=-1,
                 pos=wx.DefaultPosition,
                 title='Hello, wxPython!'):  # 給我們的框架的構造器增加一個圖像參數。這個值通過我們的應用程序
                                                # 類在創建一個框架的實例時提供
        """Create a Frame instance and display image."""  # 用 wx.StaticBitmap控件來顯示這個圖像,它要求一個位圖
        temp = image.ConvertToBitmap()
        size = temp.GetWidth(), temp.GetHeight()
        wx.Frame.__init__(self, parent, id, title, pos, size)
        self.bmp = wx.StaticBitmap(parent=self, bitmap=temp)
class App(wx.App):  # 定義一個帶有 OnInit()方法的 wx.App的子類
    """Application class."""
    def OnInit(self):  # 使用與 hello.py在同一目錄下的名爲 wxPython.jpg的文件創建了一個圖像對象
        image = wx.Image('wxPython.jpg', wx.BITMAP_TYPE_JPEG)
        self.frame = Frame(image)
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True
def main():  # main()函數創建一個應用程序的實例並啓動wxPython的事件循環
    app = App()
    app.MainLoop()
if __name__ == '__main__':
    main()