为什么isActive不能与keybinder一起使用?

时间:2012-07-25 13:18:55

标签: window wxpython

Why wxframe isn't raised from a function called with global 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。为什么呢?

1 个答案:

答案 0 :(得分:0)

一些快速的谷歌搜索发现em this wx.PyApp.IsActive() documentation声明如果所讨论的wx.PyApp具有焦点,则此方法仅返回true。当然,wx.Frame和wx.PyApp是不同的对象。不幸的是,wxpython的wx.TopLevelWindow documentation没有提供IsActive()的详细解释,但是wxwidget's documentation似乎表明这种“重点检查”推理线值得追求。

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

  

&GT; self.IsActive()
  假

     

&GT; self.SetFocus()

     

&GT; self.IsActive()
  真

     

&GT; self.HasFocus()
  真

在我看来,仅仅因为你将窗口放在顶层(使用self.Raise())并不意味着你将应用程序设置为活动状态(即让它集中注意力)。

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