Applikation "immer" per Escape verlassen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hallo zusammen,
ich suche eine Möglichkeit wie ich eine Applikation also das Hauptfenster per Escape Key schließen kann.

Ich habe dazu diese Lösung gefunden, allerdings hat diese den Nachteil das es nur funktioniert wenn der Focus auf dem entsprechenden Panel liegt.
Hab ich aber den Focus auf dem textCtrl dann zeigt das Escape drücken keine Wirkung.

Code: Alles auswählen

#!/usr/bin/python
# keyevent.py

import wx

class KeyEvent(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)

        panel = wx.Panel(self, -1)
        panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        panel.SetFocus()
        
        text = wx.TextCtrl(panel, -1, "")

        self.Centre()
        self.Show(True)

    def OnKeyDown(self, event):
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_ESCAPE:
            ret  = wx.MessageBox('Are you sure to quit?', 'Question', 
                                 wx.YES_NO | wx.CENTRE | wx.NO_DEFAULT, self)
            if ret == wx.YES:
                self.Close()
        event.Skip()

app = wx.App()
KeyEvent(None, -1, 'keyevent.py')
app.MainLoop()
Ich habe das ganze auch schon mit einer Acceleratortable ausprobiert. Aber dort wird irgendwie überhaupt nicht auf den Escape Key reagiert.
Muss ich nun für jedes widget das ich anlege das EVT_KEY_DOWN bestimmen damit mein Vorhaben funktioniert?
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Generell sollte es reichen, das KeyDown-Event an das Fenster(Frame) zu binden. Problematisch sind Kontrollelemente, die schon von Hause Tastenevents verarbeiten - also alle, die dir die Möglichkeit zum Eintragen von Text geben. Hier ist es glaube ich standardmäßig so, daß ESC zum Verlassen des Eingabemodus verwendet wird. Ich vermute, daß du für diese Kontrollelemente das Tastenereignis gezielt überschreiben mußt. Vielleicht solltest du mal überlegen, ob es nicht auch eine Tastenkombi wie z.B. strg-q oder alt-f4 tut (die möglicherweise vom Betriebssystem oder dem Window-Manager sogar schon voreingestellt ist).
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Jan-Peer hat geschrieben:Generell sollte es reichen, das KeyDown-Event an das Fenster(Frame) zu binden.
Das geht leider nicht, dort kommen keinerlei events an.

Ich könnte mit einer anderen Tastenkombination leben. Aber das Nutzen des der Escapetaste ist quasi Kundenwunsch und für einige Applikationen garnicht so ungewöhnlich.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Zap!

Ich kann es jetzt nicht ausprobieren, aber funktioniert das nicht auch mit ``wx.AcceleratorTable``?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Leider nein, der event für das drücken von Escape kommt überhaupt nicht an selbst wenn ich sowas simples mache...

Code: Alles auswählen

import wx

class KeyEvent(wx.Frame):
    
    ACCEL_QUIT = wx.NewId()
    
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)
        
        accel = wx.AcceleratorTable([
            (0, wx.WXK_F1, self.ACCEL_QUIT), # Geht...
            (0, wx.WXK_ESCAPE, self.ACCEL_QUIT) # Geht nicht :(
        ])
        self.SetAcceleratorTable(accel) 
        self.Bind(wx.EVT_MENU, self.OnQuit, id=self.ACCEL_QUIT)
        self.Show(True)

    def OnQuit(self, event):
        self.Close()

app = wx.App()
KeyEvent(None, -1, 'keyevent.py')
app.MainLoop()
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ok, es scheint ein Bug zu sein...

http://lists.wxwidgets.org/archive/wxPy ... 59841.html

Na dann machen wirs halt mit irgendeiner der anderen 104 Tasten.
Danke Trotzdem.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Zap hat geschrieben:Leider nein, der event für das drücken von Escape kommt überhaupt nicht an
Hallo Zap!

Vielleicht mit dem Char-Hook-Event des Frames. Aber ob das auch funktioniert, wenn ein TextCtrl den Fokus hat, weiß ich nicht.

http://www.python-forum.de/post-55416.html#55416

mfg
Gerold
:-)

PS: Mein Test mit Fokus auf dem TextCtrl funktioniert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Super ! Das klappt einwandfrei!
Danke :)
Antworten