Applikation "immer" per Escape verlassen

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

Applikation "immer" per Escape verlassen

Beitragvon Zap » Donnerstag 24. Januar 2008, 12:53

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

Beitragvon Jan-Peer » Donnerstag 24. Januar 2008, 14:09

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

Beitragvon Zap » Donnerstag 24. Januar 2008, 14:17

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 24. Januar 2008, 14:21

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

Beitragvon Zap » Donnerstag 24. Januar 2008, 14: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

Beitragvon Zap » Donnerstag 24. Januar 2008, 15:24

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 24. Januar 2008, 15:27

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

Beitragvon Zap » Donnerstag 24. Januar 2008, 15:55

Super ! Das klappt einwandfrei!
Danke :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder