2016-07-28 36 views
0
import wx 

class Control(wx.Control): 

    def __init__(self, parent): 

     wx.Control.__init__(self, parent) 

     self.Bind(wx.EVT_CHAR, self.OnKey) 
     self.Bind(wx.EVT_KEY_DOWN, self.OnKey) 
     self.Bind(wx.EVT_KEY_DOWN, self.OnKey) 
     self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseClick) 

    def OnKey(self, event): 
     print("key pressed") 
     event.Skip() 

    def OnMouseClick(self, event): 
     self.SetFocus() 
     print("has focus") 
     event.Skip() 

class Frame(wx.Frame): 

    def __init__(self, parent=None): 

     wx.Frame.__init__(self, parent) 

     panel = wx.Panel(self) 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     radio = wx.RadioButton(panel, label="Radio button") 
     button = wx.Button(panel, label="Button") 
     control = Control(panel) 

     sizer.Add(radio, 0, wx.ALL, 5) 
     sizer.Add(button, 0, wx.ALL, 5) 
     sizer.Add(control, 0, wx.ALL, 5) 

     panel.SetSizer(sizer) 

     self.Show() 

if __name__ == "__main__": 
    app = wx.App() 
    frame = Frame() 
    app.MainLoop() 

Ein ziemlich minimales Beispiel.wxPython - wie man ein wx.Control davon abhält, den Fokus auf die Pfeiltaste zu verlieren?

durch Klicken auf das Steuerelement, legt den Fokus zu steuern. Auch wenn die Taste auf eine Funktion OnKey gedrückt wird, ändert eine Pfeiltaste den Fokus auf eine andere Schaltfläche/ein anderes Widget.

Gibt es ein ähnliches Verfahren wie AcceptsFocusFromKeyboard (Selbst-):

Beschreibung: Kann man das Fenster den Fokus von Tastaturnavigation gegeben werden? Wenn nicht, ist der einzige Weg, den Fokus zu setzen (vorausgesetzt, es akzeptiert ihn überhaupt), darauf zu klicken.

Außer

Ein Verfahren, bei dem meine Kontrolle nicht Fokus von Tastaturnavigation

Antwort

0

Sie beide Event-Handler, den Anruf zu fehlen verliert:

event.Skip() 

Diese Ereignisse sind non-wxCommandEvents und damit sie ordnungsgemäß funktionieren, muss das Betriebssystem alles ausführen, was ausgeführt werden muss. Dafür ist Skip() da. Andernfalls wird das Ereignis von der Kontrolle gegessen.

Bitte überprüfen Sie die Dokumentation für diese Methode, fügen Sie sie hinzu und sehen Sie, ob das Problem dadurch behoben wird.

Auch aus Neugier, was erwarten Sie, wenn der Benutzer die Pfeiltaste drückt?

Wenn der Fokus beibehalten werden soll, wenn die Pfeiltaste gedrückt wird, versuchen Sie, das Ereignis nach event.GetKeyCode() zu filtern (überprüfen Sie die Dokumentation für den richtigen Funktionsnamen), und rufen Sie event.Skip() nicht auf dieser Fall.

Wenn das nicht funktioniert, versuche das Ereignis wx.EVT_CHAR_HOOK abzufangen.

Wenn dies auch nicht funktioniert, überschreiben Sie FilterEvent().

Auch die Struktur Ihrer GUI ist sehr seltsam. Versuchen Sie, das RAD-Tool (wxGlade, wxSmith, etc.) zu bekommen, bauen Sie es dort und schauen Sie sich das Ergebnis an. Oder sehen Sie sich den Demo-Ordner in der wxPython-Distribution an (verfügbar als anderer Download), um zu sehen, wie man das normale Layout in wxPython erstellt.

Es ist auch möglich, dass Sie durch die Korrektur der GUI das Problem mit der Pfeiltaste beheben.

diesen Code Versuchen Sie stattdessen:

import wx 

class Frame(wx.Frame): 
    def __init__(self, parent=None): 
     wx.Frame.__init__(self, parent) 
     panel = wx.Panel(self) 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     radio = wx.RadioButton(panel, label="Radio button") 
     button = wx.Button(panel, label="Button") 
     self.Bind(wx.EVT_CHAR, self.OnChar) 
     radio.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
     button.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) 
     self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseClick) 

     sizer.Add(radio, 0, wx.ALL, 5) 
     sizer.Add(button, 0, wx.ALL, 5) 
     sizer.Add(control, 0, wx.ALL, 5) 

     panel.SetSizer(sizer) 

     self.Show() 

    def OnKeyDown(self, event): 
     print("key pressed") 
     if not event.GetKeyPress() == wx.WXK_LEFT_ARROW: # Check the function name. I'm writing from memory 
      event.Skip() 

    def OnChar(self, event): 
     print("Character key pressed on the panel") 
     event.Skip() 

    def OnMouseClick(self, event): 
     self.SetFocus() 
     print("has focus") 
     event.Skip() 

if __name__ == "__main__": 
    app = wx.App() 
    frame = Frame() 
    app.MainLoop() 

Sie sollten die Idee. Rufen Sie event.Skip() nur auf, wenn die gedrückte Taste keine Pfeiltaste ist.

+0

Entschuldigung, ich habe event.Skip() getestet, aber ich habe es versehentlich aus dem Beispiel weggelassen. Ich möchte, dass es auf das Steuerelement fokussiert bleibt, wobei die Pfeiltaste den Status des Steuerelements ändern kann. Zum Beispiel können die Pfeiltasten wie ein listctrl die Auswahl in der Liste ändern, anstatt den Fokus vom listctrl zu verlieren. – Blackboard

+0

@Blackboard, Antwort aktualisiert. – Igor

+0

danke, ich werde die Vorschläge versuchen, die Sie gemacht haben. Wenn es Ihnen nichts ausmacht, mich zu fragen, was ist mit dem Code (der sich nicht auf Dinge wie Leerzeichen oder Namenskonventionen bezieht), die Ihnen falsch/komisch erschienen? Ich habe viele Codebeispiele aus verschiedenen Tutorials gesehen, die auf diese Weise erstellt wurden.(obwohl ich mehr Code-Beispiele überprüfen werde) – Blackboard