天天看点

Python程序设计之GUI(1)

1.GUI常用库

①标准库:tkinter

②扩展库:wxPython、PyGObject、PyQt、PySide

2.wxPython

①使用方法:

a)首先导入wxPython包;

import wx
           

b)然后建立框架类,框架类的父类名字为wx.Frame,在框架类构造函数种要初始化父类,然后为子类添加各种控件以及1处理办法

class myFrame(wx.Frame):    #继承父类
    def __init__(self,superior):
        wx.Frame.__init__(self,parent=superior,title=u'My First Form',size=(300,300))
           

c)最后建立主程序,创建应用程序对象、创建框架类对象、显示框架、开始事件循环;执行子类.Show(True)后,框架才可以看见,执行app.MainLoop()后才可以接收并处理事件

if __name__=='__main__':
    #创建应用程序
     app=wx.App()
    #创建框架类对象
     frame=myFrame(None)
    #显示框架
     frame.Show(True)
    #使得控件可以接收和处理事件
     app.MainLoop()
           

②第一个GUI程序:

a)框架类的构造函数:
class myFrame(wx.Frame):    #继承父类
    def __init__(self,superior):
        wx.Frame.__init__(self,parent=superior,title=u'My First Form',size=(300,300))   #调用父类初始化自己的框架

        #为按钮绑定事件自己的事件,改变大小和移动窗体
        self.Bind(wx.EVT_SIZE,self.OnSize)
        self.Bind(wx.EVT_MOVE,self.OnFrameMove)

        #添加一个pane和一些控件来展示位置和大小
        panel=wx.Panel(self,-1)
        label1=wx.StaticText(panel,-1,'FrameSize:')
        label2=wx.StaticText(panel,-1,'FramePos:')
        label3=wx.StaticText(parent=panel,label='MousePos:')
        #初始化窗体大小,位置和鼠标位置
        self.sizeFrame=wx.TextCtrl(panel,-1,"",style=wx.TE_READONLY)
        self.posFrame=wx.TextCtrl(panel,-1,"",style=wx.TE_READONLY)
        self.posMouse=wx.TextCtrl(panel,-1,"",style=wx.TE_READONLY)
        panel.Bind(wx.EVT_MOTION,self.OnMouseMove)  #绑定事件处理函数
        self.panel=panel

        #为窗体的布局设置样式
        sizer=wx.FlexGridSizer(3,2,5,5)
        sizer.Add(label1)
        sizer.Add(self.sizeFrame)
        sizer.Add(label2)
        sizer.Add(self.posFrame)
        sizer.Add(label3)
        sizer.Add(self.posMouse)

        #边框设置
        border=wx.BoxSizer()
        border.Add(sizer,0,wx.ALL,15)
        panel.SetSizerAndFit(border)
        self.Fit()
           

b)框架类的事件

def OnSize(self,event):          #设置窗体的大小
        size=event.GetSize()
        print('打印窗体大小:',size,end='\n')
        self.sizeFrame.SetValue("%s,%s"%(size.width,size.height))
        event.Skip()

    def OnFrameMove(self,event):    #窗体1移动事件处理函数
        pos=event.GetPosition()
        print('打印窗体位置:',pos,end='\n')
        self.posFrame.SetValue("%s,%s"%(pos.x,pos.y))

    def OnMouseMove(self,event):    #鼠标移动事件处理函数
        pos = event.GetPosition()
        print('打印鼠标位置:',pos,end='\n')
        self.posMouse.SetValue("%s,%s" % (pos.x, pos.y))
           

c)主程序

if __name__=='__main__':
    #创建应用程序
     app=wx.App()
    #创建框架类对象
     frame=myFrame(None)
    #显示框架
     frame.Show(True)
    #使得控件可以接收和处理事件
     app.MainLoop()
           

d)运行结果

Python程序设计之GUI(1)

③代码分析

a)父类构造函数

parent:框架的父窗体,值为None时表示创建顶级窗体

id:新窗体的wxPythonID号,可以明确传递一个唯一的ID,值为-1时,wxPython自动生成一个ID

title:窗口的标题

pos:用来指定新窗体的左上角在屏幕中的位置,通常(0,0)表示屏幕左上角的位置;DefaultPosition=(-1,-1)表示有系统决定位置

size:指定新窗体初始大小,当其为DefaultSize=(-1,-1)时,表示由系统来决定初始化大小

style:指定窗体类型的常量,有多种样式

name:框架的名字,指定后可以通过名字来寻找窗体

b)常用style参数设置

添加标题栏:wx.CAPTION

默认样式:wx.DEFAULT_FRAME_STYLE

关闭按钮:wx.CLOSE_BOX

最大化按钮:wx.MAXIMIZE_BOX

最小化按钮:wx.MINIMIZE_BOX

边框可以改变尺寸:wx.RESIZE_BORDER

边框没有装饰SIM:wx.PLE_BORDER

增加系列菜单:wx.SYSTEM_MENU

创建非矩形窗体:wx.FRAME_SHAPED

设置工具框:wx.FRAME_TOOL_WINDOW

使用方法可以叠加使用:

style=wx.FRAME_TOOL_WINDOW|wx.FRAME_SHAPED|wx.RESIZE_BORDER
           

不能改变窗体的大小和缩放

学习笔记:

1.使用wxPython创建窗体的三个步骤;

2.style样式设置可以叠加使用;

3.name属性值指定后可以原来搜索窗体;

4.在初始化窗体时可以明确传递一个ID,如果无法确定使用哪一个ID,可以通过wx.NewId()方法来生成ID,避免确保ID唯一性的麻烦;

id=wx.NewId()
frame=wx.Frame.__init__(None,id)
           

也可以使用全局变量来实现创建ID

wx.ID_ANY(值为-1)
           

通过GetId()方法来查看ID

frame=wx.Frame.__init__(None,-1)
id=frame.GetId()