【问题标题】:Unable to focus on widgets in OS/X无法专注于 OS/X 中的小部件
【发布时间】:2013-09-09 08:04:18
【问题描述】:

我正在运行 Python 2.7.5,并通过自制软件安装了 wxWidgets。

我的问题是,在 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 minimum minimum.cpp 不足以构建一个正常工作的 Mac 应用程序。请查看示例生成文件 在 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

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

【问题讨论】:

    标签: python macos wxpython wxwidgets


    【解决方案1】:

    解决了!按钮是否可聚焦取决于键盘偏好:

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

    现在使用 WxWidgets(或任何其他应用程序),您也可以在按钮上进行制表符遍历。

    干杯!

    【讨论】:

      【解决方案2】:

      我最终解决了这个问题。

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

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

      我不确定为什么全局处理在 OS/X 上不起作用,但我不再关心了。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 感谢您的回答。它有点帮助:现在 something 似乎有了焦点,但它不是按钮(如果我按下空格,什么都不会发生)。即使我单击按钮,这种情况仍然存在(这应该将焦点转移到按钮,但由于某种原因不会)。
        • 您可以使用 FindFocus 帮助您找出焦点所在。见stackoverflow.com/questions/3452489/…。我还在这里写了一些关于焦点事件的内容:blog.pythonlibrary.org/2009/08/27/wxpython-learning-to-focus。你也可以试试小部件检查工具
        • 感谢您的建议。我做了一些调试,发现在 OS/X 上,单击 Button 时父面板获得焦点。在 Ubuntu 上,当单击按钮时,按钮本身会获得焦点。为什么会有差异?如何让 Button 专注于 OS/X?
        猜你喜欢
        • 2013-07-20
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 2013-08-16
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        相关资源
        最近更新 更多