1. 程式人生 > >python---基礎知識回顧(九)圖形用戶界面-------WxPythin

python---基礎知識回顧(九)圖形用戶界面-------WxPythin

hot drop bin frame 自己 圖片 opened 事件驅動 平臺

主要使用wxPython(最成熟的跨平臺python GUI工具包)


wxPython手冊


前戲:基礎了解


import wx

class MyFrame(wx.Frame):    #創建自定義Frame
    def __init__(self,parent):
        wx.Frame.__init__(self,parent,id=-1,title="Hello World",size=(300,300)) #設置窗體

        """
        panel和sizer是wxpython提供的窗口部件。是容器部件,可以用於存放其他窗口部件
        
""" panel = wx.Panel(self) sizer = wx.BoxSizer(wx.VERTICAL) panel.SetSizer(sizer) txt = wx.StaticText(panel,-1,"Hello World!") #創建靜態文本組件 sizer.Add(txt,0,wx.TOP|wx.LEFT,100) self.Center() #將窗口放在桌面環境的中間 app = wx.App()
技術分享圖片
"""
Every wx application must have a single ``wx.App`` instance, and all
    creation of UI objects should be delayed until after the ``wx.App`` 
object has been created in order to ensure that the gui platform and wxWidgets have been fully initialized. """
View Code
frame = MyFrame(None)   #為頂級窗口
frame.Show(True)

app.MainLoop()

補充:id是什麽:wxpython對每個控件都會分配一個唯一的整數型ID,方便調用,類十余c中的Handle。ID在時間響應中必不可少。

創建控件時如果ID為-1時,會自動分配一個ID。這樣就不能對ID進行引用。其實可以使用控件對象的GetId方法進行獲取

前提: 唯一ID的生成:wx提供了NewId(),可以生成唯一的id。(若擔心重復,可以使用RegisterID檢測)

我們想要使用ID,但是程序中控件太多,如何處理

方法一:前置每個控件的ID(自己設置的名稱),使用列表生成器生成

[Btn_1_ID,Btn_2_ID,Btn_3_ID] = [wx.NewId() for _init_cj in range(3)]有幾個控件就設置循環幾次

然後在生成控件時進行調用

方法二:使用類的屬性來預先分配,然後控件類對他進行繼承,每個控件類句讀一個屬於他的id屬性


WxPython的程序結構


一個WxPython程序一般包含兩個對象:應用程序對象和根窗口(可多個)。其中,應用程序對象可以使用wx.App(或子類)實現(用於處理窗口中的事件響應),根窗口可以使用wx.Frame實現。

技術分享圖片
import wx

class MyFrame(wx.Frame):    #創建自定義Frame
    def __init__(self,parent):
        #def __init__(
        # self, parent=None, id=None, title=None, pos=None,
        # size=None, style=None, name=None)

        wx.Frame.__init__(self,parent,id=-1,title="Hello World",size=(300,300)) #設置窗體

        panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)


        panel.SetSizer(sizer)

        txt = wx.StaticText(panel,-1,"Hello World!")    #創建靜態文本組件
        sizer.Add(txt,0,wx.TOP|wx.LEFT,100)

        self.Center()   #將窗口放在桌面環境的中間

class MyApp(wx.App):
    def OnInit(self):
        print("開始進入事件循環")
        self.frame = MyFrame(None)
        self.frame.Show(True)
        return True #需要返回一個布爾型,只有初始返回成功,程序才會繼續執行

    def OnExit(self):
        print("事件循環結束")
        import time
        time.sleep(2)
        return 0    #返回狀態碼

app = MyApp()

app.MainLoop()
App子類的使用

其中OnInit方法中是必須的,其將會在事件循環處理之前被系統調用。同樣的在事件結束之後調用的方法也存在(OnExit)

兩個方法是相對的。例如:開啟數據庫和斷開數據庫


窗口組成:


前面的代碼中窗口和應用程序似乎沒有關聯,為什麽?

在應用程序對象中,可以通過SetTopWindow方法來設置根窗口。若是沒有設置,是因為應用程序會選擇窗口列表中的第一個作為根窗口。上面的程序也只有一個窗口,所以沒有必要去顯示設置。同樣使用SetTopWindow也可以改變根窗口

控件的部分構造參數:

參數 說明
parent 父窗口(為None代表為頂級窗口),註意設置父窗口後,在父窗口關閉時,子窗口也會消失
id 上面說過了
title  標題
pos 相對於屏幕的位置默認(-1,-1),自行選擇。我們在上面使用center也可以改變窗口在屏幕中的位置
size 大小默認(-1,-1)窗口系統自行選擇
style  窗口類型...
name  窗口的內在名字

style風格:

技術分享圖片


事件驅動:


技術分享圖片
EVT_SIZE = wx.PyEventBinder( wxEVT_SIZE )
EVT_SIZING = wx.PyEventBinder( wxEVT_SIZING )
EVT_MOVE = wx.PyEventBinder( wxEVT_MOVE )
EVT_MOVING = wx.PyEventBinder( wxEVT_MOVING )
EVT_MOVE_START = wx.PyEventBinder( wxEVT_MOVE_START )
EVT_MOVE_END = wx.PyEventBinder( wxEVT_MOVE_END )
EVT_CLOSE = wx.PyEventBinder( wxEVT_CLOSE_WINDOW )
EVT_END_SESSION = wx.PyEventBinder( wxEVT_END_SESSION )
EVT_QUERY_END_SESSION = wx.PyEventBinder( wxEVT_QUERY_END_SESSION )
EVT_PAINT = wx.PyEventBinder( wxEVT_PAINT )
EVT_NC_PAINT = wx.PyEventBinder( wxEVT_NC_PAINT )
EVT_ERASE_BACKGROUND = wx.PyEventBinder( wxEVT_ERASE_BACKGROUND )
EVT_CHAR = wx.PyEventBinder( wxEVT_CHAR )
EVT_KEY_DOWN = wx.PyEventBinder( wxEVT_KEY_DOWN )
EVT_KEY_UP = wx.PyEventBinder( wxEVT_KEY_UP )
EVT_HOTKEY = wx.PyEventBinder( wxEVT_HOTKEY, 1)
EVT_CHAR_HOOK = wx.PyEventBinder( wxEVT_CHAR_HOOK )
EVT_MENU_OPEN = wx.PyEventBinder( wxEVT_MENU_OPEN )
EVT_MENU_CLOSE = wx.PyEventBinder( wxEVT_MENU_CLOSE )
EVT_MENU_HIGHLIGHT = wx.PyEventBinder( wxEVT_MENU_HIGHLIGHT, 1)
EVT_MENU_HIGHLIGHT_ALL = wx.PyEventBinder( wxEVT_MENU_HIGHLIGHT )
EVT_SET_FOCUS = wx.PyEventBinder( wxEVT_SET_FOCUS )
EVT_KILL_FOCUS = wx.PyEventBinder( wxEVT_KILL_FOCUS )
EVT_CHILD_FOCUS = wx.PyEventBinder( wxEVT_CHILD_FOCUS )
EVT_ACTIVATE = wx.PyEventBinder( wxEVT_ACTIVATE )
EVT_ACTIVATE_APP = wx.PyEventBinder( wxEVT_ACTIVATE_APP )
EVT_HIBERNATE = wx.PyEventBinder( wxEVT_HIBERNATE )
EVT_DROP_FILES = wx.PyEventBinder( wxEVT_DROP_FILES )
EVT_INIT_DIALOG = wx.PyEventBinder( wxEVT_INIT_DIALOG )
EVT_SYS_COLOUR_CHANGED = wx.PyEventBinder( wxEVT_SYS_COLOUR_CHANGED )
EVT_DISPLAY_CHANGED = wx.PyEventBinder( wxEVT_DISPLAY_CHANGED )
EVT_SHOW = wx.PyEventBinder( wxEVT_SHOW )
EVT_MAXIMIZE = wx.PyEventBinder( wxEVT_MAXIMIZE )
EVT_ICONIZE = wx.PyEventBinder( wxEVT_ICONIZE )
EVT_NAVIGATION_KEY = wx.PyEventBinder( wxEVT_NAVIGATION_KEY )
EVT_PALETTE_CHANGED = wx.PyEventBinder( wxEVT_PALETTE_CHANGED )
EVT_QUERY_NEW_PALETTE = wx.PyEventBinder( wxEVT_QUERY_NEW_PALETTE )
EVT_WINDOW_CREATE = wx.PyEventBinder( wxEVT_CREATE )
EVT_WINDOW_DESTROY = wx.PyEventBinder( wxEVT_DESTROY )
EVT_SET_CURSOR = wx.PyEventBinder( wxEVT_SET_CURSOR )
EVT_MOUSE_CAPTURE_CHANGED = wx.PyEventBinder( wxEVT_MOUSE_CAPTURE_CHANGED )
EVT_MOUSE_CAPTURE_LOST = wx.PyEventBinder( wxEVT_MOUSE_CAPTURE_LOST )

EVT_LEFT_DOWN = wx.PyEventBinder( wxEVT_LEFT_DOWN )
EVT_LEFT_UP = wx.PyEventBinder( wxEVT_LEFT_UP )
EVT_MIDDLE_DOWN = wx.PyEventBinder( wxEVT_MIDDLE_DOWN )
EVT_MIDDLE_UP = wx.PyEventBinder( wxEVT_MIDDLE_UP )
EVT_RIGHT_DOWN = wx.PyEventBinder( wxEVT_RIGHT_DOWN )
EVT_RIGHT_UP = wx.PyEventBinder( wxEVT_RIGHT_UP )
EVT_MOTION = wx.PyEventBinder( wxEVT_MOTION )
EVT_LEFT_DCLICK = wx.PyEventBinder( wxEVT_LEFT_DCLICK )
EVT_MIDDLE_DCLICK = wx.PyEventBinder( wxEVT_MIDDLE_DCLICK )
EVT_RIGHT_DCLICK = wx.PyEventBinder( wxEVT_RIGHT_DCLICK )
EVT_LEAVE_WINDOW = wx.PyEventBinder( wxEVT_LEAVE_WINDOW )
EVT_ENTER_WINDOW = wx.PyEventBinder( wxEVT_ENTER_WINDOW )
EVT_MOUSEWHEEL = wx.PyEventBinder( wxEVT_MOUSEWHEEL )
EVT_MOUSE_AUX1_DOWN = wx.PyEventBinder( wxEVT_AUX1_DOWN )
EVT_MOUSE_AUX1_UP = wx.PyEventBinder( wxEVT_AUX1_UP )
EVT_MOUSE_AUX1_DCLICK = wx.PyEventBinder( wxEVT_AUX1_DCLICK )
EVT_MOUSE_AUX2_DOWN = wx.PyEventBinder( wxEVT_AUX2_DOWN )
EVT_MOUSE_AUX2_UP = wx.PyEventBinder( wxEVT_AUX2_UP )
EVT_MOUSE_AUX2_DCLICK = wx.PyEventBinder( wxEVT_AUX2_DCLICK )

EVT_MOUSE_EVENTS = wx.PyEventBinder([ wxEVT_LEFT_DOWN,
                                      wxEVT_LEFT_UP,
                                      wxEVT_MIDDLE_DOWN,
                                      wxEVT_MIDDLE_UP,
                                      wxEVT_RIGHT_DOWN,
                                      wxEVT_RIGHT_UP,
                                      wxEVT_MOTION,
                                      wxEVT_LEFT_DCLICK,
                                      wxEVT_MIDDLE_DCLICK,
                                      wxEVT_RIGHT_DCLICK,
                                      wxEVT_ENTER_WINDOW,
                                      wxEVT_LEAVE_WINDOW,
                                      wxEVT_MOUSEWHEEL,
                                      wxEVT_AUX1_DOWN,
                                      wxEVT_AUX1_UP,
                                      wxEVT_AUX1_DCLICK,
                                      wxEVT_AUX2_DOWN,
                                      wxEVT_AUX2_UP,
                                      wxEVT_AUX2_DCLICK,
                                     ])


# Scrolling from wxWindow (sent to wxScrolledWindow)
EVT_SCROLLWIN = wx.PyEventBinder([ wxEVT_SCROLLWIN_TOP,
                                  wxEVT_SCROLLWIN_BOTTOM,
                                  wxEVT_SCROLLWIN_LINEUP,
                                  wxEVT_SCROLLWIN_LINEDOWN,
                                  wxEVT_SCROLLWIN_PAGEUP,
                                  wxEVT_SCROLLWIN_PAGEDOWN,
                                  wxEVT_SCROLLWIN_THUMBTRACK,
                                  wxEVT_SCROLLWIN_THUMBRELEASE,
                                  ])

EVT_SCROLLWIN_TOP = wx.PyEventBinder( wxEVT_SCROLLWIN_TOP )
EVT_SCROLLWIN_BOTTOM = wx.PyEventBinder( wxEVT_SCROLLWIN_BOTTOM )
EVT_SCROLLWIN_LINEUP = wx.PyEventBinder( wxEVT_SCROLLWIN_LINEUP )
EVT_SCROLLWIN_LINEDOWN = wx.PyEventBinder( wxEVT_SCROLLWIN_LINEDOWN )
EVT_SCROLLWIN_PAGEUP = wx.PyEventBinder( wxEVT_SCROLLWIN_PAGEUP )
EVT_SCROLLWIN_PAGEDOWN = wx.PyEventBinder( wxEVT_SCROLLWIN_PAGEDOWN )
EVT_SCROLLWIN_THUMBTRACK = wx.PyEventBinder( wxEVT_SCROLLWIN_THUMBTRACK )
EVT_SCROLLWIN_THUMBRELEASE = wx.PyEventBinder( wxEVT_SCROLLWIN_THUMBRELEASE )

# Scrolling from wx.Slider and wx.ScrollBar
EVT_SCROLL = wx.PyEventBinder([ wxEVT_SCROLL_TOP,
                               wxEVT_SCROLL_BOTTOM,
                               wxEVT_SCROLL_LINEUP,
                               wxEVT_SCROLL_LINEDOWN,
                               wxEVT_SCROLL_PAGEUP,
                               wxEVT_SCROLL_PAGEDOWN,
                               wxEVT_SCROLL_THUMBTRACK,
                               wxEVT_SCROLL_THUMBRELEASE,
                               wxEVT_SCROLL_CHANGED,
                               ])

EVT_SCROLL_TOP = wx.PyEventBinder( wxEVT_SCROLL_TOP )
EVT_SCROLL_BOTTOM = wx.PyEventBinder( wxEVT_SCROLL_BOTTOM )
EVT_SCROLL_LINEUP = wx.PyEventBinder( wxEVT_SCROLL_LINEUP )
EVT_SCROLL_LINEDOWN = wx.PyEventBinder( wxEVT_SCROLL_LINEDOWN )
EVT_SCROLL_PAGEUP = wx.PyEventBinder( wxEVT_SCROLL_PAGEUP )
EVT_SCROLL_PAGEDOWN = wx.PyEventBinder( wxEVT_SCROLL_PAGEDOWN )
EVT_SCROLL_THUMBTRACK = wx.PyEventBinder( wxEVT_SCROLL_THUMBTRACK )
EVT_SCROLL_THUMBRELEASE = wx.PyEventBinder( wxEVT_SCROLL_THUMBRELEASE )
EVT_SCROLL_CHANGED = wx.PyEventBinder( wxEVT_SCROLL_CHANGED )
EVT_SCROLL_ENDSCROLL = EVT_SCROLL_CHANGED

# Scrolling from wx.Slider and wx.ScrollBar, with an id
EVT_COMMAND_SCROLL = wx.PyEventBinder([ wxEVT_SCROLL_TOP,
                                       wxEVT_SCROLL_BOTTOM,
                                       wxEVT_SCROLL_LINEUP,
                                       wxEVT_SCROLL_LINEDOWN,
                                       wxEVT_SCROLL_PAGEUP,
                                       wxEVT_SCROLL_PAGEDOWN,
                                       wxEVT_SCROLL_THUMBTRACK,
                                       wxEVT_SCROLL_THUMBRELEASE,
                                       wxEVT_SCROLL_CHANGED,
                                       ], 1)

EVT_COMMAND_SCROLL_TOP = wx.PyEventBinder( wxEVT_SCROLL_TOP, 1)
EVT_COMMAND_SCROLL_BOTTOM = wx.PyEventBinder( wxEVT_SCROLL_BOTTOM, 1)
EVT_COMMAND_SCROLL_LINEUP = wx.PyEventBinder( wxEVT_SCROLL_LINEUP, 1)
EVT_COMMAND_SCROLL_LINEDOWN = wx.PyEventBinder( wxEVT_SCROLL_LINEDOWN, 1)
EVT_COMMAND_SCROLL_PAGEUP = wx.PyEventBinder( wxEVT_SCROLL_PAGEUP, 1)
EVT_COMMAND_SCROLL_PAGEDOWN = wx.PyEventBinder( wxEVT_SCROLL_PAGEDOWN, 1)
EVT_COMMAND_SCROLL_THUMBTRACK = wx.PyEventBinder( wxEVT_SCROLL_THUMBTRACK, 1)
EVT_COMMAND_SCROLL_THUMBRELEASE = wx.PyEventBinder( wxEVT_SCROLL_THUMBRELEASE, 1)
EVT_COMMAND_SCROLL_CHANGED = wx.PyEventBinder( wxEVT_SCROLL_CHANGED, 1)
EVT_COMMAND_SCROLL_ENDSCROLL = EVT_COMMAND_SCROLL_CHANGED

EVT_BUTTON = wx.PyEventBinder( wxEVT_BUTTON, 1)
EVT_CHECKBOX = wx.PyEventBinder( wxEVT_CHECKBOX, 1)
EVT_CHOICE = wx.PyEventBinder( wxEVT_CHOICE, 1)
EVT_LISTBOX = wx.PyEventBinder( wxEVT_LISTBOX, 1)
EVT_LISTBOX_DCLICK = wx.PyEventBinder( wxEVT_LISTBOX_DCLICK, 1)
EVT_MENU = wx.PyEventBinder( wxEVT_MENU, 1)
EVT_MENU_RANGE = wx.PyEventBinder( wxEVT_MENU, 2)
EVT_SLIDER = wx.PyEventBinder( wxEVT_SLIDER, 1)
EVT_RADIOBOX = wx.PyEventBinder( wxEVT_RADIOBOX, 1)
EVT_RADIOBUTTON = wx.PyEventBinder( wxEVT_RADIOBUTTON, 1)

EVT_SCROLLBAR = wx.PyEventBinder( wxEVT_SCROLLBAR, 1)
EVT_VLBOX = wx.PyEventBinder( wxEVT_VLBOX, 1)
EVT_COMBOBOX = wx.PyEventBinder( wxEVT_COMBOBOX, 1)
EVT_TOOL = wx.PyEventBinder( wxEVT_TOOL, 1)
EVT_TOOL_RANGE = wx.PyEventBinder( wxEVT_TOOL, 2)
EVT_TOOL_RCLICKED = wx.PyEventBinder( wxEVT_TOOL_RCLICKED, 1)
EVT_TOOL_RCLICKED_RANGE = wx.PyEventBinder( wxEVT_TOOL_RCLICKED, 2)
EVT_TOOL_ENTER = wx.PyEventBinder( wxEVT_TOOL_ENTER, 1)
EVT_TOOL_DROPDOWN = wx.PyEventBinder( wxEVT_TOOL_DROPDOWN, 1)
EVT_CHECKLISTBOX = wx.PyEventBinder( wxEVT_CHECKLISTBOX, 1)
EVT_COMBOBOX_DROPDOWN = wx.PyEventBinder( wxEVT_COMBOBOX_DROPDOWN , 1)
EVT_COMBOBOX_CLOSEUP  = wx.PyEventBinder( wxEVT_COMBOBOX_CLOSEUP , 1)

EVT_COMMAND_LEFT_CLICK = wx.PyEventBinder( wxEVT_COMMAND_LEFT_CLICK, 1)
EVT_COMMAND_LEFT_DCLICK = wx.PyEventBinder( wxEVT_COMMAND_LEFT_DCLICK, 1)
EVT_COMMAND_RIGHT_CLICK = wx.PyEventBinder( wxEVT_COMMAND_RIGHT_CLICK, 1)
EVT_COMMAND_RIGHT_DCLICK = wx.PyEventBinder( wxEVT_COMMAND_RIGHT_DCLICK, 1)
EVT_COMMAND_SET_FOCUS = wx.PyEventBinder( wxEVT_COMMAND_SET_FOCUS, 1)
EVT_COMMAND_KILL_FOCUS = wx.PyEventBinder( wxEVT_COMMAND_KILL_FOCUS, 1)
EVT_COMMAND_ENTER = wx.PyEventBinder( wxEVT_COMMAND_ENTER, 1)

EVT_HELP = wx.PyEventBinder( wxEVT_HELP, 1)
EVT_HELP_RANGE = wx.PyEventBinder(  wxEVT_HELP, 2)
EVT_DETAILED_HELP = wx.PyEventBinder( wxEVT_DETAILED_HELP, 1)
EVT_DETAILED_HELP_RANGE = wx.PyEventBinder( wxEVT_DETAILED_HELP, 2)

EVT_IDLE = wx.PyEventBinder( wxEVT_IDLE )

EVT_UPDATE_UI = wx.PyEventBinder( wxEVT_UPDATE_UI, 1)
EVT_UPDATE_UI_RANGE = wx.PyEventBinder( wxEVT_UPDATE_UI, 2)

EVT_CONTEXT_MENU = wx.PyEventBinder( wxEVT_CONTEXT_MENU )

EVT_THREAD = wx.PyEventBinder( wxEVT_THREAD )

EVT_WINDOW_MODAL_DIALOG_CLOSED = wx.PyEventBinder( wxEVT_WINDOW_MODAL_DIALOG_CLOSED )

EVT_JOY_BUTTON_DOWN = wx.PyEventBinder( wxEVT_JOY_BUTTON_DOWN )
EVT_JOY_BUTTON_UP = wx.PyEventBinder( wxEVT_JOY_BUTTON_UP )
EVT_JOY_MOVE = wx.PyEventBinder( wxEVT_JOY_MOVE )
EVT_JOY_ZMOVE = wx.PyEventBinder( wxEVT_JOY_ZMOVE )
EVT_JOYSTICK_EVENTS = wx.PyEventBinder([ wxEVT_JOY_BUTTON_DOWN,
                                        wxEVT_JOY_BUTTON_UP,
                                        wxEVT_JOY_MOVE,
                                        wxEVT_JOY_ZMOVE,
                                        ])

# deprecated wxEVT aliases
wxEVT_COMMAND_BUTTON_CLICKED         = wxEVT_BUTTON
wxEVT_COMMAND_CHECKBOX_CLICKED       = wxEVT_CHECKBOX
wxEVT_COMMAND_CHOICE_SELECTED        = wxEVT_CHOICE
wxEVT_COMMAND_LISTBOX_SELECTED       = wxEVT_LISTBOX
wxEVT_COMMAND_LISTBOX_DOUBLECLICKED  = wxEVT_LISTBOX_DCLICK
wxEVT_COMMAND_CHECKLISTBOX_TOGGLED   = wxEVT_CHECKLISTBOX
wxEVT_COMMAND_MENU_SELECTED          = wxEVT_MENU
wxEVT_COMMAND_TOOL_CLICKED           = wxEVT_TOOL
wxEVT_COMMAND_SLIDER_UPDATED         = wxEVT_SLIDER
wxEVT_COMMAND_RADIOBOX_SELECTED      = wxEVT_RADIOBOX
wxEVT_COMMAND_RADIOBUTTON_SELECTED   = wxEVT_RADIOBUTTON
wxEVT_COMMAND_SCROLLBAR_UPDATED      = wxEVT_SCROLLBAR
wxEVT_COMMAND_VLBOX_SELECTED         = wxEVT_VLBOX
wxEVT_COMMAND_COMBOBOX_SELECTED      = wxEVT_COMBOBOX
wxEVT_COMMAND_TOOL_RCLICKED          = wxEVT_TOOL_RCLICKED
wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED  = wxEVT_TOOL_DROPDOWN
wxEVT_COMMAND_TOOL_ENTER             = wxEVT_TOOL_ENTER
wxEVT_COMMAND_COMBOBOX_DROPDOWN      = wxEVT_COMBOBOX_DROPDOWN
wxEVT_COMMAND_COMBOBOX_CLOSEUP       = wxEVT_COMBOBOX_CLOSEUP
所有支持的事件類型(上百個)

一個事件是wx.Event類或其子類的一個實例。

事件的綁定和處理:通過使用wx.EvtHandler類中的Bind方法可以將綁定事件的類型,事件對象和事件處理函數關聯起來

技術分享圖片
    def Bind(self, event, handler, source=None, id=-1, id2=-1): # reliably restored by inspect
        """
        Bind an event to an event handler.
            
            :param event: One of the ``EVT_*`` event binder objects that
                          specifies the type of event to bind.
            
            :param handler: A callable object to be invoked when the
                            event is delivered to self.  Pass ``None`` to
                            disconnect an event handler.
            
            :param source: Sometimes the event originates from a
                           different window than self, but you still
                           want to catch it in self.  (For example, a
                           button event delivered to a frame.)  By
                           passing the source of the event, the event
                           handling system is able to differentiate
                           between the same event type from different
                           controls.
            
            :param id: Used to spcify the event source by ID instead
                       of instance.
            
            :param id2: Used when it is desirable to bind a handler
                        to a range of IDs, such as with EVT_MENU_RANGE.
        """
        pass
def Bind(self, event<事件類型>, handler<處理函數>, source=None<事件的發生者:不寫默認當前控件>, id=-1, id2=-1) 技術分享圖片
import wx

class MyFrame(wx.Frame):    #創建自定義Frame
    def __init__(self,parent):
        #def __init__(
        # self, parent=None, id=None, title=None, pos=None,
        # size=None, style=None, name=None)

        wx.Frame.__init__(self,parent,id=-1,title="Hello World",size=(300,300),pos=(0,0)) #設置窗體

        panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)


        panel.SetSizer(sizer)

        txt = wx.StaticText(panel,-1,"Hello World!")    #創建靜態文本組件
        sizer.Add(txt,0,wx.TOP|wx.LEFT,100)

        btn = wx.Button(panel,-1,"Quit")
        sizer.Add(btn,0,wx.TOP|wx.LEFT,100)
        self.Bind(wx.EVT_BUTTON,self.OnClick,btn)

        self.Center()   #將窗口放在桌面環境的中間

    def OnClick(self,event):    #註意事件處理函數需要加上事件對象
        print("我被點擊了")
        self.Close(True)    #強制退出force=True

class MyApp(wx.App):
    def OnInit(self):
        print("開始進入事件循環")
        self.frame = MyFrame(None)
        self.frame.Show(True)
        self.frame.GetId()
        return True #需要返回一個布爾型,只有初始返回成功,程序才會繼續執行

    def OnExit(self):
        print("事件循環結束")
        import time
        time.sleep(2)
        return 0    #返回狀態碼

app = MyApp()

app.MainLoop()
事件綁定和處理的演示 技術分享圖片
import wx

class MyFrame(wx.Frame):    #創建自定義Frame
    def __init__(self,parent):
        #def __init__(
        # self, parent=None, id=None, title=None, pos=None,
        # size=None, style=None, name=None)

        wx.Frame.__init__(self,parent,id=-1,title="Hello World",size=(300,300),pos=(0,0)) #設置窗體

        panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)


        panel.SetSizer(sizer)

        txt = wx.StaticText(panel,-1,"Hello World!")    #創建靜態文本組件
        sizer.Add(txt,0,wx.TOP|wx.LEFT,100)

        self.btn = wx.Button(panel,-1,"Quit")
        sizer.Add(self.btn,0,wx.TOP|wx.LEFT,100)
        # self.Bind(wx.EVT_BUTTON,self.OnClick,self.btn)
        # self.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow,self.btn)
        self.btn.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow)   #綁定鼠標進入事件
        self.btn.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow2)   #綁定鼠標進入事件
        self.btn.Bind(wx.EVT_LEAVE_WINDOW,self.OnLeaveWindow)   #綁定鼠標離開事件

        self.Center()   #將窗口放在桌面環境的中間

    def OnEnterWindow(self,event):
        print("鼠標進入")
        self.btn.SetLabel("鼠標進入")
        # event.Skip()

    def OnEnterWindow2(self,event):
        print("鼠標進入2")
        self.btn.SetLabel("鼠標進入2")
        event.Skip()

    def OnLeaveWindow(self,event):
        print("鼠標離開")
        self.btn.SetLabel("鼠標離開")
        event.Skip()    #一般窗口不見處理完一個事件完畢後,事件處理就結束了,如果要繼續處理的話就可以使用Skip方法來改變默認的行為

    def OnClick(self,event):    #註意事件處理函數需要加上事件對象
        print("我被點擊了")
        self.Close(True)    #強制退出force=True

class MyApp(wx.App):
    def OnInit(self):
        print("開始進入事件循環")
        self.frame = MyFrame(None)
        self.frame.Show(True)
        self.frame.GetId()
        return True #需要返回一個布爾型,只有初始返回成功,程序才會繼續執行

    def OnExit(self):
        print("事件循環結束")
        import time
        time.sleep(2)
        return 0    #返回狀態碼

app = MyApp()

app.MainLoop()
為一個控件綁定多個事件

補充:

在上面我們使用兩種方法為Button按鈕綁定了事件。有什麽區別?

1.self.Bind(wx.EVT_BUTTON,self.OnClick,self.btn)  #點擊事件
2.self.btn.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow)   #綁定鼠標進入事件

方式一:是是由父控件為子控件綁定的事件

方式二:是使用控件自己綁定事件

那麽兩者有何不同,可以混用嗎

# self.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow,self.btn)

self.btn.Bind(wx.EVT_BUTTON,self.OnClick)

答案是:父類去綁定其他事件是不允許的,錯誤的,會導致父控件為其綁定的所有事件失效。而子類是可以綁定所有的相關事件的。

查看事件對象:

EVT_控件名 = wx.pyEventBinder( wxEVT_BUTTON, exceptedIDs)  exceptedIDs默認為0,這類控件幾乎都不為0,自己有定義
EVT_BUTTON = wx.PyEventBinder( wxEVT_BUTTON, 1
) EVT_CHECKBOX = wx.PyEventBinder( wxEVT_CHECKBOX, 1) EVT_CHOICE = wx.PyEventBinder( wxEVT_CHOICE, 1) EVT_LISTBOX = wx.PyEventBinder( wxEVT_LISTBOX, 1) EVT_LISTBOX_DCLICK = wx.PyEventBinder( wxEVT_LISTBOX_DCLICK, 1) EVT_MENU = wx.PyEventBinder( wxEVT_MENU, 1) EVT_MENU_RANGE = wx.PyEventBinder( wxEVT_MENU, 2) EVT_SLIDER = wx.PyEventBinder( wxEVT_SLIDER, 1) EVT_RADIOBOX = wx.PyEventBinder( wxEVT_RADIOBOX, 1) EVT_RADIOBUTTON = wx.PyEventBinder( wxEVT_RADIOBUTTON, 1) ............

這一類事件都是對應控件去響應的,也就是說父類中包含這些控件的話,可以對其直接綁定這些基礎事件響應。

所以說:要想使用父控件對子控件綁定事件:事件必須滿足 EVT_控件名 相對應

事件中的Skip:

    self.btn.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow)   #綁定鼠標進入事件
    self.btn.Bind(wx.EVT_ENTER_WINDOW,self.OnEnterWindow2)   #綁定鼠標進入事件2


    def OnEnterWindow(self,event):
        print("鼠標進入")
        self.btn.SetLabel("鼠標進入")

    def OnEnterWindow2(self,event):
        print("鼠標進入2")
        self.btn.SetLabel("鼠標進入2")

為同一個控件的同一個事件,綁定兩個(多個)處理函數。

其執行結果是只執行了事件處理函數2:原因是因為:一般情況下,窗口部件對象在執行完該事件的一個處理函數,就默認完結了。不會再去處理其他相關的函數。而,事件綁定是從上到下,下面的會覆蓋上面的,所以,值執行了處理函數了。

我們要想去執行其他函數,那麽就要在正在執行的處理函數後面加上event.Skip(),他會在當前函數返回一個值後去調用下一個處理函數,改變原來的默認行為。

    def OnEnterWindow(self,event):
        print("鼠標進入")
        self.btn.SetLabel("鼠標進入")
        # event.Skip()
        print(777)

    def OnEnterWindow2(self,event):
        print("鼠標進入2")
        self.btn.SetLabel("鼠標進入2")
        event.Skip()
        print(6666)
---------------------------------------------------------------------
鼠標進入2
6666
鼠標進入
777

常用組件:


對話框:

技術分享圖片
非模態對話框
dialog = wx.Dialog(None, title="你點不點", size=(300,200))
dialog.Show()

模態對話框
dialog = wx.Dialog(None, title="你點不點", size=(300,200))
dialog.ShowModel()

dialog = wx.MessageDialog(None, title="你點不點", size=(300,200))
dialog.ShowModel()
消息對話框


python---基礎知識回顧(九)圖形用戶界面-------WxPythin