2017-05-10 6 views
0

私は少し問題がありますが、私はFreeBSDを使用していますが、この問題はLinuxでも発生します。wxpythonはEVT_HELPをキャプチャしません

私はF1キーを使用してwx.EVT_HELPを送信しようとしますが、何も起こりません:

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

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

が、これのdidnのようなパネルでそれを試してみましたどちらかといえば(そして私の場合はパネルを避けたい)。私が知っている唯一の可能性は、パネルまたはwx.CHAR_HOOK(パネルなしで動作)でwx.EVT_KEY_DOWNを使用することですが、どちらの場合でもすべてのkeyeventを関数にバインドして、F1またはむしろwx.EVT_HELPが必要です。

誰かがF1をwx.EVT_HELPとどのように接続できるか知っていますか?私の最初のコードはうまくいくでしょうか?

ありがとうございました!


ありがとうございました!アクセラレータテーブルは私が探していたものです!しかし、なぜパネルが必要なのか分からないのですが、私のテストコード

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

が働いていますが、パネルを使用していません。パネルを回避する可能性はありますか?または、キーイベントを受信するのに十分な機密性がないフレーム(UNIXの場合)ですか? (テストコードのパネルを削除すると、キーなしで動作します)

+1

あなたは[アクセラレータテーブル]ですべての作業を行っています(https://wxpython.org/docs/api/wx.AcceleratorTable-class.html)イベントにキーをバインドする方法として? – wnnmaw

答えて

1

wx.AcceleratorTableを使用する必要があります。ここに簡単な例があります:

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

これはwxPython 3.0.2で私にとって役に立ちました。トピックの詳細についてはPython 2.7.12でのXubuntu 16.04のクラシック

+0

こんにちはMike Driscoll、もう一度お世話になりました。 AcceleratorTableは私のために働いていますが、パネルに関する質問があります。私はそれを私のフリストの質問に書いています。 –

+1

パネルがなぜ必要なのかわかりませんが(それはOSに依存しないかもしれませんが)、ほとんどの場合、常に1つが 'wx.Frame'の中にあります。その理由は、パネルがフレーム全体に適切なルック・アンド・フィールを与え、正しくリコールすれば、ウィジェット間のタブ移動も可能にするからです。 –

+1

EVT_HELPイベントは、通常、自動的にF1にバインドされません。 Mikeがアクセラレータテーブルで示したような、少し助けたり、他の方法でそれを扱う必要があります。ただし、wx.ContextHelpButtonがある場合、またはwx.ContextHelpクラスを自分で使用する場合は、EVT_HELPイベントが発生します。詳細は、ドキュメントとデモを参照してください。 – RobinDunn

関連する問題