1. 程式人生 > ><<Python基礎教程>>學習筆記 | 第12章 | 圖形用戶界面

<<Python基礎教程>>學習筆記 | 第12章 | 圖形用戶界面

lena text 平臺 post ack 由於 contents exp 一個

Python支持的工具包非常多。但沒有一個被覺得標準的工具包。用戶選擇的自由度大些.本章主要介紹最成熟的跨平臺工具包wxPython.官方文檔: http://wxpython.org/

------

豐富的平臺:

技術分享

Tkinter實際上類似於標準,由於它被用於大多數正式的Python GUI程序。並且它是Windows二進制公布版的一部分。

可是在UNIX上要自己編譯安裝。

還有一個越來越受歡迎的工具是wxPython。

這是個成熟並且特性豐富的包,也是Python之父,Guido van Rossum的最愛

------

下載安裝wxPython

http://wxpython.org/download.php

NOTE:

1. 註意選擇跟自己PC的二進制版本號相應的Python版本號

2. 下載wxPython後,強烈建議下載演示版本號(demo),演示樣例程序很具體

------

創建演示樣例GUI程序

最簡單的演示樣例程序例如以下:

>>> import wx #導入模塊
>>> app = wx.App() #初始化主要的引用程序類
>>> app.MainLoop() #wx中的包方法大寫開頭,與Python習慣相反

窗體和組件

窗體也稱為框架,它是wx.Frame類的實例。wx框架中的部件都是由它們的父部件作為構造函數的第一個參數創建的。假設正在創建的一個單獨的窗體,就不須要考慮父部件,使用None就可以。

並且在調用app.MainLoop前須要調用窗體的

Show方法--否則它會一直隱藏.

  • 程序清單1:

import wx
app = wx.App()
win = wx.Frame(None)
win.Show()
app.MainLoop()

技術分享

  • 程序清單2: 在框架上加入button

#在框架上加入button也非常easy,僅僅要使用win作為父參數實例化wx.Button就可以.

import wx
app = wx.App()
win = wx.Frame(None)
btn = wx.Button(win)
win.Show()
app.MainLoop()

技術分享


  • 程序清單3: 使用keyword參數添加標簽和標題
import wx
app = wx.App()
win = wx.Frame(None,title="Simple Editor")
loadButton = wx.Button(win,label=‘Open‘)
saveButton = wx.Button(win,label=‘Save‘)
win.Show()
app.MainLoop()

技術分享

看樣子丟了一個button,實際上隱藏了。假設要顯示出來,裏面的post,size就得用上.

  • 程序清單4: 設置button位置
import wx

app = wx.App()
win = wx.Frame(None,title="Simple Editor",size=(410,335))
win.Show()
#位置坐標,x與y的值
loadButton = wx.Button(win,label=‘Open‘,pos=(225,5),size=(80,25))
saveButton = wx.Button(win,label=‘Save‘,pos=(315,5),size=(80,25))
#文本框(wx.TextCtrl的對象),默認可編輯。無滾動欄
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)
#style參數,能夠使用按位或OR聯合wx模塊中具有特殊名字的風格來指定
#wx.TE_MULTILINE 垂直滾動欄
#wx.HSCROLL      水平滾動欄
app.MainLoop()

技術分享

------

更智能的布局

在wx內進行布局的最簡單方法是使用尺寸器(sizer),最easy使用的工具是wx.BoxSizer。尺寸器會管理組件的尺寸。僅僅要將部件加入到尺寸器上,再加上一些布局參數。然後讓尺寸器自己去管理父組件的尺寸。在上面的樣例中,須要添加背景組件(wx.Panel)。創建一些嵌套的wx.BoxSizer,然後使用面板的SetSizer方法設定它的尺寸器。

  • 程序清單5: 使用尺寸器
#代碼的執行效果和上例同樣,僅僅只是用相對坐標而不是絕對坐標
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)
#wx.BoxSizer兩個參數wx.HORIZONTAL(垂直),wx.VERTICAL(水平,默認)
#Add方法有幾個參數,proportion參數依據在窗體改變大小時所分配空間設置比例
#比如:水平的BoxSizer中,filename組件在改變大小時獲取所有的額外空間
#假設這3個部件都把proprotion設置為1,那麽都會獲取相等的空間
#能夠講proportion設定為不論什麽數
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)

#flag參數相似於style參數,能夠使用|或者OR連接構造符號常量對其進行構造
#wx.EXPAND標記確保組件會擴展到所有分配的空間中。而wx.LEFT,wx.RIGHT,wx.TOP,
#wx.BOTTOM和wx.ALL標記決定邊框參數應用於哪個邊。用於設置邊緣寬度
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()
布局已經好了,但點擊button後什麽反應也沒有

------

完畢了的程序

剩下的工作,須要兩個處理函數:load和save。

當事件處理函數被調用時。事件對象event是唯一的參數

#文件名稱使用filename對象的GetValue方法獲取

#為了將文本引入文本區,僅僅要使用contents.SetValue就可以.

def load(event):
    file = open(filename.GetValue())
    contents.SetValue(file.read())
    file.close()

#save函數差點兒和load一樣,除了它有個‘w‘屬性以及write方法.

#GetValue用於從文本區獲得信息

def save(event):
    file = open(filename.GetValue(),‘w‘)
    file.write(contents.GetValue())
    file.close()

  • 程序清單6: 終於的程序
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()

------

其它工具包

能夠看以下最簡單樣例,僅僅有一個窗體,帶有Hello標簽的button,點擊button時。它會打印文本"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()
------

使用Tkinter

Python自帶的,以下是使用Tkinter實現的GUI程序

from Tkinter import *

def hello():
    print (‘Hello,World!‘)
    
win = Tk()
win.title(‘Hello,Tkinter!‘)
win.geometry(‘200x100‘)

btn = Button(win,text=‘Hello‘,command=hello)
btn.pack(expand=YES,fill=BOTH)

mainloop()
------

其它還能夠使用Jython和Swing

Jython: Python的Java實現,類似於wxPython和Tkinter這種包就不能用了。唯一可用的GUI工具包是Java標準庫包

中的AWT和Swing。




<<Python基礎教程>>學習筆記 | 第12章 | 圖形用戶界面