Seite 1 von 1

(gelöst)wxKeyEvent funktioniert nicht mit Button ...

Verfasst: Sonntag 22. November 2009, 12:39
von Schaf220
Hallo liebe Community,

Ich habe ein Problem mit dem EVT_KEY_DOWN Event. Im Forum habe ich dieses Beispiel gefunden, welches auch super werkelt. Wenn ich jedoch einen Button auf das Panel lege, funktioniert es nicht mehr. Kann mir jemand erklären warum oder ob ich etwas falsch mache?

Funktionierendes Beispiel von gerold:

Code: Alles auswählen

import wx

wx.SetDefaultPyEncoding("iso-8859-15")


class MyFrame(wx.Frame):
   
    def __init__(
        self, parent = None, title = "Example", size = wx.Size(550, 420)
    ):
        wx.Frame.__init__(self, parent, -1, title, size = size)
       
        # Standard-Style für das Panel ist ``wx.TAB_TRAVERSAL | wx.NO_BORDER``
        # Stattdessen wird hier nur ``wx.NO_BORDER`` verwendet
        panel = wx.Panel(self, style = wx.NO_BORDER)
        panel.Bind(wx.EVT_KEY_DOWN, self.on_panel_key_down)
   
   
    def on_panel_key_down(self, event):
        print event.GetKeyCode()
        event.Skip()


def main():
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
Jetzt mein Verändertes Beispiel:

Code: Alles auswählen

import wx

wx.SetDefaultPyEncoding("iso-8859-15")


class MyFrame(wx.Frame):
   
    def __init__(
        self, parent = None, title = "Example", size = wx.Size(550, 420)
    ):
        wx.Frame.__init__(self, parent, -1, title, size = size)
       
        # Standard-Style für das Panel ist ``wx.TAB_TRAVERSAL | wx.NO_BORDER``
        # Stattdessen wird hier nur ``wx.NO_BORDER`` verwendet
        panel = wx.Panel(self, style = wx.NO_BORDER)
        panel.Bind(wx.EVT_KEY_DOWN, self.on_panel_key_down)
        self.b_button = wx.Button(panel, label='Test!', pos=(50, 50))
   
   
    def on_panel_key_down(self, event):
        if event.GetKeyCode()== wx.WXK_F5:
            print "F5 was pressed!"
            event.Skip()


def main():
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()

Verfasst: Sonntag 22. November 2009, 15:02
von HWK
Der Button hat den Fokus. Wenn Du den Event an den Button bindest, funktioniert es wieder.
MfG
HWK

Verfasst: Montag 23. November 2009, 15:57
von Dav1d
Danke, das Problem hat mich seit längerem auch heimgesucht, kann man irgendwie den Focus dauerhaft auf ein Panel binden?
Also per .SetFocus() kann man den Fokus ja einmal dem Panel "geben", aber wenn man dann den Button klickt hat doch der Button den Focus, oder irre ich mich da?

//Edit: hab gerade etwas rumprobiert, panel.SetFocus() funktioniert nicht da ja auch der Button ein Element des Panels ist! wenn ich den Button allerdings ``self´´ als Parent gebe und den Focus an panel binde funktionierts, genauso, wie HWK geschrieben hat, mit:

Code: Alles auswählen

        self.b_button.Bind(wx.EVT_KEY_DOWN, self.on_panel_key_down)

Verfasst: Montag 23. November 2009, 22:23
von Schaf220
Hey vielen Dank, das funktioniert alles super!
MfG Schaf220