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