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 :

下載地址: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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM