0

为什么wxframe不是从使用全局 gtk binder 调用的函数中引发的?我遇到了另一个奇怪的行为..

谁能给我一个解决方案(提示也很好:))为此..?

import wx, os
import keybinder

class FrameWithHotKey(wx.Frame):

    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        hotkey = "<Ctrl>period"
        keybinder.bind(hotkey, self.toggle_shown)

    def toggle_shown(self):
        # windowNow id
        if self.IsShown():
            self.Hide()
        else:
            self.Show()
            self.Raise()
        print self.IsActive()


if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = FrameWithHotKey(None)
    app.MainLoop()

如果按下热键 isActive 总是返回 false。为什么?

4

1 回答 1

0

一些快速的谷歌搜索发现了这个 wx.PyApp.IsActive() 文档,说明该方法仅在所讨论的 wx.PyApp 具有焦点时才返回 true。当然,wx.Frame 和 wx.PyApp 是不同的对象。不幸的是,wxpython 的wx.TopLevelWindow 文档没有提供详细的解释IsActive(),但是wxwidget 的文档似乎表明这种“焦点检查”的推理方式值得追求。

我采用了您的代码的修改版本(已删除gtkkeybinder因为我没有安装它们。将您的toggle_shown方法绑定到wx.EVT_KEY_DOWN)并设置断点print self.IsActive(),然后手动运行几行调试代码。我观察到以下行为:

>self.IsActive()

>self.SetFocus()

>self.IsActive()

>self.HasFocus()

在我看来,仅仅因为您将窗口放在顶层(使用self.Raise())并不意味着您将应用程序设置为活动的(即给予它焦点)。

当然,这提出了一个问题,即为什么有两种方法IsActive()HasFocus(),它们看起来检查相同的东西。我不知道这个问题的答案。

于 2012-07-26T07:55:49.710 回答