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