0

グローバルgtkバインダーで呼び出された関数からwxframeが発生しないのはなぜですか? 私は別の奇妙な行動に出くわしました..

誰かが私に解決策を教えてもらえますか(ヒントも良いでしょう:))これについて..?

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 を返します。なんで?

4

1 に答える 1

0

問題の wx.PyApp にフォーカスがある場合にのみ、このメソッドが true を返すことを示すこの wx.PyApp.IsActive() ドキュメントを見つけました。もちろん、wx.Frame と wx.PyApp は別のオブジェクトです。残念ながら、wxpython のwx.TopLevelWindow ドキュメントは の詳細な説明を提供していませんがIsActive()wxwidget のドキュメントは、この「フォーカス チェック」行の推論を追求する価値があることを示唆しているようです。

私はあなたのコードの変更されたバージョンを取り(削除されgtkkeybinderインストールされていないため、toggle_shownメソッドを にバインドしますwx.EVT_KEY_DOWN)、ブレークポイントを設定してprint self.IsActive()から、デバッグコードの数行を手動で実行しました。次の動作を観察しました。

>self.IsActive()

>self.SetFocus()

>self.IsActive()

>self.HasFocus()

ウィンドウを最上位レイヤーに配置している (を使用しているself.Raise()) からといって、アプリケーションをアクティブに設定している (つまり、フォーカスを与えている) わけではないように思えます。

もちろん、これはなぜ と の 2 つの方法があるのか​​という疑問を提起しIsActive()ますHasFocus()。これに対する答えはわかりません。

于 2012-07-26T07:55:49.710 に答える