[python]wxPython学习记录1
来源:互联网 发布:淘宝被骗了有办法吗 编辑:程序博客网 时间:2024/06/05 10:38
跟随WxPython In Action学习了一段时间,有些笔记要做。以下都只是我自己的理解,肯定有很多错误和不足,希望大家能够指正。
1、是什么组成了一个wxpython程序?
图片来自wxpywiki
一个wxpython程序必须有一个application(wx.App)对象和至少一个frame(wx.Frame)对象。而用于填充frame的则是一系列的wx.Window的子类,wx.Window的子类都可以拥有wx.Control的子类,在上图中,panel就是最常见的wx.Window的子类之一,而wx.StaticText和wx.TextCtrl则是最常见的wx.Control之一。
1)常用的wx.Window的子类有哪些?
常用的如wx.Panel、wx.StatusBar、wx.SplitterWindow、wx.PopupWindow、wx.TopLevelWindow,以上这些类都直接继承了_core.Window,在_windows.py中实现。除此之外还有MenuBar、Control,在_core.py中实现。
python的命名具有很好的见名知意效果,而需要备注一笔的是,wx.Frame和wx.Dialog实际上就是wx.TopLevelWindow的子类,其中wx.Frame的实例可以通过
SetMenuBar、GetMenuBar、
CreateStatusBar、GetStatusBar、SetStatusBar、SetStatusText、
CreateToolBar、GetToolBar、SetToolBar
等方法与菜单栏、状态栏和工具栏进行交互,其中wx.ToolBar属于wx.Controls。
2)其他的wx.Window子类还有哪些?
比较少用的则有wx.MDIClientWindow、wx.SashWindow、wx.SplashScreenWindow、wx.PyWindow,这些也都是直接继承了_core.Window,在_windows.py中实现。
3)一个简单的例子
一个简单的,没有绑定事件也没有交互的例子,在这个例子中给frame添加了一个panel,一个状态栏一个菜单栏还有一个工具栏
class MainFrame(wx.Frame): def __init__(self, parent=None, id= -1, title='写作助手', pos=wx.DefaultPosition): size = (512, 384) wx.Frame.__init__(self, parent, id, title, pos, size) #panel self.panel = wx.Panel(self) self.panel.SetSize((512, 200)) self.panel.SetBackgroundColour(wx.Colour(0, 0, 0, 0.5)) #panel #在panel中增加一个button self.btnTest = wx.Button(self.panel, label="in", pos=(200, 15)) #创建状态栏 statusBar = self.CreateStatusBar() #创建工具栏 toolBar = self.CreateToolBar() image = wx.Image('images/helper.ico', wx.BITMAP_TYPE_ICO) bit = image.ConvertToBitmap() toolBar.AddSimpleTool(wx.NewId(), bit, "New", "Long help for 'new'") toolBar.Realize() #创建菜单 menuBar = wx.MenuBar() menuFile = wx.Menu() miExit = menuFile.Append(wx.NewId(), 'exit', '退出 ') menuBar.Append(menuFile, 'file') menuEdit = wx.Menu() menuEdit.Append(wx.NewId(), 'undo', '撤销') menuBar.Append(menuEdit, 'edit') self.SetMenuBar(menuBar)
4)wx.Control的子类有哪些?
不同于使用vs进行C#的开发,使用eclipse+pydev,很多时候我都搞不清楚自己到底有哪些control是可以使用的,出于方便使用的目的,我找出了_controls.py下的所有直接继承自_core.Controls的控件。他们是:
wx.ToolBarBase、wx.ListCtrl、wx.TreeCtrl、wx.GenericDirCtrl、wx.PyControl、wx.DatePickerCtrlBase、wx.HyperlinkCtrl、wx.PickerBase、wx.CollapsiblePane、wx.SearchCtrlBase、wx.InfoBar、wx.AnyButton、wx.CheckBox、wx.Gauge、wx.StaticBox、wx.StaticLine、wx.StaticText、wx.StaticBitmap、wx.ScrollBar、wx.SpinButton、wx.SpinCtrl、wx.SpinCtrlDouble、wx.RadioBox、wx.RadioButton、wx.Slider。
老实说,其中很大一部分我都不曾使用过。另外,让我觉得奇怪的是,我没有在这里面找到wx.Button。通过寻找,在_core.py的MouseEvent类下发现了def Button。这是为什么,还需要再研究=- -
2、是什么让程序工作?
wxpython程序由事件驱动程序工作,在WxPython In Action/ChapterThree中有非常详细的介绍,以下内容都参考了这一篇介绍
在此,我仅复制一张图来说明事件驱动的过程而不copy大量的文字了。
1)wxpython有哪些事件?
在wxpython中,代表事件的是事件对象——wx.Event或其子类。
wx.Event的子类有
wx.CloseEvent:当关闭一个框架的时候被触发
wx.CommandEvent:这是与窗口控件的交互事件,包括菜单栏选择、单击一个button等等,这应该是涉及最广的
wx.KeyEvent:键盘按键事件
wx.MouseEvent:鼠标事件
wx.PaintEvent:当窗口内容需要被重画时触发
wx.SizeEvent:窗口大小或布局
wx.TimerEvent:由类wx.Timer类创建,是定期的事件
2)最常用的事件是鼠标事件
由于wxPython被用于开发桌面软件而非android/IOS,我们的操作都是通过鼠标完成。所以很有必要弄清楚wxPython的鼠标事件都有哪些,鼠标事件一共有14个
wx.EVT_LEFT_DOWNwx.EVT_LEFT_UPwx.EVT_LEFT_DCLICK wx.EVT_MIDDLE_DOWNwx.EVT_MIDDLE_UPwx.EVT_MIDDLE_DCLICK wx.EVT_RIGHT_DOWNwx.EVT_RIGHT_UPwx.EVT_RIGHT_DCLICKwx.EVT_MOTIONwx.ENTER_WINDOWwx.LEAVE_WINDOWwx.EVT_MOUSEWHEELwx.EVT_MOUSE_EVENTS
3)涉及最广的事件是命令事件
wx.CommandEvent有28个子类,可以参考http://www.wxpython.org/docs/api/wx.CommandEvent-class.html
在wx-2.9.4中应该是有33个事件类型CommandEvent属于,而具体有哪些,大家或许可以参考下表(来源)
如何查找CommandEvent?
可以在_core.py中搜索wxEVT_COMMAND_
在wxpython中,要将事件绑定到处理器,需要通过事件绑定器,事件绑定器实例的命名规则是wx.EVT_开头并且对应于使用在C++ wxWidgets代码中宏的名字
需要注意的是下表的来源是http://docs.wxwidgets.org
而wxpython实际上是wxwidgets的python封装,具体或许会有出入
实际上每一个事件类型都作为全局变量被定义在_core.py中,因为实在太长,我就没有仔细校对
- [python]wxPython学习记录1
- [python]wxpython学习记录2
- [python]wxPython学习记录3
- [python]wxPython学习记录4——贪吃蛇
- [python]wxPython学习记录5——*arg和*karg
- python wxpython--学习笔记
- python学习之wxpython
- wxPython学习1
- wxpython学习1
- wxPython学习笔记1
- python学习笔记之wxpython打印预览
- python学习教程(十)之wxpython
- python学习之wxPython 报错
- [Python] wxPython 菜单栏控件学习总结
- Python--wxpython
- Python 学习记录1
- python 学习记录1
- python学习记录(1)
- hadoop常见问题
- java.lang.IncompatibleClassChangeError: Implementing class
- android之VideoView和视频播放View的扩展
- Hibernate与对象共事之编辑页面和update方法
- SecureCRT颜色设置
- [python]wxPython学习记录1
- mkyaffs2image命令
- Android VideoView如何播放RTSP的流
- CSS HACK IE6、IE7、IE8、Firefox解决兼容性问题
- i节点
- 杜比TrueHD(Dolby TrueHD)音频编码解析
- 别让自己的孩子成为这样的马和鹰
- ajax post传递参数中文乱码问题
- php学习笔记(三十二)ajax结合pageView类实现页面无刷新请求