为什么不使用全局gtk绑定器调用的函数引发wxframe?

时间:2011-06-18 19:34:34

标签: window wxpython raise wnck

好的,为什么这个简单的应用程序不起作用。 我花了一天时间调查这个并没有得到任何结果。

import wx, os
import gtk
import keybinder

class FrameWithHotKey(wx.Frame):

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

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


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

我不知道为什么,但有时候(特别是当我通过在面板上点击它们来提高应用程序时)提高工作量并且我得到了闪光灯图标而不是凸起的窗口。

更新

好的,我回到主题并注意到这些..

  1. 以上示例适用于我..奇怪
  2. 我隔离了代码显示的奇怪行为..这是与wnck lib相关的东西。因此,如果通过打开新窗口(左键单击窗口 - test1)停用我的应用程序窗口,则提升工作完美,但如果使用wnck(通过右键单击 - test2)激活其他窗口(用任何Yours替换'opera'),则行动失败

    导入日志记录 导入子流程 进口时间 导入wnck import wx

    logging.basicConfig(级别= logging.DEBUG)

    类MyFrame(wx.Frame):

    def __init__(self, parent, title=''):
        wx.Frame.__init__(self, parent, title=title)
        self.Centre()
        self.Bind(wx.EVT_LEFT_DOWN, self.test1)
        self.Bind(wx.EVT_RIGHT_DOWN, self.raise_window)
    
    def test1(self, evt):
        logging.debug('losing..')
        subprocess.Popen(['xterm'])
        time.sleep(1)
        self.Raise()
        logging.debug('lost')
    
    def lose_focus_by_wnck(self):
        screen = wnck.screen_get_default()
    
        import gtk
        while gtk.events_pending():
            gtk.main_iteration(False)
    
        wins = screen.get_windows()
        logging.debug('wins: {0}'.format(wins))
        for win in  wins:
            app_name = win.get_application().get_name()
            logging.debug('app: {0}'.format(app_name))
            if 'opera' in app_name.lower():
                win_id = win.get_xid()
                break
        else:
            win_id = None
        return win_id
    
    def test2(self, evt):
        logging.debug('losing..')
        win_id = self.lose_focus_by_wnck()
        win = wnck.window_get(win_id)
        TIMESTAMP = 0
        win.activate(TIMESTAMP)
        logging.debug('lost')
        time.sleep(1)
        self.Raise()
        logging.debug('raised')
    

    如果名称 =='主要':     app = wx.PySimpleApp(redirect = False)     frame = MyFrame(无)     frame.Show()     app.MainLoop()

  3. 有没有人理解这种行为而不是像我觉得的非常有用的wtf? :)

1 个答案:

答案 0 :(得分:0)

什么是键盘手?你在使用AcceleratorTable吗?有关详细信息,请参阅http://www.blog.pythonlibrary.org/2010/12/02/wxpython-keyboard-shortcuts-accelerators/。我不认为你可以将pyGtk与wxPython混合使用。