2017-05-10 3 views
0

Ich habe ein kleines Problem, ich verwende FreeBSD, aber dieses Problem tritt auch auf Linux.wxpython nicht erfassen EVT_HELP

ich versuche, eine wx.EVT_HELP durch die Verwendung der Taste F1 zu senden, aber es passiert nichts:

import logging as log 
import wx 

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 

     self.Bind(wx.EVT_HELP, self.function) 
     self.SetFocus() 
     self.Show(True) 

    def function(self, event=None): 
     print "drin" 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    app.MainLoop() 

Ich versuchte es mit einem Panel wie in wxpython can't capture EVT_KEY_DOWN enent

import logging as log 
import wx 

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 

     self.panel = wx.Panel(self, wx.ID_ANY) 
     self.panel.Bind(wx.EVT_HELP, self.function) 
     self.panel.SetFocus() 
     self.Show(True) 

    def function(self, event=None): 
     print "drin" 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    app.MainLoop() 

aber dieses didn Ich arbeite auch nicht (und ich möchte Panel in meinem Fall verhindern). Die einzigen Möglichkeiten, die ich kenne, sind wx.EVT_KEY_DOWN mit Panels oder wx.CHAR_HOOK (funktioniert ohne Panels), aber in beiden Fällen binden sie jedes keyEvent an meine Funktion und ich möchte nur F1 oder besser wx.EVT_HELP.

Weiß jemand wie ich F1 mit wx.EVT_HELP verbinden kann, damit mein erster Code funktioniert?

Danke für Ihre Zeit!


Vielen Dank für Ihre Hilfe! Das AcceleratorTable ist etwas, nach dem ich gesucht habe! Aber ich nicht, warum ein Bedarf an einer Platte besteht, mein Testcode

import logging as log 
import wx 

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 

     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 
     wx.Panel(self, wx.ID_ANY) 
     f1_id = wx.NewId() 
     self.Bind(wx.EVT_MENU, self.function, id = f1_id) 
     accel_tbl = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_F1, f1_id)]) 
     self.SetAcceleratorTable(accel_tbl) 
     self.SetFocus() 
     self.Show(True) 

    def function(self, event=None): 
     print "drin" 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    app.MainLoop() 

funktioniert, aber es ist nicht einmal das Panel. Gibt es eine Möglichkeit, ein Panel zu umgehen? Oder ist ein Frame (mit Unix) nicht empfindlich genug, um die Keyevents zu empfangen? (Wenn ich das Panel in meinem Testcode lösche, funktioniert es ohne Schlüssel.)

+1

Haben Sie Arbeiten mit [Beschleuniger Tabellen] getan (https://wxpython.org/docs/api/wx.AcceleratorTable-class.html) als eine Methode zur Bindung von Schlüsseln an Ereignisse? – wnnmaw

Antwort

1

Sie müssen ein wx.AcceleratorTable verwenden. Hier ist ein einfaches Beispiel:

import logging as log 
import wx 

class MainWindow(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 

     self.panel = wx.Panel(self, wx.ID_ANY) 
     self.panel.Bind(wx.EVT_HELP, self.function) 

     f1_id = wx.NewId() 
     self.Bind(wx.EVT_MENU, self.function, id=f1_id) 
     accel_tbl = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_F1, f1_id)]) 
     self.SetAcceleratorTable(accel_tbl) 

     self.Show(True) 

    def function(self, event=None): 
     print "drin" 

if __name__ == "__main__": 
    app = wx.App(False) 
    gui = MainWindow(None, "test") 
    app.MainLoop() 

Dies funktionierte für mich mit WxPython 3.0.2. Klassik auf Xubuntu 16.04 mit Python 2.7.12

Weitere Informationen zum Thema:

+0

Hallo Mike Driscoll, nochmals vielen Dank für deine Hilfe. Die AcceleratorTable funktioniert für mich, aber ich habe eine Frage zu dem Panel, ich habe es in meiner ersten Frage geschrieben. –

+1

Ich bin mir nicht sicher, warum das Panel benötigt wird (und es hängt vielleicht nicht vom Betriebssystem ab), aber Sie wollen fast immer eines innerhalb eines 'wx.Frame'. Der Grund dafür ist, dass das Panel den Rahmen über Plattformen hinweg richtig aussehen lässt und auch das Tabbing zwischen Widgets ermöglicht, wenn ich mich richtig erinnere. –

+1

EVT_HELP-Ereignisse sind normalerweise nicht automatisch an F1 gebunden. Sie müssen es ein wenig aushelfen, so wie Mike es mit einer Accelerator-Tabelle gezeigt hat, oder es auf andere Weise handhaben. Wenn Sie jedoch einen wx.ContextHelpButton haben oder die wx.ContextHelp-Klasse selbst verwenden, erhalten Sie EVT_HELP-Ereignisse. Weitere Informationen finden Sie in der Dokumentation und Demo. – RobinDunn