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

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