python学习笔记(图形用户界面)

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 :

下载地址:http://www.wxpython.org/download.php

根据自己的操作系统下载相应版本。

安装过程非常简单,以win7系统为例,点击下载的exe 文件,保持安装目录与本机的python目录一致就OK了。

 

创建并显示一个框架

import wx
app=wx.App()
win=wx.Frame(None)
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))
contents=wx.TextCtrl(win,pos=(5,35),size=(390,260),style=wx.TE_MULTILINE| wx.HSCROLL)
app.MainLoop()

结果:

更智能的布局

使用尺寸器

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

运行结果:

运行这段代码,窗口会和上面的相同,但是使用了相对坐标而不是绝对坐标。

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

运行结果:

使用步骤:

下面玩转这个小程序步骤:

1、文本框输入hello8.txt 

2、文本区输入Hello.world!

3、点击保存(不会有保存成功的提示,但它已经成功了)

4、关闭编辑器,重新运行打开。

5、文件框输入hello8.txt ,点击“打开”按钮,上次编辑的内容(Hello.world!)在文本区出现了。

 

窗口含有一个‘hello’标签按钮,点击hello,会在文本框中显示'Hello,world!'

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

 

posted @ 2015-08-19 15:42  whats  阅读(10516)  评论(0编辑  收藏  举报