无法专注于OS / X中的小部件

时间:2013-09-05 13:03:45

标签: python macos wxpython wxwidgets

我正在通过自制软件安装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常见问题解答(http://www.wxwidgets.org/docs/faqmac.htm)的底部,它说:

  

为什么我无法将注意力集中到我的wxMac应用程序上?因为你没有   将您的应用程序构建为一个包。您必须为Mac创建一个包   OS X应用程序,只需运行通常的g ++ wx-config --cxxflags --libs -o minimal minimal.cpp就不足以构建正常工作的Mac应用程序。请查看样本makefile   在Mac OS X下构建捆绑包或阅读此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

这使得可执行文件,但焦点问题仍然存在。因此,我无法使用键盘来控制应用程序。如何让应用程序检测键盘事件?

3 个答案:

答案 0 :(得分:1)

尝试将wx.Panel作为框架的唯一子项。接下来将所有其他小部件放在面板中(即将面板设置为其他小部件的父级)。我知道该面板增加了跨平台的标签功能,所以我怀疑这可能有助于其他键盘事件。

答案 1 :(得分:0)

我最终围绕这个问题进行编码。

以前,我的应用程序正在全局处理键盘事件(请参阅http://wiki.wxwidgets.org/Catching_key_events_globally)。

我无法在OS / X上使用它,所以我放弃并重写了应用程序,以便在本地捕获键盘事件。更具体地,该应用程序包括菜单栏,并且该菜单栏具有项目。我可以通过为菜单栏项指定键盘快捷键来处理键盘事件。

我不确定为什么全局处理在OS / X上不起作用,但我真的不在乎了。

答案 2 :(得分:0)

解决!是否可关注按钮取决于键盘首选项:

System Preferences -> Keyboard -> Shortcuts -> Check "All Controls" at the bottom (in Full Keyboard Access Field).

现在使用WxWidgets(或任何其他应用程序),您也可以在按钮上进行Tab-traverse。

干杯!