在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。为什么呢?
答案 0 :(得分:0)
一些快速的谷歌搜索发现em this wx.PyApp.IsActive() documentation声明如果所讨论的wx.PyApp具有焦点,则此方法仅返回true。当然,wx.Frame和wx.PyApp是不同的对象。不幸的是,wxpython的wx.TopLevelWindow documentation没有提供IsActive()
的详细解释,但是wxwidget's documentation似乎表明这种“重点检查”推理线值得追求。
我修改了您的代码版本(已移除gtk
和keybinder
,因为我没有安装它们。将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()
,它们检查相同的东西。我不知道答案。