top class cann't get event

Test keyboard/mouse event.
sub class can get all event(keyboard/mouse)
but top class cann't get all event. only can get wx.EVT_ENTER_WINDOW
and wx.EVT_LEAVE_WINDOW event.

My requirement is:
top class and sub class both can get all(keyboard/mouse) event.
or top class can get all event.

My debug code:
#!/usr/bin/env python
import wx

class MyView(wx.Window):
    def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
size=wx.DefaultSize,
                 style=wx.BORDER_SUNKEN):
        wx.Window.__init__(self, parent, id, (0, 0), (-1, 300), style=style)
        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
        self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
        self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)

    def OnEnterWindow(self, event):
        print "On Enter Window -------"

    def OnLeaveWindow(self, event):
        print "On Leave Window -------"

    def OnKeyDown(self, event):
        print "on key down --------", event.GetKeyCode()
        event.Skip()

    def OnLeftUp(self, event):
        print "on left up --------"
        event.Skip()

class MyPanel(wx.Panel):
    def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.NO_BORDER ):
        wx.Panel.__init__(self, parent, id, pos, size, style=style)

        bs = wx.BoxSizer(wx.VERTICAL)
        self.view = MyView(self)
        bs.Add(self.view, 1, wx.EXPAND)
        self.SetSizer(bs)

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "", size=(800, 600),
style=wx.DEFAULT_FRAME_STYLE)
        panel = wx.Panel(self, size=self.GetSize())
        self.view = MyPanel(panel)

        cmd_box = wx.BoxSizer(wx.HORIZONTAL)
        b_close = wx.Button(panel, -1, label="Close")
        cmd_box.Add(b_close, 0, wx.ALIGN_CENTER)

        main_box = wx.BoxSizer(wx.VERTICAL)
        main_box.Add(self.view, 1, wx.EXPAND)
        main_box.Add(cmd_box, 0, wx.ALIGN_CENTER)

        self.SetSizer(main_box)

        self.Bind(wx.EVT_BUTTON, self.OnClose, b_close)

        # debug event
        self.view.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
        self.view.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)
        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
        panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        panel.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
        self.view.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.view.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)

        self.Bind(wx.EVT_CLOSE, self.OnClose)

    def OnKeyDown(self, event):
        print "on key down ==========", event.GetKeyCode()

    def OnLeftUp(self, event):
        print "left on up click ========="

    def OnLeftDown(self, event):
        print "left on down click ========"

    def OnEnterWindow(self, event):
        print "On Enter Window =========="

    def OnLeaveWindow(self, event):
        print "On Leave Window ========="

    def OnClose(self, event):
        self.Destroy()
        event.Skip()

class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show(True)

        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()

test_event.py (2.92 KB)

···

--
jiang zhixiang

Hi,

I think it’s a matter of eventpropagation:
http://wiki.wxpython.org/EventPropagation

It seems that all the events in the code do not propagate. You can set propagation level by using event.ResumePropagation(level).

···

On Monday, September 10, 2012 7:06:50 PM UTC-4, luckrill wrote:

Test keyboard/mouse event.

sub class can get all event(keyboard/mouse)

but top class cann’t get all event. only can get wx.EVT_ENTER_WINDOW

and wx.EVT_LEAVE_WINDOW event.

My requirement is:

top class and sub class both can get all(keyboard/mouse) event.

or top class can get all event.

My debug code:

#!/usr/bin/env python

import wx

class MyView(wx.Window):

def __init__(self, parent, id=-1, pos=wx.DefaultPosition,

size=wx.DefaultSize,

             style=wx.BORDER_SUNKEN):

    wx.Window.__init__(self, parent, id, (0, 0), (-1, 300), style=style)

    self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

    self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)

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

    self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)



def OnEnterWindow(self, event):

    print "On Enter Window -------"



def OnLeaveWindow(self, event):

    print "On Leave Window -------"



def OnKeyDown(self, event):

    print "on key down --------", event.GetKeyCode()

    event.Skip()



def OnLeftUp(self, event):

    print "on left up --------"

    event.Skip()

class MyPanel(wx.Panel):

def __init__(self, parent, id=-1, pos=wx.DefaultPosition,

size=wx.DefaultSize, style=wx.NO_BORDER ):

    wx.Panel.__init__(self, parent, id, pos, size, style=style)



    bs = wx.BoxSizer(wx.VERTICAL)

    self.view = MyView(self)

    bs.Add(self.view, 1, wx.EXPAND)

    self.SetSizer(bs)

class Frame(wx.Frame):

def __init__(self):

    wx.Frame.__init__(self, None, -1, "", size=(800, 600),

style=wx.DEFAULT_FRAME_STYLE)

    panel = wx.Panel(self, size=self.GetSize())

    self.view = MyPanel(panel)



    cmd_box = wx.BoxSizer(wx.HORIZONTAL)

    b_close = wx.Button(panel, -1, label="Close")

    cmd_box.Add(b_close, 0, wx.ALIGN_CENTER)



    main_box = wx.BoxSizer(wx.VERTICAL)

    main_box.Add(self.view, 1, wx.EXPAND)

    main_box.Add(cmd_box, 0, wx.ALIGN_CENTER)



    self.SetSizer(main_box)



    self.Bind(wx.EVT_BUTTON, self.OnClose, b_close)



    # debug event

    self.view.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)

    self.view.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)

    self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

    self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)

    panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

    panel.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)

    self.view.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

    self.view.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)



    self.Bind(wx.EVT_CLOSE, self.OnClose)



def OnKeyDown(self, event):

    print "on key down ==========", event.GetKeyCode()



def OnLeftUp(self, event):

    print "left on up click ========="



def OnLeftDown(self, event):

    print "left on down click ========"



def OnEnterWindow(self, event):

    print "On Enter Window =========="



def OnLeaveWindow(self, event):

    print "On Leave Window ========="



def OnClose(self, event):

    self.Destroy()

    event.Skip()

class App(wx.App):

def OnInit(self):

    self.frame = Frame()

    self.frame.Show(True)



    return True

def main():

app = App()

app.MainLoop()

if name == ‘main’:

main()


jiang zhixiang

Level = event.StopPropagation() #Level = 0
Level = 1 # now, my top class can get event
event.ResumePropagation(Level)

Thanks

···

2012/9/11 taikou <lrk700@gmail.com>:

Hi,

I think it's a matter of eventpropagation:
EventPropagation - wxPyWiki

It seems that all the events in the code do not propagate. You can set
propagation level by using event.ResumePropagation(level).

On Monday, September 10, 2012 7:06:50 PM UTC-4, luckrill wrote:

Test keyboard/mouse event.
sub class can get all event(keyboard/mouse)
but top class cann't get all event. only can get wx.EVT_ENTER_WINDOW
and wx.EVT_LEAVE_WINDOW event.

My requirement is:
top class and sub class both can get all(keyboard/mouse) event.
or top class can get all event.

My debug code:
#!/usr/bin/env python
import wx

class MyView(wx.Window):
    def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
size=wx.DefaultSize,
                 style=wx.BORDER_SUNKEN):
        wx.Window.__init__(self, parent, id, (0, 0), (-1, 300),
style=style)
        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
        self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
        self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)

    def OnEnterWindow(self, event):
        print "On Enter Window -------"

    def OnLeaveWindow(self, event):
        print "On Leave Window -------"

    def OnKeyDown(self, event):
        print "on key down --------", event.GetKeyCode()
        event.Skip()

    def OnLeftUp(self, event):
        print "on left up --------"
        event.Skip()

class MyPanel(wx.Panel):
    def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.NO_BORDER ):
        wx.Panel.__init__(self, parent, id, pos, size, style=style)

        bs = wx.BoxSizer(wx.VERTICAL)
        self.view = MyView(self)
        bs.Add(self.view, 1, wx.EXPAND)
        self.SetSizer(bs)

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "", size=(800, 600),
style=wx.DEFAULT_FRAME_STYLE)
        panel = wx.Panel(self, size=self.GetSize())
        self.view = MyPanel(panel)

        cmd_box = wx.BoxSizer(wx.HORIZONTAL)
        b_close = wx.Button(panel, -1, label="Close")
        cmd_box.Add(b_close, 0, wx.ALIGN_CENTER)

        main_box = wx.BoxSizer(wx.VERTICAL)
        main_box.Add(self.view, 1, wx.EXPAND)
        main_box.Add(cmd_box, 0, wx.ALIGN_CENTER)

        self.SetSizer(main_box)

        self.Bind(wx.EVT_BUTTON, self.OnClose, b_close)

        # debug event
        self.view.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
        self.view.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)
        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
        panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        panel.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
        self.view.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.view.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)

        self.Bind(wx.EVT_CLOSE, self.OnClose)

    def OnKeyDown(self, event):
        print "on key down ==========", event.GetKeyCode()

    def OnLeftUp(self, event):
        print "left on up click ========="

    def OnLeftDown(self, event):
        print "left on down click ========"

    def OnEnterWindow(self, event):
        print "On Enter Window =========="

    def OnLeaveWindow(self, event):
        print "On Leave Window ========="

    def OnClose(self, event):
        self.Destroy()
        event.Skip()

class App(wx.App):
    def OnInit(self):
        self.frame = Frame()
        self.frame.Show(True)

        return True

def main():
    app = App()
    app.MainLoop()

if __name__ == '__main__':
    main()

--
jiang zhixiang

--
To unsubscribe, send email to wxPython-users+unsubscribe@googlegroups.com
or visit http://groups.google.com/group/wxPython-users?hl=en

--
jiang zhixiang

This page may also help with understanding how event propagation and binding works: self.Bind vs. self.button.Bind - wxPyWiki

···

On 9/10/12 5:02 PM, taikou wrote:

Hi,

I think it's a matter of eventpropagation:
EventPropagation - wxPyWiki

It seems that all the events in the code do not propagate. You can set
propagation level by using event.ResumePropagation(level).

--
Robin Dunn
Software Craftsman