首页 > 代码库 > python基础教程_学习笔记23:图形用户界面

python基础教程_学习笔记23:图形用户界面

图形用户界面

丰富的平台

在编写Python GUI程序前,需要决定使用哪个GUI平台。

简单来说,平台是图形组件的一个特定集合,可以通过叫做GUI工具包的给定Python模块进行访问。

工具包

描述

Tkinter

使用Tk平台。很容易得到。半标准。

wxpython

基于wxWindows。跨平台越来越流行。

PythonWin

只能在Windows上使用。使用了本机的Windows GUI功能。

JavaSwing

只能用于Jython。使用本机的Java GUI

PyGTK

使用GTK平台,在linux上很流行。

PyQt

使用Qt平台,跨平台。

 

每个工具包都有利弊,但很大程度上取决于个人喜好。

以下以wxPython为例。

下载和安装wxPython

下载地址:

http://wxpython.org/download.php

注意:如果python64位的,则必须选用64位的wxPython,否则即便是64位的操作系统也应该选用32位的wxPython

 

建议下载wxPython的演示版本,并研究它。

创建示例GUI应用程序

开始

 

开始需要导入wx模块:

import wx

 

编写wxPython程序的方法很多,但不可避免的事情是创建应用程序对象。基本的应用程序类是ex.App,它负责幕后所有的初始化。最简单的wxPython程序应该像下面这样:

import wx

app=wx.App()

app.MainLoop()

因为没有任何用户可以交互的窗口,程序会立刻退出。

 

wx包中的方法都是以大写字母开头的,这和python的习惯是相反的。这样做的原因是这些方法名和基础的c++wxWidgets中的方法名都是对应的。尽管没有正式的规则反对方法或者函数名以大写字母开头,但规范的做法是为类保留这样的名字。

 

窗口和组件

窗口(Window)也称为框架(Frame),它只是wx.Frame类的实例。

wx框架中的部件都是由它们的父部件作为构造函数的第一个参数创建的。如果正在创建一个单独的窗口,就不需要考虑父部件,使用None即可。而且在调用app.MainLoop()前需要调用窗口的Show方法——否则它会一直隐藏。

 

import wx

 

app=wx.App()

win=wx.Frame(None)

win.Show()

app.MainLoop()

 

执行结果:

 

 

增加按钮:

import wx

 

app=wx.App()

win=wx.Frame(None)

btn=wx.Button(win)

win.Show()

app.MainLoop()

执行结果:

 

 

标签、标题和位置

可以在创建部件的时候使用构造函数的label参数设定标签,用title设定标题。

import wx

 

app=wx.App()

win=wx.Frame(None,title="Simple Editor")

 

loadButton=wx.Button(win,label=‘Open‘)

saveButton=wx.Button(win,label=‘Save‘)

 

win.Show()

app.MainLoop()

 

执行结果:

 

 

应该有两个按钮,实际只有一个是因为另一个被隐藏掉了。

 

 

调节按钮位置:

import wx

 

app=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))

contexts=wx.TextCtrl(win,pos=(5,35),size=(390,260),style=wx.TE_MULTILINE | wx.HSCROLL)

 

app.MainLoop()

 

执行结果:

 

 

更智能的布局

在调整窗口大小时,应该能保证窗口中的组件也会随之调整大小和位置。

 

wx内进行布局的最简单方法是使用尺寸器(sizer),最容易使用的工具就是wx.BoxSizer

import wx

 

app=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()

 

执行结果:

 

拉伸效果

 

事件处理

GUI术语中,用户执行的动作叫做事件(event

让程序注意这些事件并作出反应。可以将函数绑定到所涉及的事件可能发生的组件上达到这个效果。当事件发生时,函数会被调用。利用部件的Bind方法可以将事件处理函数链接到给定的事件上。

完成了的程序

代码:

import wx

 

def 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()

 

输入地址,点击open按钮,下面显示文件内容。

在下面区域编辑后点击save按钮关闭程序。

执行1步骤可看到刚才编辑的效果。