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 :
根據自己的作業系統下載下傳相應版本。
安裝過程非常簡單,以win7系統為例,點選下載下傳的exe 檔案,保持安裝目錄與本機的python目錄一緻就OK了。
建立并顯示一個架構
importwx
app=wx.App()
win=wx.Frame(None)
win.Show()
app.MainLoop()
運作:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmL3YjNxYDM3UjMwIDNxkTMvwFOwUTMwIzLcdjMzgTM38CX1EDMyc2bsJ2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)
我們來建立一個文本編輯器,功能要求如下:
* 它可以打開給定檔案名的文本檔案;
* 它可以編輯檔案檔案
* 它可以儲存文本檔案
* 它可以正常退出程式
importwx
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()
結果:
更智能的布局
使用尺寸器
importwx
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(儲存)。當事件被調用時,它會收到一個事件對象作為它唯一的參數,其中包括發生了什麼事情的資訊,但是在這裡可以忽略這方法的事情,因為程式隻關心點選時發生的事情。
defload(event):
file=open(filename.GetValue())
contents.SetValue(file.read())
file.close()
上節剛剛學過檔案的打開/讀取,檔案名使用filename對象GetValue方法擷取。為了将文本引入文本區,隻要使用contents.SetValue即可。
save函數和load類似,除了它需要寫入("w’),以及用于檔案處理部分的write方法,GetValue用于從文本區獲得資訊。
defsave(event):
file=open(filename.GetValue(),'w')
file.write(contents.GetValue())
file.close()
最終的GUI程式
importwxdefload(event):
file=open(filename.GetValue())
contents.SetValue(file.read())
file.close()defsave(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!'
importwxdefhello(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()