2

自作でインストールされた wxWidgets で Python 2.7.5 を実行しています。

私の問題は、OS/X で実行しているときにキーボード イベントがまったく取得されないことです。次のサンプル ソースを検討してください。

noname.py:

import wx
import wx.xrc
class MyFrame2 ( wx.Frame ):
   def __init__( self, parent ):
      wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
      self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
      bSizer1 = wx.BoxSizer( wx.VERTICAL )
      self.m_button1 = wx.Button( self, wx.ID_ANY, u"MyButton", wx.DefaultPosition, wx.DefaultSize, 0 )
      bSizer1.Add( self.m_button1, 0, wx.ALL, 5 )
      self.SetSizer( bSizer1 )
      self.Layout()
      self.Centre( wx.BOTH )
      # Connect Events
      self.m_button1.Bind( wx.EVT_BUTTON, self.OnClick )
   def __del__( self ):
      pass
   # Virtual event handlers, overide them in your derived class
   def OnClick( self, event ):
      event.Skip()

main.py:

from noname import MyFrame2
class MyFrame2Impl(MyFrame2):
    def __init__(self, parent):
        MyFrame2.__init__(self, parent)
    def OnClick(self, event):
        self.m_button1.SetLabel(str(wx.Window.FindFocus() != None))

import wx
app = wx.App(False)  # Create a new app, don't redirect stdout/stderr to a window.
frame = MyFrame2Impl(None) # A Frame is a top-level window.
frame.m_button1.SetFocus()
frame.Show(True)     # Show the frame.
app.MainLoop()

Ubuntu では、ボタンをクリックすると「True」と表示されます。スペースバーを押すと、ボタンがクリックされます。OS/X では、ボタンをクリックすると「False」と表示されます。スペースバーを押しても何も起こりません。

WxMac の FAQ ( http://www.wxwidgets.org/docs/faqmac.htm ) の下部に、次のように書かれています。

wxMac アプリケーションにフォーカスを設定できないのはなぜですか? アプリケーションをバンドルとしてビルドしなかったためです。Mac OS X アプリケーション用のバンドルを作成する必要がありwx-config --cxxflags --libsます。正常に動作する Mac アプリケーションをビルドするには、通常の g++ -ominimalminimal.cpp を実行するだけでは十分ではありません。詳細については、Mac OS X でバンドルをビルドするサンプル makefile を参照するか、この wiki トピックを参照してください。

このスクリプトを使用してバンドルを作成しました。

from setuptools import setup
APP = ["main.py"]
OPTIONS = {"argv_emulation": True, "includes": ["wx"]}
setup(app=APP, options={"py2app": OPTIONS}, setup_requires=["py2app"])

次のコマンドでバンドルを構築するために使用します。

python setup.py py2app

これにより実行可能ファイルが作成されますが、フォーカスの問題は引き続き発生します。その結果、キーボードを使用してアプリケーションを制御することができません。アプリケーションでキーボード イベントを検出するにはどうすればよいですか?

4

3 に答える 3

1

wx.Panel をフレームの唯一の子として配置してみてください。次に、他のすべてのウィジェットをパネルに配置します (つまり、パネルを他のウィジェットの親として設定します)。パネルがクロスプラットフォームのタブ機能を追加することを知っているので、これが他のキーボードイベントに役立つのではないかと思います.

于 2013-09-05T14:21:19.333 に答える
0

私は問題の周りにコーディングすることになりました。

以前は、私のアプリケーションはキーボード イベントをグローバルに処理していました ( http://wiki.wxwidgets.org/Catching_key_events_globallyを参照)。

これを OS/X で動作させることができなかったので、あきらめて、キーボード イベントをローカルでキャプチャするようにアプリケーションを書き直しました。より具体的には、アプリケーションにはメニュー バーが含まれており、そのメニュー バーには項目があります。メニュー バーの項目にキーボード ショートカットを割り当てることで、キーボード イベントを処理できます。

グローバル処理が OS/X で機能しない理由はわかりませんが、もう気にしません。

于 2013-10-25T09:14:23.317 に答える