Wie verwende man wx.AcceleratorTable?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Dienstag 21. November 2006, 20:53

Hi.
Ich kriege das irgendwie nicht hin.

Code: Alles auswählen

entries = []
entries.append(wx.AcceleratorEntry(wx.ACCEL_CTRL, 9, 1000))
accel = wx.AcceleratorTable(entries)
self.SetAcceleratorTable(accel)
cmd
The menu or control command identifier.
Der dritte Parameter ist ``cmd``. Was muss ich genau übergeben? Ich hab da die id übergeben von nem toolbar element das ich bei ``bind(...)`` verwendet habe.

Vielleicht weiß einer wie das genau geht.

lg

EDIT: Hab das danach probiert: http://www.lpthe.jussieu.fr/~zeitlin/wx ... table.html
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 21. November 2006, 22:38

...wow! Das ist echt nicht einfach. Ich probiere jetzt auch schon seit einer Weile herum.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Dienstag 21. November 2006, 22:50

Hi gerold.

Hab schon die wxPython Module und auch die Demo durchgesucht mit Eclipse Suchfunktion, aber nichts genaues zur Verwendung gefunden. Das ist echt ne harte Nuss. Wenn ich bloß wüste was man genau an 'cmd' übergeben muss. parent ids scheint 'AcceleratorTable' anscheinende für 'cmd' nicht zu akzeptieren.

Ich probiere gleich mal was anderes (aber langsam hab ich alles mögliche durch).

lg

P.S.: Ich melde später nochmal und berichte dann.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Dienstag 21. November 2006, 23:03

OK, er scheint doch auf IDs anzusprechen aber, nun kommts:

Code: Alles auswählen

self.tool_bar.DoAddTool(
            id=-1,
            label=u'logWindow',
            bitmap=wx.Bitmap(bmp_log_window, wx.BITMAP_TYPE_PNG),
            bmpDisabled=wx.NullBitmap, 
            kind=wx.ITEM_NORMAL,
            longHelp=u'Log-Fenster einblenden/ausblenden',
            shortHelp=u'Log-Fenster einblenden/ausblenden'
        )
        
        self.Bind(wx.EVT_TOOL_RCLICKED, 
                  self.logwin_on_rclicked,
                  id=12
        )
        self.Bind(wx.EVT_TOOL, 
                  self.logwin_on_lclicked,
                  id=11
        )
Wenn ich bei 'cmd' 11 eingebe (das binding mit wx.EVT_TOOL) dann springt er an. Aber auf 12 (binding mit wx.EVT_TOOL_RCLICKED) macht er nichts. Ich hab Eben gerade 3 'DoAddTool' ausgeführt und bei jeden
'self.Bind(wx.EVT_TOOL, ..., ...)' mit unterschiedlicher ID funktioniert es. Aber bloß für eine 'wx.EVT_TOOL_RCLICKED' nicht.

Verstehe ich echt nicht wie das kommt. Vielleicht ein Bug?

Ich hoffe man kann mein Text einigermaßen verstehen.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Dienstag 21. November 2006, 23:12

OK, danke nochmals. Aber ich bin zu den Entschluss gekommen das ich mit Accelerator nix machen werde. Da wird mir zuviel mit IDs rumreichen gemacht! Da ich ja aus dem anderen Thread bereit von dir weiß, das man nichts mehr mit IDs machen muss (was ich sehr zu schätzen weiß) finde ich das an dieser stelle, das man gezwungen ist mit IDs bei Accelerator zu arbeiten, echt sch*. zudem scheint das alles noch zu verbugt zu sein, weil es halt z.B. mit 'wx.EVT_TOOL_RCLICKED' nicht funktioniert.

Gibt es ne andere Möglichkeit als Accelator?
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Dienstag 21. November 2006, 23:33

Oder mal anders: Wie macht man mit wx für gewöhnlich folgendes:
Angenommen ich klicke mit der Maus auf eine Element (z.B. aus einer list oder sonstwas) und will dann z.B: das, wenn ich die strg+r taste drücke, das eine Methode ausgeführt wird oder ein event ausgelöst wird. Wie würde man sowas am besten realisieren?

lg
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Mittwoch 22. November 2006, 00:10

Hi gerold. hab bei der Demo unter 'Process and Events/KeyEvents' was gefunden. Muss das noch analysieren...mach ich morgen und hoffe das dass gut klappt.

gute Nacht und lg
XtraNine
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 22. November 2006, 00:50

XtraNine hat geschrieben:'Process and Events/KeyEvents'
Hi XtraNine!

Das geht sicher noch irgendwie einfacher :?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-1")


class MyFrame(wx.Frame):
   
    def __init__(self, parent = None, id = -1, title = "Hallo Welt"):
       
        wx.Frame.__init__(self, parent, id, title)
       
        panel = wx.Panel(self)
        
        txtctrl = wx.TextCtrl(panel, -1)
        txtctrl.Bind(wx.EVT_CHAR, self.on_txtctrl_char)
   
    
    def on_txtctrl_char(self, event = None):
        # Wenn STRG
        if event.ControlDown():
            char = chr(ord('a') + event.GetKeyCode() - 1)
            # Wenn STRG+e
            if char == u"e":
                print u"Es wurde STRG+e gedrueckt"
        event.Skip()


def main():
   
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
Wenn man statt EVT_CHAR, EVT_KEY_DOWN und EVT_KEY_UP abfängt, dann spart man sich diese Umwandlerei. Das ist aber nicht das, was ich mir erwarte...

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Mittwoch 22. November 2006, 11:07

Ich habe das auch schon lange nicht mehr benutzt:

Bei einem DrPython plugin habe ich einmal das so verwendet:

Code: Alles auswählen

tbl = wx.AcceleratorTable([(wx.ACCEL_ALT, ord('F'), self.ID_SEARCH_TXT_FOCUS)
                        ,(wx.ACCEL_ALT, ord('P'), self.ID_REPLACEWITH_TXT_FOCUS)])
self.SetAcceleratorTable(tbl)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 22. November 2006, 14:51

Francesco hat geschrieben:

Code: Alles auswählen

tbl = wx.AcceleratorTable([(wx.ACCEL_ALT, ord('F'), self.ID_SEARCH_TXT_FOCUS)
                        ,(wx.ACCEL_ALT, ord('P'), self.ID_REPLACEWITH_TXT_FOCUS)])
self.SetAcceleratorTable(tbl)
Hi Francesco!

Das Problem ist ja, woher nimmst du die ID, wenn du kein Menü hast? --

Wenn du z.B. in einem Dialog, in dem du kein Menü hast und auch nicht haben möchtest, den Dialog mit "STRG-q" schließen lassen möchtest -- egal welches Widget grad den Fokus hat.
Was machst du dann? Was gibst du als ID an? Das ist es, was mich gestern länger beschäftigt hat.

Wenn der Fokus in einem Textfeld liegt, dann werden die Tastenanschläge nicht automatisch auch an den Dialog oder an das Frame durchgereicht. Wie also, leite ich eine Tastenkombination (z.B. CTRL+q) an einen Handler, der damit etwas anfangen kann. Da muss es doch etwas besseres geben, als jedes TextCtrl per ``Bind()`` an einen Handler zu binden.

Im "Visual Basic 6" konnte man eine Formular-Eigenschaft so umstellen, dass die Key-Events zuerst an das Formular geschickt wurden. Dann erst an die einzelnen Steuerelemente. So konnte man "formularweit" alle Tastenkombinationen abfangen.
Zuerst dachte ich mir, dass funktioniert mit ``wx.AcceleratorTable``, aber ich weiß nicht, welche ID ich übergeben soll und wie ich dadurch die Tastenkombination an einen Eventhandler übergeben soll. Ich hoffe, dass ich nur eine einfache Möglichkeit übersehen habe und dass es diese "einfache" Möglichkeit im wxPython gibt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Mittwoch 22. November 2006, 15:05

wxPython in Action Seite 310:
The cmd argument is the wxPython identifier of the menu item which triggers its command event when the accelerator is invoked.
Beispiel auf Seite 308.
Es scheint also nur mit einem ID für einen Menüeintrag zugehen. Deshalb ja wohl auch die Probleme bei wx.EVT_TOOL_RCLICKED.
Wie wäre es mit folgender Möglichkeit: Ein Menü mit entsprechenden Beschleunigertasten erstellen und mit menubar.hide() verbergen.
MfG
HWK
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Mittwoch 22. November 2006, 15:49

gerold hat geschrieben:Hi Francesco!

Das Problem ist ja, woher nimmst du die ID, wenn du kein Menü hast? --

Wenn du z.B. in einem Dialog, in dem du kein Menü hast und auch nicht haben möchtest, den Dialog mit "STRG-q" schließen lassen möchtest -- egal welches Widget grad den Fokus hat.
Was machst du dann? Was gibst du als ID an? Das ist es, was mich gestern länger beschäftigt hat.

Wenn der Fokus in einem Textfeld liegt, dann werden die Tastenanschläge nicht automatisch auch an den Dialog oder an das Frame durchgereicht. Wie also, leite ich eine Tastenkombination (z.B. CTRL+q) an einen Handler, der damit etwas anfangen kann. Da muss es doch etwas besseres geben, als jedes TextCtrl per ``Bind()`` an einen Handler zu binden.

Im "Visual Basic 6" konnte man eine Formular-Eigenschaft so umstellen, dass die Key-Events zuerst an das Formular geschickt wurden. Dann erst an die einzelnen Steuerelemente. So konnte man "formularweit" alle Tastenkombinationen abfangen.
Zuerst dachte ich mir, dass funktioniert mit ``wx.AcceleratorTable``, aber ich weiß nicht, welche ID ich übergeben soll und wie ich dadurch die Tastenkombination an einen Eventhandler übergeben soll. Ich hoffe, dass ich nur eine einfache Möglichkeit übersehen habe und dass es diese "einfache" Möglichkeit im wxPython gibt.

lg
Gerold
:-)
Sorry, habe ich zuwenig genau durchgelesen. Das Problem hatte ich auch schon einmal und keine Lösung gefunden.

So jetzt nachdem ich in der Mailing List gefragt habe, habe ich eine Lösung
die funktioniert! *freu*

Sample:

Code: Alles auswählen

import wx

class MyDialog(wx.Dialog):
    def __init__(self, parent, ID, title):
        wx.Dialog.__init__(self, parent, ID, title,
                           wx.DefaultPosition, wx.Size(350, 310))

        compute_btn = wx.Button(self, 1, 'Test', (70, 250))
        compute_btn.SetFocus()
        clear_btn = wx.Button(self, 2, 'Close', (185, 250))
        text1 = wx.TextCtrl(self, 3, pos=(70, 20))
        text2 = wx.TextCtrl(self, 4, pos=(70, 70))
 
        self.Bind (wx.EVT_BUTTON, self.OnClose, id=2)
        self.Bind (wx.EVT_CLOSE, self.OnClose)
        
        entries = []
        id = wx.NewId()
        entries.append(wx.AcceleratorEntry(wx.ACCEL_CTRL, ord('Q'), id))
        accel = wx.AcceleratorTable(entries)
        self.SetAcceleratorTable(accel)
        self.Bind(wx.EVT_MENU, self.OnClose, id=id)


    def OnClose(self, event):
        self.Destroy()

class MyApp(wx.App):
    def OnInit(self):
        dlg = MyDialog(None, -1, 'Test')
        dlg.Show(True)
        dlg.Centre()
        return True

app = MyApp(0)
app.MainLoop()
Original Antwort:
On Wed, 22 Nov 2006 09:50:58 -0600, "Chris Mellon" <arkanes@gmail.com> wrote:

>>[...]
>
>You aren't binding to the hotkey event. Replace the appropriate part
>of your code with:
>
>id = wx.NewId()
>entries.append(wx.AcceleratorEntry(wx.ACCEL_CTRL, ord('Q'), id))
>accel = wx.AcceleratorTable(entries)
>self.SetAcceleratorTable(accel)
>self.Bind(wx.EVT_MENU, self.OnClose, id=id)
>

von Robin Dunn:

I think you misunderstand the accelerator table a little bit. The ID in
the table entries is not the ID of the control that the event will
come from, but the ID that will be sent in the simulated menu event, and
which can be used to make the event binding. So the basic pattern is
something like this:

accelId = wx.NewId()
tbl = wx.AcceleratorTable([(wx.ACCEL_ALT, ord('X'), accelId)])
self.SetAcceleratorTable(tbl)
self.Bind(wx.EVT_MENU, self.OnDoSomething, id=accelId)

When Alt-X is pressed in the context of self, a EVT_MENU event is sent
with an id of accelId.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Donnerstag 23. November 2006, 12:53

Hallo. Danke für die Zahlreichen Posts :)

Mein Resümee zu den bisherigen Erkenntnissen

Resümee zu wxKeyEvent:
gerold hat geschrieben:Wenn der Fokus in einem Textfeld liegt, dann werden die Tastenanschläge nicht automatisch auch an den Dialog oder an das Frame durchgereicht. Wie also, leite ich eine Tastenkombination (z.B. CTRL+q) an einen Handler, der damit etwas anfangen kann. Da muss es doch etwas besseres geben, als jedes TextCtrl per ``Bind()`` an einen Handler zu binden.
Genau darum ging es mir nachher auch. Es soll praktisch unabhängig von den Fokussierten Objekten sein. Sprich wenn z.B. der Focus auf self liegt soll es genau so auf Keyevents reagieren, wie wenn der Fokus z.B. auf ein Objekt vom Type wx.TextCtr liegt. Es soll also global reagiert werden auf eingehende Keys und quasi unabhängig vom Fokussierten Objekt sein.

Das ist aber mit wyKeyEvents - (genauer: wx.EVT_CHAR, wx.EVT_KEY_DOWN, : wx.EVT_KEY_UP) Link: http://wxwidgets.org/manuals/2.6.3/wx_w ... wxkeyevent - nicht möglich, da man ein Bindig zu jedem Objekt machen muss für die Methode die Aufgerufen werden soll. Mann muss es also selber realisieren (mit Bingigs für alle Objekte) und es wir also das geforderte Global erreichbar[i/] nicht abgenommen! Dabei gibt es sogar schwerwiegende Einschränkungen auf die ich gleich näher eingehe!

Einschrenkung:
Dabei ist auch zu Beachten, das man keine 2 Bindings fürs gleiche Objekt, bei dem unterschiedliche Methoden aufgerufen werden sollen, gemacht werden kann. Ein 2tes Bindig aufs gleichen Event (Betonung liegt auf GLEICHES Event!) vom gleichen Objekt, überschreibt das erste Binding!

Ein Beispiel zum Verständnis: Als Referenz dient Gerolds Beispiel vom Mi Nov 22, 2006 00:50:

Code: Alles auswählen

def __init__(self, parent = None, id = -1, title = "Hallo Welt"): 
        
        wx.Frame.__init__(self, parent, id, title) 
        
        panel = wx.Panel(self) 
        txtctrl = wx.TextCtrl(panel, -1)
        
        # Methode self.on_txtctrl_char lässt nur STRG+e durch und 
        # ignoriert alles andere. Die Abwinklung wird in der Methode
        # selber implementiert (siehe Gerolds Beispiel). 
        txtctrl.Bind(wx.EVT_CHAR, self.on_txtctrl_char)
        
        # Was ist aber wenn STRG+w gedrückt wird und eine andere 
        # Methode aufgerufen werden soll?
        # Mann könnte nun davon ausgehen das man einfach ein 2test Bindig 
        # macht. Die weiter Überlegung ist das nun bei einem Key beide 
        # Methoden (self.on_txtctrl_char und self.on_hier_was_anderes_machen)
        # aufgerufen werden und je nach Shortcut (strg+e oder strg+w) die 
        # jeweilige Methode zu ende abgearbeitet wird.
        # Hier das Binding.
        txtctrl.Bind(wx.EVT_CHAR, self.on_hier_was_anderes_machen)
        # Diese Überlegung erwies sich von mir al Naiv! Warum? Weil das 2te
        # Bindig das erste ersetzt. Die Regel besagt, das wenn auf ein gleiches
        # Objekt ein gleiches Bindung aufs gleiche Event 
        #(in dem Beispiel wx.EVT_CHAR) gemacht wird, das erste 
        # Binding ersetzt wird! 
Lössen könnte man das ganze mit sehr viel Aufwand. Dabei kommt eine Methode X zum Einsatz die sich um alles kümmert. Es wird ein Binding, vom Event Type wx.EVT_CHAR, auf besagte Methode X gemacht. Die Methode wertet alle Shortcuts aus und ruft die entsprechende Methode für den entsprechenden Shortcut auf. So würde die Methode dann z.B. für STRG+e self.on_txtctrl_char aufrufen und für strg+w die Methode self.on_hier_was_anderes_machen. Das funktioniert soweit aber ist für mich ehrlich gesagt unütz! Warum? Ganz einfach, es muss von jedem Objekt ein Binding auf diese Methode X vom Typen wx.EVT_CHAR gemacht werden ;) Nun könnt ihr euch denken dass es bei 20-100 Objekten ganz schön ausartet um eine Globale Ansprechung zu realisieren ;)
FAZIT: wxKeyEvent wer hat den *** implementiert? Absolut realitätsfern!
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Donnerstag 23. November 2006, 12:53

Resümee zu Francescos Methode mit Accelerator und wx.EVT_MENU:
Spitze! Damit kann man eine globalisierte Ansprechung von Shortcuts erreichen OHNE viel Aufwand! Ich hab das mit mehreren Sachen getestet und habe diesbezüglich keine Probleme!

Code: Alles auswählen

# ------------------------------------------------------------------ #
        # Shortcuts definieren
        #
        acell_id1 = wx.NewId()
        acell_id2 = wx.NewId()
        acell_id3 = wx.NewId()
        accel = wx.AcceleratorTable([
            # Applikation beenden
            (wx.ACCEL_CTRL, wx.WXK_F4, acell_id1),
            (wx.ACCEL_CTRL, ord('Q'), acell_id2),
            # self.toolbar (LMT-Klick): 'log_window' sichtbar oder nicht
            # sichtbar machen. 
            (wx.ACCEL_CTRL, ord('L'),  acell_id3),
        ])
        self.SetAcceleratorTable(accel)
        
        self.Bind(wx.EVT_MENU, self.on_mainframe_close, id=acell_id1)
        self.Bind(wx.EVT_MENU, self.on_mainframe_close, id=acell_id2)
        self.Bind(wx.EVT_MENU, self.logwin_on_lclicked, id=acell_id3)
Das ist alles und Super gelöst :D (BTW: Ein wx.AcceleratorEntry ist überflüssig. Man kann gleich eine List mit 3-Tuple definieren was übersichtlicher ist.)

Einschränkung:

Ja auch hier gibt es eine Einschränkung ;)
Was ist z.B. wenn STRG+E bei dem der Fokus auf Objekt X liegt, was anderes machen soll, als STRG+E bei dem der Fokus auf Objekt Y liegt?

Vorweg und sinn des eben ausgeführten: Z.B. Durch die Inflationäre Anzahl möglicher Shortcuts, gibt es gewisse Situationen in denen es Angebracht ist, das man Für Objekt X (auf dem der Fokus ist) etwas anderes Ausführen will, als für Objekt Y. Logisch oder?

Es muss aber nicht immer der Grund der Inflation sein. Es kann auch einfach so gewollt sein wegen der Logik die dahinter steht – Erklärung: Z.B. Habe ich in meiner Applikation ein Log-Fenster das bei STRG+L (L steht für Log) sichtbar oder unsichtbar gemacht werden soll. Der Logik nach habe ich hier STRG+L gewählt. Weiterhin habe ich ein Textfeld in dem ich texte Laden kann zur Bearbeitung. Da ich in diesem Textfeld es aber nicht benötige das Log-Fenster sichtbar/unsichtbar zu machen, brauche ich das an dieser stelle nicht. Weiter hin möchte ich der Logik nach mir STRG+L (Laden bzw. Load) in diesem Textfeld, eine Ladediaolog für Dateien öffnen.

Wie realisiere? Nun haben wir ja den Fall des Globalen Ansprechens von Shortcuts bzw. Keys. Es ist aber mit ein wenig Aufwand lösbar.

Die Antwort darauf ist das man um eine (einige) Methoden X nicht herum kommt.
Einfache Überlegung ist, das man dass Binding auf diese Methode X macht. Diese Methode muss dann erkennen welches Objekt momentan Fokussiert ist und für diese Objekt entsprechend die Richtige Methode ausführen. Diese Sache ist recht Trivial zu implementieren.

Hier ein Beispiel: Als Referenz dient Francescos Beispiel vom Mi Verfasst am: Mi Nov 22, 2006 15:49:

Code: Alles auswählen

import wx

class MyDialog(wx.Dialog):
    def __init__(self, parent, ID, title):
        wx.Dialog.__init__(
            self, 
            parent, 
            ID, 
            title,
            wx.DefaultPosition, 
            wx.Size(350, 310)
        )
        
        self.close_btn = wx.Button(self, -1, 'Close', (150, 250))
        self.Bind (wx.EVT_BUTTON, self.on_close)
        
        self.text1 = wx.TextCtrl(self, 3, pos=(70, 20))
        self.text2 = wx.TextCtrl(self, 4, pos=(70, 70))
        self.text1.WriteText("text1")
 
        # Definiere Shortcuts
        accel_id1 = wx.NewId()
        accel = wx.AcceleratorTable([
            # Applikation beenden (Global verfügbar außer text1)
            # oder mach was anderes wenn der Fokus auf text1
            (wx.ACCEL_CTRL, ord('Q'), accel_id1) 
        ])
        self.SetAcceleratorTable(accel)
        
        self.Bind(wx.EVT_MENU, self.strg_q_regulator, id=accel_id1)

    def strg_q_regulator (self, event):    
        focused_object = self.FindFocus()
        if focused_object == self.text1:
            self.mach_was_anderes_wenn_strg_q()
        else:
            self.on_close(None)
        
    def on_close(self, event):
        self.Destroy()
    
    def mach_was_anderes_wenn_strg_q(self):
        self.text1.WriteText("Hab was anderes gemacht bei strg+q")
    
class MyApp(wx.App):
    def OnInit(self):
        dlg = MyDialog(None, -1, 'Test')
        dlg.Show(True)
        dlg.Centre()
        return True

app = MyApp(0)
app.MainLoop()
Simpele Umsetzung. Wenn der Focus auf self.text1 ist (und nur da) soll bei STRG+Q nicht die Applikation beendet werden(on_close), sondern was_anderes_wenn_strg_q ausgeführt werden das den text von self.text1 ädert. Um das zu realisieren brauchen wir eine extra Methode auf die das Binding gemacht wird. Diese Methode ist strg_q_regulator. In der ersten Zeile dieser Methode ist focused_object = self.FindFocus() dass das Fokussierte Objekt wiedergibt. Wenn das Fokussierte Objekt self.text1 wird was_anderes_wenn_strg_q aufgeruffen. Wenn es nicht das Objekt ist, wird einfach wie gehabt die Methode (on_close ausgeführt. :) So damit hat man es erreicht das für ein und den selber Shortcut je nach Objekt was anderes gemacht wird :) Damit habe ich nun alle mir gewünschte Flexibilität :)

Have Fun

Ich hoffe ich konnte den einen oder anderen Helfen und verdeutlichen wie, Trotz globalisierten Ansprechverhalten, der Key dennoch was unterschiedliches mit den selben Shortcut gemacht werden kann.

LG XtraNine

P.S.: Wäre das nicht was für das Wiki? Wenn mir einer sagt wie das geht mit dem Wiki würde ich das gerne (natürlich in überarbeiteter Form ;)) gerne ins Wiki posten :) (Falls es nicht unerwünscht ist)
Antworten