首页 > 代码库 > <<Python基础教程>>学习笔记 | 第12章 | 图形用户界面

<<Python基础教程>>学习笔记 | 第12章 | 图形用户界面

Python支持的工具包非常多。但没有一个被觉得标准的工具包。用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/

------

丰富的平台:

技术分享

Tkinter实际上类似于标准,由于它被用于大多数正式的Python GUI程序。并且它是Windows二进制公布版的一部分。

可是在UNIX上要自己编译安装。

还有一个越来越受欢迎的工具是wxPython。

这是个成熟并且特性丰富的包,也是Python之父,Guido van Rossum的最爱

------

下载安装wxPython

http://wxpython.org/download.php 

NOTE:

1. 注意选择跟自己PC的二进制版本号相应的Python版本号

2. 下载wxPython后,强烈建议下载演示版本号(demo),演示样例程序很具体

------

创建演示样例GUI程序

最简单的演示样例程序例如以下:

>>> import wx      #导入模块       
>>> app = wx.App() #初始化主要的引用程序类
>>> app.MainLoop() #wx中的包方法大写开头,与Python习惯相反

窗体和组件

窗体也称为框架,它是wx.Frame类的实例。wx框架中的部件都是由它们的父部件作为构造函数的第一个參数创建的。假设正在创建的一个单独的窗体,就不须要考虑父部件,使用None就可以。

并且在调用app.MainLoop前须要调用窗体的

Show方法--否则它会一直隐藏.

  • 程序清单1: 

import wx
app = wx.App()
win = wx.Frame(None)
win.Show()
app.MainLoop()

技术分享

  • 程序清单2: 在框架上加入button

#在框架上加入button也非常easy,仅仅要使用win作为父參数实例化wx.Button就可以.

import wx
app = wx.App()
win = wx.Frame(None)
btn = wx.Button(win)
win.Show()
app.MainLoop()

技术分享

  • 程序清单3: 使用keyword參数添加标签和标题
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()

技术分享

看样子丢了一个button,实际上隐藏了。假设要显示出来,里面的post,size就得用上.

  • 程序清单4: 设置button位置
import wx

app = wx.App()
win = wx.Frame(None,title="Simple Editor",size=(410,335))
win.Show()
#位置坐标,x与y的值
loadButton = wx.Button(win,label=‘Open‘,pos=(225,5),size=(80,25))
saveButton = wx.Button(win,label=‘Save‘,pos=(315,5),size=(80,25))
#文本框(wx.TextCtrl的对象),默认可编辑。无滚动栏
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)
#style參数,能够使用按位或OR联合wx模块中具有特殊名字的风格来指定
#wx.TE_MULTILINE 垂直滚动栏
#wx.HSCROLL      水平滚动栏
app.MainLoop()

技术分享

------

更智能的布局

在wx内进行布局的最简单方法是使用尺寸器(sizer),最easy使用的工具是wx.BoxSizer。尺寸器会管理组件的尺寸。仅仅要将部件加入到尺寸器上,再加上一些布局參数。然后让尺寸器自己去管理父组件的尺寸。在上面的样例中,须要添加背景组件(wx.Panel)。创建一些嵌套的wx.BoxSizer,然后使用面板的SetSizer方法设定它的尺寸器。

  • 程序清单5: 使用尺寸器
#代码的执行效果和上例同样,仅仅只是用相对坐标而不是绝对坐标
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)
#wx.BoxSizer两个參数wx.HORIZONTAL(垂直),wx.VERTICAL(水平,默认)
#Add方法有几个參数,proportion參数依据在窗体改变大小时所分配空间设置比例
#比如:水平的BoxSizer中,filename组件在改变大小时获取所有的额外空间
#假设这3个部件都把proprotion设置为1,那么都会获取相等的空间
#能够讲proportion设定为不论什么数
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)

#flag參数相似于style參数,能够使用|或者OR连接构造符号常量对其进行构造
#wx.EXPAND标记确保组件会扩展到所有分配的空间中。而wx.LEFT,wx.RIGHT,wx.TOP,
#wx.BOTTOM和wx.ALL标记决定边框參数应用于哪个边。用于设置边缘宽度
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()
布局已经好了,但点击button后什么反应也没有

------

完毕了的程序

剩下的工作,须要两个处理函数:load和save。

当事件处理函数被调用时。事件对象event是唯一的參数

#文件名称使用filename对象的GetValue方法获取

#为了将文本引入文本区,仅仅要使用contents.SetValue就可以.

def load(event):
    file = open(filename.GetValue())
    contents.SetValue(file.read())
    file.close()

#save函数差点儿和load一样,除了它有个‘w‘属性以及write方法.

#GetValue用于从文本区获得信息

def save(event):
    file = open(filename.GetValue(),‘w‘)
    file.write(contents.GetValue())
    file.close()

  • 程序清单6: 终于的程序
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()

------

其它工具包

能够看以下最简单样例,仅仅有一个窗体,带有Hello标签的button,点击button时。它会打印文本"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()
------

使用Tkinter

Python自带的,以下是使用Tkinter实现的GUI程序

from Tkinter import *

def hello():
    print (‘Hello,World!‘)
    
win = Tk()
win.title(‘Hello,Tkinter!‘)
win.geometry(‘200x100‘)

btn = Button(win,text=‘Hello‘,command=hello)
btn.pack(expand=YES,fill=BOTH)

mainloop()
------

其它还能够使用Jython和Swing

Jython: Python的Java实现,类似于wxPython和Tkinter这种包就不能用了。唯一可用的GUI工具包是Java标准库包

中的AWT和Swing。




<<Python基础教程>>学习笔记 | 第12章 | 图形用户界面