[python]wxPython學習記錄1

跟隨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事件則不存在。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章