第十二章 图形用户界面

下载wxPython

还记得window  中python 文件可以以    pyw后缀结尾吗?     使用pyw结尾的python文件,可以在没有DOS窗口的情况下运行python ——对于GUI很不错

12.3.1   开始

首先,必需创建应用程序对象。基本的应用程序类叫做wx.App,负责幕后所有的初始化

注意,wx包中的方法都是以大写开头的,这是一种习惯,因为这些方法名和基础C++包wxwidgets中方法名都是对应的


12.3.2  窗口和组件

窗口(window)也叫框架(Frame),是wx.Frame的实例

wx框架中的部件都是由他们的父亲部件作为构造函数(比如Frame,Button这类的构造函数)的第一个参数创建的

l例子

import wx
app=wx.App()  #创建应用程序对象
win=wx.Frame(None)   #这里创造单独框架,不考虑父部件(),参数是None
#btn=wx.Button(win)   #在框架上加一个按钮————使用win作为父参数实例化wx.Button
win.Show()           #唤出框架
app.MainLoop()

app.MainLoop()是一个主事件循环

12.3.3    标签,标题和  位置

使用构造函数的       label   参数设定部件的标签
title     参数设定框架的标题
(最好使用关键字参数,这样就不用记住顺序了)

一个改变位置和设置尺寸的基础的方法(但是不实用)  是使用     pos   (x,y)    和        size (宽,高)      参数
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))

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


这里,还创建了两个     文本控件  (text control    wx.TextCtrl对象)    文本控件默认是          文本框  (一行可编辑的文本)

还使用了              style 参数(实际上值是个整数)调整风格

比如这里,我们使用了具有特殊名字的风格来制定style的值 ,  wx.TE_MULTILINE 来获取多行文本(默认有垂直滚动条) wx.HSCROLL  获取水平滚动条


12.3.4 更智能的布局

上面的方法在调整窗口大小时,窗口组件的大小和位置不会变化(因为它们的位置和大小都是显式设定的),不好
下面使用尺寸器(sizer):属于一个容器窗口(比如:wx.Panel),在父中创建的子窗口必需被添加给sizer(将部件加到尺寸器上)再加一些布局参数,然后让尺寸器自己去管理父组件内部件的尺寸。
首先增加一个背景组件   wx.Panel   作为其他组件的父组件 ,其他子组件全再父组件上    创建一些嵌套的wx.BoxSize             然后使用面板panel的SetSizer  方法设定它的尺寸器
 
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() : 创建一个尺寸器,有一个参数:(wx.HORIZONTAL  或 wx.VERTICAL)决定尺寸器时是水平还是垂直的(默认水平的)
. Add   方法:使用尺寸器的Add方法来把组件加到尺寸器中
参数:proportion  :根据在窗口改变大小时所分配的空间设置比例
flag:类似style参数,设置尺寸器上子组件的风格;wx.EXPAND确保组件会扩展到所分配空间中。而wx.LFET等标记决定了      边框参数应用于哪个边
border:     设置边框属性

12.3.5   事件处理

用户执行的动作叫做事件(event)
使用     部件      的     Bind          方法,将事件处理函数绑定到给定的事件上
假如有一个负责打开文件的函数   load    ,那么可以这么使用
loadButton.Bind(wx.EVT_BUTTON,load)
一个   按钮事件


12.3.6     完成了的程序

当事件处理函数被调用的时,它会收到一个事件对象作为它唯一的参数(包含了发生了什么事的信息)

def load(event):
    file=open(filename.GetValue())        #filename是小文本框
    contents.SetValue(file.read())
    file.close()

使用文本框组件的  GetValue()        和         SetValue()方法来获得或者设置文本框的文本
#-*- coding: utf-8 -*-
import wx
def load(event):
    file=open(filename.GetValue())        #filename是小文本框
    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()






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值