其它GUI簡介
. Python有極爲豐富的圖形工具包,這裏將使用4個較爲流行的工具包實現同一個簡單的GUI應用,這4個工具包分別是:Tix(Tk接口擴展)、Pmw(Python MegaWidgets Tkinter擴展)、wxPython(wxWidgets 的 Python 版本)以及 PyGTK(GTK+的 Python 版本)
Tk 接口擴展(Tix)
. Tix 模塊已經包含在 Python 標準庫中了,它是 Tcl/Tk 的一個擴展庫,它添加了許多新的控件、圖像類型以及其他可以使 Tk 作爲一個 GUI 開發工具包的命令:
from tkinter import Label,Button,END,tix //在python3中tix屬於子模塊了
top = tix.Tk()
top.tk.eval('package require Tix')
lb = Label(top,
text = 'Animals (in pairs;min:pair,max:dozen)')
lb.pack()
ct = tix.Control(top,label = 'Number:',integer = True,
max = 12,min = 2,value = 2,step = 2)
ct.label.config(font = 'Helvetica -14 bold')
ct.pack()
cb = tix.ComboBox(top,label = 'Type:',editable = True)
for animal in ('dog','cat','hamster','python'):
cb.insert(END,animal)
cb.pack()
qb = Button(top,text = 'Quit',command = top.quit,bg = 'red',fg = 'white')
qb.pack()
top.mainloop()
. 代碼展示了combobox和control兩個控件,沒什麼特別的,只是看看四種方式下的界面風格有什麼不同。
Python MegaWidgets(PMW)
. 這個模塊用來解決 Tkinter 的老舊問題。它通過在 GUI 工具包中添加一些更新式的控件來延長 Tkinter 的生命力。
from tkinter import Button,END,Label,W
from Pmw import initialise,ComboBox,Counter
top = initialise()
lb = Label(top,
text = 'Animals (in pairs; min: pair,max: dozen)')
lb.pack()
ct = Counter(top,labelpos = W,label_text = 'Number:',
datatype = 'integer',entryfield_value = 2,
increment = 2,entryfield_validate = {'validator':'integer',
'min':2,'max':12})
ct.pack()
cb = ComboBox(top,labelpos = W,label_text = 'Type:')
for animal in ('dog','cat','hamster','python'):
cb.insert(END,animal)
cb.pack()
qb = Button(top,text = 'quit',command = top.quit,bg = 'red',fg = 'white')
qb.pack()
top.mainloop()
. 和上一個代碼最大的不同是pmw使用的控制數量的控件時Counter,不同於控件構造函數的關鍵字來指定最小值和最大值,pmw使用一個‘validator’來確保值不會落在預期範圍之外。
wxWidgets 和 wxPython
. wxWidgets(以前稱爲 wxWindows)是一個可以構建圖形用戶應用的跨平臺工具包。wxWidgets 使用 C++實現,並且由於它定義了一致、通用的 API,因此可以在很多平臺上使用。wxWidgets 最大的優點是它使用了每個平臺上 的原生 GUI,所以你的程序可以和其他桌面應用有相同的視覺效果。另一個特點是你不會被侷限於使用 C++開發 wxWidgets 應用,因爲它還有 Python 和 Perl 的接口。
import wx #雖然導入的是這個模塊名字,但是下載的時候是wxPython
class MyFrame(wx.Frame):
def __init__(self,parent = None,id = -1,title = ''):
wx.Frame.__init__(self,parent,id,title,size=(250,140))
top = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL) #所有控件都放在sizer中組織
font = wx.Font(9,wx.SWISS,wx.NORMAL,wx.BOLD)
lb = wx.StaticBox(top,-1,'Animals (in pairs;min: pair,max: dozen)')
sizer.Add(lb)
c1 = wx.StaticText(top,-1,'Number:')
c1.SetFont(font)
ct = wx.SpinCtrl(top,-1,'2',min = 2,max = 12)
sizer.Add(c1)
sizer.Add(ct)
c2 = wx.StaticText(top, -1, 'Type:')
c2.SetFont(font)
cb = wx.ComboBox(top, -1, '', choices = ('dog','cat','hasmter','python'))
sizer.Add(c2)
sizer.Add(cb)
qb = wx.Button(top,-1,"quit")
qb.SetBackgroundColour('red')
qb.SetForegroundColour('white')
self.Bind(wx.EVT_BUTTON,lambda e: self.Close(True),qb)
sizer.Add(qb)
top.SetSizer(sizer)
self.Layout()
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(title='wxanimals')
frame.Show()
self.SetTopWindow(frame)
return True
def main():
pp = MyApp()
pp.MainLoop()
if __name__ == '__main__':
main()
. 這裏實例化了一個Frame類,其中包含它的構造函數,用來創建控件,在框架中,創建了一個Panel,在這個面板中又使用BoxSizer來包含所有控件並對他們進行佈局,其中SpinCtrl控件有一個缺點是不支持步進函數(不能跳多個)。
關於這個模塊更多的教程在WxPython教程。
GTK+和 PyGTK
. 關於這個的文檔:Python GTK+
相關模塊和其他GUI
. 可參考:GUI for Python