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

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

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()
Zuletzt geändert von Schaf220 am Montag 23. November 2009, 22:24, insgesamt 1-mal geändert.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Der Button hat den Fokus. Wenn Du den Event an den Button bindest, funktioniert es wieder.
MfG
HWK
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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)
the more they change the more they stay the same
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Hey vielen Dank, das funktioniert alles super!
MfG Schaf220
Antworten