Tastenkürzel funktioniert nicht unter Windows

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Tim-Erwin
User
Beiträge: 2
Registriert: Dienstag 15. März 2011, 11:19

Hi,

ich habe eine Mini-Anwendung, die ich gern mit ESC beenden können möchte. Das Skelett sieht so aus:

Code: Alles auswählen

import wx

class MainFrame(wx.Frame):
    
    def __init__(self, app, title):
        wx.Frame.__init__(self, None, wx.ID_ANY, title, wx.DefaultPosition, wx.Size(400, 250))
        self.app = app
        self.Center()
        
        self.panel = wx.Panel(self, wx.ID_ANY, style=wx.NO_BORDER)
        self.panel.SetFocus()
        self.Bind(wx.EVT_KEY_DOWN, self.down)
        self.Bind(wx.EVT_KEY_UP, self.up)

        self.vsizer = wx.BoxSizer(wx.VERTICAL)
        self.vsizer.SetMinSize(wx.Size(200, 200))
        
        self.message = wx.StaticText(self.panel, wx.ID_ANY, "Hi...")
        self.vsizer.Add(self.message, 0, wx.TOP|wx.ALIGN_LEFT|wx.ALL, border=10)
        
        self.listBox = wx.ListBox(self.panel, wx.ID_ANY, wx.Point(5, 5), wx.Size(10, 10))
        self.vsizer.Add(self.listBox, 1, wx.BOTTOM|wx.EXPAND|wx.ALL, 5)
        
        self.panel.SetSizerAndFit(self.vsizer)
        self.panel.Layout()
    
    def up(self, evt):
        print "up", evt.KeyCode
    
    def down(self, evt):
        print "down", evt.KeyCode


class KeyTest(wx.App):
    
    def __init__(self, *args, **kwargs):
        wx.App.__init__(self, *args, **kwargs)
    
    def OnInit(self):
        self.mainFrame = MainFrame(self, "Key Test")
        self.SetTopWindow(self.mainFrame)
        self.mainFrame.Show()
        return True

app = KeyTest()
app.MainLoop()
Durch die Zeile self.panel.SetFocus() funktioniert unter Linux zumindest schonmal das KEY_UP-Event. Wie bekomme ich das KEY_DOWN zum Laufen?

Unter Windows kommt gar nichts an, weder UP noch DOWN. Was muss ich unter Windows anders machen?

Danke
Tim
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

Hi,

du solltest die Key-Events des Panel abfangen und nicht die des Frames:

Code: Alles auswählen

self.panel.Bind(wx.EVT_KEY_DOWN, self.down)
self.panel.Bind(wx.EVT_KEY_UP, self.up)
dann sollte es klappen.
Und nicht vergessen: evt.Skip() aufrufen, wenn die Standardfunktionalität der gedrückten Taste beibehalten soll.

Gruß
Norbert
Tim-Erwin
User
Beiträge: 2
Registriert: Dienstag 15. März 2011, 11:19

Ich hätte wetten können, dass ich alle Kombinationen durch hatte, wo welches Event abgefangen wird. Aber so funktioniert es in der Tat. Vielen Dank!
Antworten