您的位置:首页 > 编程语言 > Python开发

[python]wxPython学习记录1

2013-01-06 15:00 447 查看
跟随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_DOWN
wx.EVT_LEFT_UP
wx.EVT_LEFT_DCLICK
wx.EVT_MIDDLE_DOWN
wx.EVT_MIDDLE_UP
wx.EVT_MIDDLE_DCLICK
wx.EVT_RIGHT_DOWN
wx.EVT_RIGHT_UP
wx.EVT_RIGHT_DCLICK
wx.EVT_MOTION
wx.ENTER_WINDOW
wx.LEAVE_WINDOW
wx.EVT_MOUSEWHEEL
wx.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中,因为实在太长,我就没有仔细校对

EVT_COMMAND(id, event, func)Process a command, supplying the window identifier,command event identifier, and member function.
EVT_COMMAND_RANGE(id1, id2, event, func)Process a command for a rangeof window identifiers, supplying the minimum and maximum window identifiers,command event identifier, and member function.
EVT_BUTTON(id, func)Process a wxEVT_COMMAND_BUTTON_CLICKED command,which is generated by a wxButton control.
EVT_CHECKBOX(id, func)Process a wxEVT_COMMAND_CHECKBOX_CLICKED command,which is generated by a wxCheckBox control.
EVT_CHOICE(id, func)Process a wxEVT_COMMAND_CHOICE_SELECTED command,which is generated by a wxChoice control.
EVT_COMBOBOX(id, func)Process a wxEVT_COMMAND_COMBOBOX_SELECTED command,which is generated by a wxComboBox control.
EVT_LISTBOX(id, func)Process a wxEVT_COMMAND_LISTBOX_SELECTED command,which is generated by a wxListBox control.
EVT_LISTBOX_DCLICK(id, func)Process a wxEVT_COMMAND_LISTBOX_DOUBLECLICKED command,which is generated by a wxListBox control.
EVT_MENU(id, func)Process a wxEVT_COMMAND_MENU_SELECTED command,which is generated by a menu item.
EVT_MENU_RANGE(id1, id2, func)Process a wxEVT_COMMAND_MENU_RANGE command,which is generated by a range of menu items.
EVT_CONTEXT_MENU(func)Process the event generatedwhen the user has requested a popup menu to appear by pressing a specialkeyboard key (under Windows) or by right clicking the mouse.
EVT_RADIOBOX(id, func)Process a wxEVT_COMMAND_RADIOBOX_SELECTED command,which is generated by a wxRadioBox control.
EVT_RADIOBUTTON(id, func)Process a wxEVT_COMMAND_RADIOBUTTON_SELECTED command,which is generated by a wxRadioButton control.
EVT_SCROLLBAR(id, func)Process a wxEVT_COMMAND_SCROLLBAR_UPDATED command,which is generated by a wxScrollBar control. This is provided for compatibility only;more specific scrollbar event macros should be used instead (seewxScrollEvent).
EVT_SLIDER(id, func)Process a wxEVT_COMMAND_SLIDER_UPDATED command,which is generated by a wxSlider control.
EVT_TEXT(id, func)Process a wxEVT_COMMAND_TEXT_UPDATED command,which is generated by a wxTextCtrl control.
EVT_TEXT_ENTER(id, func)Process a wxEVT_COMMAND_TEXT_ENTER command,which is generated by a wxTextCtrl control. Note that you must usewxTE_PROCESS_ENTER flag when creating the control if you want it to generatesuch events.
EVT_TEXT_MAXLEN(id, func)Process a wxEVT_COMMAND_TEXT_MAXLEN command,which is generated by a wxTextCtrl control when the user tries to enter morecharacters into it than the limit previously set withSetMaxLength.
EVT_TOGGLEBUTTON(id, func)Process a wxEVT_COMMAND_TOGGLEBUTTON_CLICKED event.
EVT_TOOL(id, func)Process a wxEVT_COMMAND_TOOL_CLICKED event(a synonym for wxEVT_COMMAND_MENU_SELECTED). Pass the id of the tool.
EVT_TOOL_RANGE(id1, id2, func)Process a wxEVT_COMMAND_TOOL_CLICKED eventfor a range of identifiers. Pass the ids of the tools.
EVT_TOOL_RCLICKED(id, func)Process a wxEVT_COMMAND_TOOL_RCLICKED event.Pass the id of the tool.
EVT_TOOL_RCLICKED_RANGE(id1, id2, func)Process a wxEVT_COMMAND_TOOL_RCLICKED eventfor a range of ids. Pass the ids of the tools.
EVT_TOOL_ENTER(id, func)Process a wxEVT_COMMAND_TOOL_ENTER event.Pass the id of the toolbar itself. The value of wxCommandEvent::GetSelection is the tool id, or -1 if the mouse cursor has moved off a tool.
EVT_COMMAND_LEFT_CLICK(id, func)Process a wxEVT_COMMAND_LEFT_CLICK command,which is generated by a control (Windows 95 and NT only).
EVT_COMMAND_LEFT_DCLICK(id, func)Process a wxEVT_COMMAND_LEFT_DCLICK command,which is generated by a control (Windows 95 and NT only).
EVT_COMMAND_RIGHT_CLICK(id, func)Process a wxEVT_COMMAND_RIGHT_CLICK command,which is generated by a control (Windows 95 and NT only).
EVT_COMMAND_SET_FOCUS(id, func)Process a wxEVT_COMMAND_SET_FOCUS command,which is generated by a control (Windows 95 and NT only).
EVT_COMMAND_KILL_FOCUS(id, func)Process a wxEVT_COMMAND_KILL_FOCUS command,which is generated by a control (Windows 95 and NT only).
EVT_COMMAND_ENTER(id, func)Process a wxEVT_COMMAND_ENTER command,which is generated by a control.
提请注意上表中红色部分,我所使用的版本是wx-2.9.4,在该版本中,并没有以上四种事件,替代text事件的是EVT_TEXT_CUT、EVT_TEXT_COPY、EVT_TEXT_PASTE,而togglebutton事件则不存在。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: