Почему wxframe не вызывается из функции, вызываемой с помощью глобального gtk binder?
Хорошо, почему это простое приложение не работает. Я провел один день, расследуя это, и ничего не получил.
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()
Я не знаю почему, но иногда (особенно когда я поднимаю приложения, нажимая на них на панели) повышение не работает, и вместо всплывающего окна появляется значок флэш-памяти.
ОБНОВИТЬ
Хорошо, я возвращаюсь к теме и замечаю это..
- приведенный выше пример работает для меня.. странно
я выделил странное поведение, которое показано ниже кода.. это что-то связано с 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 ()
Кто-нибудь понимает это поведение вместо очень полезного, как я чувствую?:)
1 ответ
Что такое связка клавиш? Вы используете AcceleratorTable? См. http://www.blog.pythonlibrary.org/2010/12/02/wxpython-keyboard-shortcuts-accelerators/ для получения дополнительной информации. Я не думаю, что вы можете смешивать pyGtk с wxPython.