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中成爲一種主流。
#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()方法將返回且程序退出。
#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()
運行結果和上面的一樣,但是程序結構更加的完整
#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()