GUI
python提供了多個圖形開發界面的庫,幾個常用Python GUI庫如下:
Tkinter: Tkinter模塊("Tk 接口")是Python的標准Tk GUI工具包的接口.Tk和Tkinter可以在大多數的Unix平台下使用,同樣可以應用在Windows和Macintosh系統里.,Tk8.0的后續版本可以實現本地窗口風格,並良好地運行在絕大多數平台中。
wxPython:wxPython 是一款開源軟件,是 Python 語言的一套優秀的 GUI 圖形庫,允許 Python 程序員很方便的創建完整的、功能鍵全的 GUI 用戶界面。
Jython:Jython程序可以和Java無縫集成。除了一些標准模塊,Jython使用Java的模塊。Jython幾乎擁有標准的Python中不依賴於C語言的全部模塊。比如,Jython的用戶界面將使用Swing,AWT或者SWT。Jython可以被動態或靜態地編譯成Java字節碼。
安裝:
本節介紹如何創建python程序的圖形用戶界面(GUI),也就是那些帶有按鈕和文本框的窗口。這里介紹wxPython :
下載地址:http://www.wxpython.org/download.php
根據自己的操作系統下載相應版本。
安裝過程非常簡單,以win7系統為例,點擊下載的exe 文件,保持安裝目錄與本機的python目錄一致就OK了。
創建並顯示一個框架
import wx app=wx.App() win=wx.Frame(None) win.Show() app.MainLoop()
運行:

我們來創建一個文本編輯器,功能要求如下:
* 它可以打開給定文件名的文本文件;
* 它可以編輯文件文件
* 它可以保存文本文件
* 它可以正常退出程序
import wx app=wx.App() win=wx.Frame(None,title='Simple Editor',size=(410,335)) win.Show() loadButton=wx.Button(win,label='Open',pos=(225,5),size=(80,25)) saveButton=wx.Button(win,label='Save',pos=(315,5),size=(80,25)) filename=wx.TextCtrl(win,pos=(5,5),size=(210,25)) contents=wx.TextCtrl(win,pos=(5,35),size=(390,260),style=wx.TE_MULTILINE| wx.HSCROLL) app.MainLoop()
結果:

更智能的布局
使用尺寸器
import wx app=wx.App() win=wx.Frame(None,title='Simple Editor',size=(410,335)) bkg=wx.Panel(win) loadButton=wx.Button(bkg,label='Open') saveButton=wx.Button(bkg,label='Save') filename=wx.TextCtrl(bkg) contents=wx.TextCtrl(bkg,style=wx.TE_MULTILINE| wx.HSCROLL) hbox=wx.BoxSizer() hbox.Add(filename,proportion=1,flag=wx.EXPAND) hbox.Add(loadButton,proportion=0,flag=wx.LEFT,border=5) hbox.Add(saveButton,proportion=0,flag=wx.LEFT,border=5) vbox=wx.BoxSizer(wx.VERTICAL) vbox.Add(hbox,proportion=0,flag=wx.EXPAND | wx.ALL,border=5) vbox.Add(contents,proportion=1,flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT,border=5) bkg.SetSizer(vbox) win.Show() app.MainLoop()
運行結果:

運行這段代碼,窗口會和上面的相同,但是使用了相對坐標而不是絕對坐標。
wx.BoxSizer的構造函數帶有一個決定它是水平還是垂直的參數,默認為水平。
add方法有幾個參數,proportion參數根據在窗口改變大小時所分配的空間設置比例。flag參數類似於構造函數中的style參數,可以使用按位或運算符連接構造符號常量。
事件處理
上面的界面做好了,但是我們點擊按鈕不起任何的作用。
在GUI術語中,用戶執行的動作(比如 點擊按鈕)叫做事件。我們需要讓程序注意這些事件並且作出反應。
假設寫了一個負責打開文件的函數,並將其命令為load ,然后就可以像下面這樣將函數作為loadButton的事件處理函數:
loadButton.Bind(wx.EVT_BUTTON,load)
完成了的程序
讓我們來完成剩下的工作,現在需要的就是兩個事件處理函數:load(打開)和save(保存)。當事件被調用時,它會收到一個事件對象作為它唯一的參數,其中包括發生了什么事情的信息,但是在這里可以忽略這方法的事情,因為程序只關心點擊時發生的事情。
def load(event): file=open(filename.GetValue()) contents.SetValue(file.read()) file.close()
上節剛剛學過文件的打開/讀取,文件名使用filename對象GetValue方法獲取。為了將文本引入文本區,只要使用contents.SetValue即可。
save函數和load類似,除了它需要寫入(‘w’),以及用於文件處理部分的write方法,GetValue用於從文本區獲得信息。
def save(event): file=open(filename.GetValue(),'w') file.write(contents.GetValue()) file.close()
最終的GUI程序
import wx def load(event): file=open(filename.GetValue()) contents.SetValue(file.read()) file.close() def save(event): file=open(filename.GetValue(),'w') file.write(contents.GetValue()) file.close() app=wx.App() win=wx.Frame(None,title='Simple Editor',size=(410,335)) bkg=wx.Panel(win) loadButton=wx.Button(bkg,label='Open') loadButton.Bind(wx.EVT_BUTTON,load) saveButton=wx.Button(bkg,label='Save') saveButton.Bind(wx.EVT_BUTTON,save) filename=wx.TextCtrl(bkg) contents=wx.TextCtrl(bkg,style=wx.TE_MULTILINE| wx.HSCROLL) hbox=wx.BoxSizer() hbox.Add(filename,proportion=1,flag=wx.EXPAND) hbox.Add(loadButton,proportion=0,flag=wx.LEFT,border=5) hbox.Add(saveButton,proportion=0,flag=wx.LEFT,border=5) vbox=wx.BoxSizer(wx.VERTICAL) vbox.Add(hbox,proportion=0,flag=wx.EXPAND | wx.ALL,border=5) vbox.Add(contents,proportion=1,flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT,border=5) bkg.SetSizer(vbox) win.Show() app.MainLoop()
運行結果:

使用步驟:
下面玩轉這個小程序步驟:
1、文本框輸入hello8.txt
2、文本區輸入Hello.world!
3、點擊保存(不會有保存成功的提示,但它已經成功了)
4、關閉編輯器,重新運行打開。
5、文件框輸入hello8.txt ,點擊“打開”按鈕,上次編輯的內容(Hello.world!)在文本區出現了。
窗口含有一個‘hello’標簽按鈕,點擊hello,會在文本框中顯示'Hello,world!'
import wx def hello(event): print 'Hello,world!' app=wx.App() win=wx.Frame(None,title='Hello,wxPython!',size=(200,100)) button=wx.Button(win,label='Hello') button.Bind(wx.EVT_BUTTON,hello) win.Show() app.MainLoop()
