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

(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)