GUI
python提供了多个图形开发界面的库,几个常用Python GUI库如下:
Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macintosh系统里.,Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面。
Jython:Jython程序可以和Java无缝集成。除了一些标准模块,Jython使用Java的模块。Jython几乎拥有标准的Python中不依赖于C语言的全部模块。比如,Jython的用户界面将使用Swing,AWT或者SWT。Jython可以被动态或静态地编译成Java字节码。
安装:
本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口。这里介绍wxPython :
下载地址:
根据自己的操作系统下载相应版本。
安装过程非常简单,以win7系统为例,点击下载的exe 文件,保持安装目录与本机的python目录一致就OK了。
创建并显示一个框架
import wxapp=wx.App()win=wx.Frame(None)win.Show()app.MainLoop()
运行:
我们来创建一个文本编辑器,功能要求如下:
* 它可以打开给定文件名的文本文件;
* 它可以编辑文件文件
* 它可以保存文本文件
* 它可以正常退出程序
import wxapp=wx.App()win=wx.Frame(None,title='Simple Editor',size=(410,335))win.Show()loadButton=wx.Button(win,label='Open',pos=(225,5),size=(80,25))saveButton=wx.Button(win,label='Save',pos=(315,5),size=(80,25))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)app.MainLoop()
结果:
更智能的布局
使用尺寸器
import wxapp=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)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()
运行结果:
运行这段代码,窗口会和上面的相同,但是使用了相对坐标而不是绝对坐标。
wx.BoxSizer的构造函数带有一个决定它是水平还是垂直的参数,默认为水平。
add方法有几个参数,proportion参数根据在窗口改变大小时所分配的空间设置比例。flag参数类似于构造函数中的style参数,可以使用按位或运算符连接构造符号常量。
事件处理
上面的界面做好了,但是我们点击按钮不起任何的作用。
在GUI术语中,用户执行的动作(比如 点击按钮)叫做事件。我们需要让程序注意这些事件并且作出反应。
假设写了一个负责打开文件的函数,并将其命令为load ,然后就可以像下面这样将函数作为loadButton的事件处理函数:
loadButton.Bind(wx.EVT_BUTTON,load)
完成了的程序
让我们来完成剩下的工作,现在需要的就是两个事件处理函数:load(打开)和save(保存)。当事件被调用时,它会收到一个事件对象作为它唯一的参数,其中包括发生了什么事情的信息,但是在这里可以忽略这方法的事情,因为程序只关心点击时发生的事情。
def load(event): file=open(filename.GetValue()) contents.SetValue(file.read()) file.close()
上节刚刚学过文件的打开/读取,文件名使用filename对象GetValue方法获取。为了将文本引入文本区,只要使用contents.SetValue即可。
save函数和load类似,除了它需要写入(‘w’),以及用于文件处理部分的write方法,GetValue用于从文本区获得信息。
def save(event): file=open(filename.GetValue(),'w') file.write(contents.GetValue()) file.close()
最终的GUI程序
import wxdef 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()
运行结果:
使用步骤:
下面玩转这个小程序步骤:
1、文本框输入hello8.txt
2、文本区输入Hello.world!
3、点击保存(不会有保存成功的提示,但它已经成功了)
4、关闭编辑器,重新运行打开。
5、文件框输入hello8.txt ,点击“打开”按钮,上次编辑的内容(Hello.world!)在文本区出现了。
窗口含有一个‘hello’标签按钮,点击hello,会在文本框中显示'Hello,world!'
import wxdef 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()