天天看點

python打開界面是什麼樣的-python學習筆記(圖形使用者界面)

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()

運作:

python打開界面是什麼樣的-python學習筆記(圖形使用者界面)

我們來建立一個文本編輯器,功能要求如下:

* 它可以打開給定檔案名的文本檔案;

* 它可以編輯檔案檔案

* 它可以儲存文本檔案

* 它可以正常退出程式

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()

結果:

python打開界面是什麼樣的-python學習筆記(圖形使用者界面)

更智能的布局

使用尺寸器

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()

運作結果:

python打開界面是什麼樣的-python學習筆記(圖形使用者界面)

運作這段代碼,視窗會和上面的相同,但是使用了相對坐标而不是絕對坐标。

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()

運作結果:

python打開界面是什麼樣的-python學習筆記(圖形使用者界面)

使用步驟:

下面玩轉這個小程式步驟:

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()