Seite 1 von 1

Applikation "immer" per Escape verlassen

Verfasst: Donnerstag 24. Januar 2008, 12:53
von Zap
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?

Verfasst: Donnerstag 24. Januar 2008, 14:09
von Jan-Peer
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).

Verfasst: Donnerstag 24. Januar 2008, 14:17
von Zap
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.

Verfasst: Donnerstag 24. Januar 2008, 14:21
von gerold
Hallo Zap!

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

mfg
Gerold
:-)

Verfasst: Donnerstag 24. Januar 2008, 14:56
von Zap
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()

Verfasst: Donnerstag 24. Januar 2008, 15:24
von Zap
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.

Verfasst: Donnerstag 24. Januar 2008, 15:27
von gerold
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.

Verfasst: Donnerstag 24. Januar 2008, 15:55
von Zap
Super ! Das klappt einwandfrei!
Danke :)