Почему wxframe не вызывается из функции, вызываемой с помощью глобального связывателя gtk?

Хорошо, почему это простое приложение не работает. Я провел один день, исследуя это, и ничего не получил.

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), тогда актвация терпит неудачу

    импорт журнала импорт подпроцесса время импорта импорт wnck импорт 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')
    

    if name == 'main': app = wx.PySimpleApp (redirect = False) frame = MyFrame (None) frame.Show () app.MainLoop ()

Кто-нибудь понимает это поведение вместо очень полезного, как я чувствую? :)


person xliiv    schedule 18.06.2011    source источник
comment
У меня работает на Ubuntu 11.04. Есть ли шанс, что вы запускаете это на виртуальной машине? Если ваша клавиша CTRL привязана к какой-либо системной функции (например, отпусканию указателя мыши с консоли), нажатие клавиши не попадет в гостевую ОС. Попробуйте использовать другую клавишу CTRL или другую комбинацию клавиш и посмотрите, работает ли она.   -  person robots.jpg    schedule 21.06.2011
comment
Я не использую ВМ. Проблема в том, что у меня почти всегда дважды нажимают горячую клавишу, чтобы активировать этот фрейм. Это довольно странно. Я не знаю, как это отлаживать. :(   -  person xliiv    schedule 21.06.2011


Ответы (1)


Что такое связка клавиш? Вы используете AcceleratorTable? См. http://www.blog.pythonlibrary.org/2010/12/02/wxpython-keyboard-shortcuts-accelerators/ для получения дополнительной информации. Я не думаю, что вы можете смешивать pyGtk с wxPython.

person Mike Driscoll    schedule 30.06.2011
comment
keybinder Я думаю, что ускорители работают только в приложении, я прав? Я ищу что-то в масштабе ОС, например глобальную горячую клавишу. - person xliiv; 21.07.2011
comment
Ты прав. Ускорители предназначены только для приложения. В противном случае вам нужно прописать свои ключи в самой ОС или использовать какое-то специализированное приложение. - person Mike Driscoll; 21.07.2011