Python编程语言基础 wxWidget图形库doc.docx
《Python编程语言基础 wxWidget图形库doc.docx》由会员分享,可在线阅读,更多相关《Python编程语言基础 wxWidget图形库doc.docx(9页珍藏版)》请在冰豆网上搜索。
![Python编程语言基础 wxWidget图形库doc.docx](https://file1.bdocx.com/fileroot1/2023-2/1/70a5d447-8971-4757-83d9-79cebf08f010/70a5d447-8971-4757-83d9-79cebf08f0101.gif)
Python编程语言基础wxWidget图形库doc
Python编程语言基础wxWidget图形库
WxPython漂亮的界面是gui程序的重要组成部分。
wxPython可以做到这一点,Python强大的功能和简洁的语法使它成为Python图形用户界面的主流。
WxPython是wxWidget库的Python包。
提供了一些库和工具。
通过这种方式,wxpython具有python语言的优点:
语法强,编写的代码少;wxWidget图形库也有优势。
只需将控制器直接拉至大致位置。
您不需要调整控件的对齐方式,也不需要关心gui界面是否支持不同分辨率的桌面。
此外,接口可以在运行时切换,只需编写几个切换代码。
跨平台图形库创建最小的空的wxPython程序IMPORTWX#CLASAPP(WXAP):
#DEFONINIT(自):
#FRAME=WXFRAME(父=无)。
基本的wxPython程序,创建最小的空wxPython程序,说明了开发任何wxPython程序所必需的五个基本步骤:
、导入必需的wxPython包、子类wxPython应用程序类、定义应用程序的初始化方法、创建应用程序类的实例、进入主事件循环wxPython此应用程序的wxPython导入wxPythonImportwx一旦导入此包
一般来说,Python中模块导入的顺序无关紧要。
但是wxPython的不同之处在于它是一个复杂的模块。
当您第一次导入wx模块时,wxPython将对其他wxPython模块执行一些初始化工作。
例如,在导入wx模块之前,wxPython中的一些子包(如xrc模块)无法正常工作。
我们必须按以下顺序导入它们:
导入wxPython导入WXFromWXimportXRC与应用程序和框架一起使用。
导入WX模块后,您可以创建应用程序对象和框架对象。
每个wxPython程序必须有一个应用程序对象和至少一个框架对象。
应用程序对象必须是wxApp的实例或您在OnInit()方法中定义的子类的实例。
当您的应用程序启动时,wxApp父类将调用OnInit()方法。
wxPythonapplicationclassmyapp(wxap)子类化:
defonit(self):
frame=wxframe(parent=none,id=,title=bare)frameshow()返回Wxpythonapplication类的真实子类化注意:
我们还没有为我们的应用程序类定义init()方法。
在Python中,这意味着创建对象时将自动调用父方法wxAppinit()。
这是一件好事。
如果您定义了自己的init()方法,不要忘记调用它的基类。
init()方法的示例有:
ClassApp(WxApp):
Define(Self):
WxAppNit(Self)如果您忘记这样做,将不会初始化wxPython,也不会调用您的OnInit()方法。
创建一个应用程序实例,并输入其主事件循环app=App()appMainLoop()实例importwxclassframe(wxframe):
passclassapp(wxapp):
defonit(self):
selfframe=frame(parent=none)。
title=#spare#)selfframeshow()selfframe(selfframe)returnruiefname==#main#:
app=app()appmainloop()实例我们更改了您创建框架对象的方式。
该程序的裸版本只是创建了wxFrame类的一个实例。
另外,我们将自己的框架类定义为wxFrame的子类。
在这一点上,最终的结果没有什么不同,但是如果您想要在您的框架中显示一个菜单,如text、button、等,您可能需要您自己的框架类。
初始化在OnInit()方法中,我们调用了应用程序类自己的SetTopWindow()方法,并将它传递给我们新创建的框架实例。
我们不需要定义SetTopWindow()方法,因为它继承自wxApp父类。
SetTopWindow()方法是一个可选的方法,它让wxPython方法知道哪个框架或对话框将被视为主要的。
一个wxPython程序可以有几个框架,其中一个被设计为应用程序的顶层窗口。
给你的wxPython程序一个坚实的基础。
wxPython程序也有一个基础。
它由两个支持应用程序其余部分的必要对象组成。
它们是应用程序对象和顶层窗口对象。
正确使用这两个对象将为您的wxPython应用程序提供一个坚实的开端,并使构建应用程序的其余部分变得更加容易。
给你的wxPython程序一个坚实的基础应用程序对象管理主事件周期主事件周期是wxPython程序的力量。
启动主事件循环是应用程序对象的工作。
没有应用程序对象,您的wxPython应用程序将无法运行。
顶层窗口通常管理最重要的数据控件,并将其呈现给用户。
例如,在字处理器中,主窗口是文档的显示部分,可能管理文档的某些数据。
同样,网页浏览器的主窗口会同时显示您感兴趣的页面,并将页面作为数据对象进行管理。
如何创建和使用应用程序对象?
任何wxPython应用程序都需要一个应用程序对象。
这个应用程序对象必须是wxApp类或其自定义子类的实例。
应用程序对象的主要目的是管理幕后的主事件循环。
该事件循环响应窗口系统事件,并将它们分配给适当的事件处理程序。
这个应用程序对象对于wxPython进程的管理非常重要,因此在您的程序实例化一个应用程序对象之前,您不能创建任何wxPython图形对象。
如何创建和使用应用程序对象?
父类wxApp还定义了一些对整个应用程序来说是全局的属性。
很多时候,它们都是您应用程序对象所需要的。
如果您需要管理额外的全局数据或连接(如数据库连接),您可以自定义应用程序子类。
在某些情况下,您可能希望扩展这个主事件循环,以便进行专门的错误或事件处理。
然而,默认的事件循环适用于您想要编写的几乎所有wxPython应用程序。
创建WXAP的子类和创建自己的WXAP子类非常简单。
当您启动应用程序时,创建自己的wxApp子类通常是一个好主意,即使您没有定制任何特性。
要创建和使用WXAP子类,您需要执行四个步骤:
创建WXAP子类、定义这个子类、在定义的子类中编写一个OnInit()方法、在程序的主要部分创建这个类的实例、调用应用程序实例的MainLoop()方法。
这个方法将程序的控制权转移到wxPythonOnInit()上,它是wxPython体系结构的一部分,因此您的定制类的任何必需的初始化通常由OnInit()方法管理,而不是在Python的Init方法中。
如果由于某种原因您决定需要init方法,那么您必须在您的init方法中调用父类的init方法,如下所示:
wxAppinit(self)创建一个wxApp的子类。
通常您将在OnInit()方法中创建至少一个框架对象,并调用框架的Show()方法。
您还可以通过调用SetTopWindow()方法,将框架指定为应用程序的顶级窗口。
顶层窗口用作没有指定父窗口的对话框的默认父窗口。
了解应用程序对象的生命周期wxPython应用程序对象的生命周期从创建应用程序实例时开始,到最后一个应用程序窗口关闭时结束。
这不一定对应于您的wxPython应用程序所在的Python脚本的开头和结尾。
Python脚本可以选择在创建wxPython应用程序之前执行一个操作,并且可以在wxPython应用程序的MainLoop()退出后执行一些清理。
但是,所有wxPython操作都必须在应用程序对象的生命周期中执行。
了解应用程序对象的生命周期创建应用程序对象会触发OnInit()方法,并允许创建新的窗口对象。
在OnInit()之后,该脚本调用MainLoop()方法来通知wxPython事件正在处理。
在窗口关闭之前,应用程序继续其事件处理。
当所有顶层窗口关闭时,MainLoop()函数返回,应用程序对象注销。
之后,脚本可以关闭其他潜在的大量连接或线程。
了解应用程序对象的生命周期是如何指导wxPython程序的输出的。
所有Python程序都可以通过两个标准流输出文本:
标准输出流sysstdout和标准错误流sysstderr。
通常,Python脚本会将标准输出定向到运行它们的控制台。
但是,当您的应用程序对象被创建时,您可以决定使用wxPython来控制标准流程并将输出重定向到一个窗口。
这种重定向行为是wxPython在Windows下的默认行为。
在Unix系统中,WxPython默认情况下不控制这个标准流。
在所有系统中,可以在创建应用程序对象时显式指定重定向行为。
我们建议使用此功能,并始终指定重定向行为,以避免不同平台上不同行为导致的任何问题。
重定向输出如果wxPython控制标准流,通过任何方法发送到该流的文本将被重定向到wxPython框架。
在wxPyton应用程序启动之前或之后发送到流中的文本将被处理(输出到控制台),就像Python通常做的那样。
重定向输出导入wximportsysclassframe(wxframe):
定义(self,parent,id,title):
printframeintwxframeit(self,parent,id,Title)重定向输出类应用程序(WXAPP):
定义(self,redirect=true,Filename=none):
printappinitwxappinit(self,Redirect,Filename)definit(self):
printonit#输出到stdoutselfframe=frame(parent=none,id=,Title=rsquostartupsqueo)#创建帧selfframeshow()selfframeprintsstderrApretenderrormessage#输出到stderrreturnrueedforexit(self):
printexit重定向输出ifname==rsquomain:
app=app(redirect=true)#文本重定向从这里开始,PrintBeforeMailoopMainLoop()#进入主事件循环printafterMainLoop如何关闭WxPhython应用程序当用户关闭应用程序的最后一个顶级窗口时,WxPhython应用程序退出。
顶层窗口是指任何没有父窗口的框架不仅仅是使用SetTopWindow()方法设计的框架。
这包括由wxPython自己创建的任何框架。
在我们的重定向示例中,虽然只有主框架使用SetTopWindow()进行了注册,但在主框架和输出重定向框架都关闭后,wxPython应用程序退出,尽管应用程序没有显式创建这个输出重定向框架。
要使用编程触发关闭,您可以在这里调用所有所谓的顶级窗口上的Close()方法来管理wxApp子类的正常关闭。
OnExit()方法是在最后一个窗口关闭之后、WxBython的内部清理过程之前调用的。
您可以使用OnExit()方法来清理您创建的任何非WxBython资源(如数据库连接)。
即使wxExit()用于关闭wxPython程序OnExit(),该方法仍将被触发。
如果由于某种原因,您希望wxPython应用程序在最后一个窗口关闭后继续运行,您可以使用wxAppSetExitOnFrameDelete(标志)方法来更改默认行为。
如果标志参数设置为False,则在最后一个窗口关闭后,wxPython应用程序将继续运行。
这意味着wxApp实例将继续存在,事件周期将继续处理事件。
例如,您也可以在这里创建所有新的所谓顶级窗口。
WxPython应用程序将保持活动状态,直到显式调用全局函数wxExit()为止。
管理紧急关闭wxApp的ExitMainLoop()方法。
此方法显式使用主消息循环终止控件来离开MainLoop()函数。
调用全局方法wxExit()。
如何创建和使用顶级窗口对象应用程序必须至少有一个顶级窗口对象。
顶层窗口对象通常是wxFrame类的子类,尽管它也可以是wxDialog的子类。
当您创建wxFrame的子类时,您的类应该调用它的父类构造函数wxFrameinit()。
wxFrame的构造函数所需的参数如下:
wxframe(父,ID=,title=,pos=wxefaultposition,size=wxefaultsize,style=wxefaultframestyle,name=frame)WxPhython标识号是WxPhython中所有小部件的特征。
在wxPython应用程序中,每个小部件都有一个窗口标识符。
每个帧中的标识号必须是唯一的,但您可以在帧之间重复使用该标识号。
但是,我们建议您在整个应用程序中保持唯一的标识号,以防止在处理事件时出现错误和混淆。
在wxPython中还有一些标准的预定义标识号,它们有特定的含义(例如,wxIDOKwxIDCANCEL是对话框中“确定”和“取消”按钮的标识号)。
标识号最重要的用途是在特定对象上发生的事件和响应该事件的回调函数之间建立唯一的关联。
WxPython的标识有三种方法来创建小部件使用的标识号:
、向构造函数显式传递正整数、使用wxNewId()函数、向小部件的构造函数传递全局常量wxIDANY或如何向小部件的构造函数添加框架的对象和子窗口ImportWxclasssinsertframe(Wxframe):
define(self,parent,id):
wxframingit(self,parent,ID,rsquoframeworkbuttonrsquosize=(,))panel=wxpanel(self)#createartboardbutton=wxbutton(panel,label=close,Pos=(,),size=(,)#addbuttontoartboard#bindbuttonclickEventselfbind(wxevtbutton,selfoncloseme,button)#bindwindowcloseEventselfbind(wxevtclose,selfonclosewindow)defocoseme(self,Event):
selfclose(True)DefoncloseWindow(self,Event):
howEvent):
SelfDetroy()将对象和子窗口添加到框架ifnameId=)框架显示()appMainLoop()添加菜单栏、工具栏和状态栏面板=wxpanel(self)面板设置背景颜色(lsquowhitersquo)状态栏=selfcreatestaubar()#创建状态栏工具栏=selfCreateToolBar()#创建工具栏工具栏工具栏添加简单工具(WxNewID(),ImagesGetNewBitMap(),新建,LONGHELPFORSQUANEWRSQUAO)#向工具栏添加工具工具栏工具栏创建()#准备显示工具栏菜单栏=wxMenuBar()#创建菜单栏#创建两个菜单文件)菜单=wxMenu()将菜单栏、工具栏和状态栏#添加到框架中以创建菜单项菜单追加(wxnewid(),复制,复制安装工具栏)菜单追加(wxnewid(),剪切),菜单追加(wxnewid(),粘贴),菜单添加器()菜单添加器()菜单添加(WxNewID(),选项,显示选项)菜单栏(菜单,编辑)#附加菜单自定菜单栏(菜单栏)#附加菜单栏到框架如何使用常规对话框wxPython提供丰富的
在本节中,我们将讨论三种从用户获取信息的对话框:
、消息对话框、文本输入对话框、从列表中选择一个消息对话框并与用户通信。
最基本的机制是wxMessageDialog,这是一个简单的提示框。
WxMessageDialog可以用作简单的“确定”框或“是”对话框。
dlg=wxMessageDialog(无,rsquoIsthisthecoolestthingever!
如果您想从用户那里获得单行文本,可以使用wxTextEntryDialog类。
DLG=WXTEXTENTRYDIALOG(NONE,WHOISBURIENGRANTRSQUAOSTOMB,RSQUAUQUANTSURQUAO)IFDLGSHOWMODAL()==WXIDOK:
REsponse=DLGGETVALUE()。
从列表中选择允许用户仅从您提供的列表中选择类wxSingleChoiceDialog。
DLG=WxSingLeechiceDialog(None,RSQuOwhatVersionofythonareyouusingsizes,rsquoSingleChoicersquo,lsquo,rsquo,rsquo,rsquo,rsquo,IFdlgshowmodal()==wxidok:
response=dlggeststringselection()事件处理事件处理是wxPython程序工作的基本机制。
主要执行事件处理的任务称为事件驱动。
事件是发生在您的系统中的事情,您的应用程序通过触发相应的功能来响应它。
事件可以是低级别的用户操作,如鼠标移动或按键,也可以是高级别的用户操作(在wxPython的小部件中定义),如单击按钮或菜单选择。
事件可由系统产生,如关机。
您甚至可以创建自己的对象来创建自己的事件。
WxPython应用程序通过将特定类型的事件与响应事件而执行的特定代码片段相关联来工作。
将事件映射到代码的过程称为事件处理。
事件驱动程序事件驱动程序主要是一个接受事件并对其做出响应的控制结构。
wxPython程序(或任何事件驱动程序)具有不同于普通Python脚本的结构。
标准Python脚本有特定的起点和终点。
程序员使用条件、循环、和函数来控制执行顺序。
尽管每个事件驱动系统之间有一些不同,但是它们有许多相似之处。
以下是事件驱动程序结构的主要特性列表:
、初始化后程序的大部分时间都花在空循环中。
进入这个循环标志着与用户交互的程序部分的开始。
退出这个循环标志着结束。
在wxPython中,这个循环的方法是:
wxAppMainLoop()并在您的脚本中显式调用。
当所有顶层窗口关闭时,主循环退出。
、程序包含与程序环境中发生的事件相对应的事件。
事件通常由用户行为触发,但也可以由系统行为或程序中的任何其他代码触发。
wxPython中的所有事件都是wxEvent类或其子类的实例。
每个事件都有一个事件类型属性,可以区分不同的事件。
例如,鼠标释放和鼠标点击事件被认为是同一个类的实例,但是具有不同的事件类型。
事件驱动、作为这个空循环的一部分,程序定期检查是否有任何请求响应发生。
有两种机制可以让事件驱动系统得到事件通知。
wxPython最常用的方法是将事件发送到中央队列,这将触发相应事件的处理。
另一种方法是使用轮询方法。
主进程会定期查询所有可能导致事件的事件,并询问是否有任何已处理的事件。
、当事件发生时,基于事件的系统会尝试确定相关代码,以便在执行任何相关代码时处理该事件。
在wxPython中,原始系统事件被转换为wxEvtHandlerProcessEvent实例,然后使用wxevthandlerevent()方法将事件分派给适当的处理器代码。
事件驱动事件机制的组件是事件绑定器对象和事件处理程序。
事件绑定器是一个预定义的wxPython对象。
每个事件都有自己的事件绑定器。
事件处理程序是一个函数或方法,它需要一个wxPython事件实例作为参数。
当用户触发适当的事件时,将调用事件处理程序。
编写事件处理程序wxPython代码时的事件和事件处理程序基于相关的小部件。
例如,单击一个按钮,并基于该按钮将其分配给一个专用的事件处理程序。
为了将特定小部件中的事件绑定到特定的处理器方法,您需要使用binder对象来管理连接。
Selfbind(wxevtbutton,selfonclick,abatton)编写wxCloseEvent,它是事件处理程序wxEvent的一个重要子类:
当框架关闭时触发。
事件类型分为正常帧关闭和系统关闭事件。
WxCommandEvent:
与小部件的简单交互将触发此事件,例如按钮点击、菜单项选择、单选按钮选择。
这些交互有它们自己的事件类型。
许多更复杂的小部件,如列表,定义了wxCommandEvent的子类。
事件处理系统将命令事件与其他事件区别对待。
WxKeyEvent:
按键事件。
此事件的类型分为按键、释放键、整键动作。
WxMouseEvent:
鼠标事件。
该事件的类型是鼠标移动和鼠标点击。
有不同的事件类型,单击鼠标按钮以及是单击还是双击。
当窗口内容需要重绘时触发。
WxSizeEvent:
当窗口大小或其布局改变时触发。
wxTimerEvent:
它可以由WxTimer类创建。
这是一个周期性事件。
将事件绑定到处理器事件绑定器由wxPyEventBinder类的实例组成。
为所有支持的事件类型提供了一个预定义的wxPyEventBinder实例,您可以在需要时为您的定制事件创建自己的事件绑定器。
每个事件类型都有一个事件绑定器,这意味着一个wxEvent子类对应多个绑定器。
在wxPython中将事件绑定到处理器的事件绑定器实例的名称是全局的。
为了清楚地将事件类型与处理器相关联,它们的名称以wxEVT开头,并对应于CwxWidgets代码中使用的宏的名称。
WXMOUSEVENTWXEVTLEFTDOWNWXEVTLEFTUPWXEVTLEFTDCKWXEVTDLEDOWNWXEVTDLEVTDLEDICKWXEVTRIGHTDOWNWXEVTRIGHTDCLICK使用wxEvtHandler方法。
wxEvtHandler类定义的一些方法并不常用。
您将经常使用wxEvtHandler的方法是创建事件绑定的Bind()。
这个方法的用法如下:
bind(事件,处理程序,source=none,id=wxidai,id=wxidai)