0

さて、なぜこのシンプルなアプリが機能しないのですか。私はこれを調査するために1日を費やしましたが、何も得られませんでした。

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. 以下のコードが示す奇妙な動作を分離しました。これはwncklibに関連するものです。したがって、新しいウィンドウを開く(ウィンドウを左クリック-test1)ことでアプリウィンドウが非アクティブ化された場合、raiseは完全に機能しますが、他のウィンドウ('opera'を任意のものに置き換え)がwnck(右クリック-test2)でアクティブ化された場合作動は失敗します

    インポートロギングインポートサブプロセスインポート時間インポートwnckインポートwx

    logging.basicConfig(level = 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()

私が感じるような非常に役立つwtfの代わりに、誰かがこの動作を理解していますか?:)

4

1 に答える 1

0

キーバインダーとは何ですか?AcceleratorTableを使用していますか?詳細については、 http://www.blog.pythonlibrary.org/2010/12/02/wxpython-keyboard-shortcuts-accelerators/を参照してください。pyGtkとwxPythonを混在させることはできないと思います。

于 2011-06-30T13:52:13.030 に答える