Python核心編程筆記————GUI編程(二)

其它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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章