4

gtk.StatusIcon がトレイにあり、右クリックのコンテキスト メニューがあるクロスプラットフォーム アプリがあります。問題は、Windows マシンではメニューの配置がひどいことです。メニューの上部はマウス ポインターから始まるため、ほとんどのメニューは画面の下部まで伸びています。これは上にスクロールして使用できますが、ユーザーにとっては少し面倒です。

関連するもう 1 つの質問ですが、ユーザーが画面上の別の場所をクリックすると、メニューを非表示にすることはできますか?

4

3 に答える 3

3

gtk.status_icon_position_menuWindows でこの「スクロール メニュー」の問題を回避するにはNone、「popup-menu」シグナル コールバックを置き換える必要があります。

def popup_menu_cb(status_icon, button, activate_time, menu):
    menu.popup(None, None, None, button, activate_time)

メニューマウス カーソル上に表示されますが、それはすべての Windows プログラムが行う方法です。

それを非表示にする方法がわかりません...私が見つけた唯一のことは、メニューでマウスボタンを押して外に放すことです。:P

于 2009-07-16T18:04:37.273 に答える
2

ポップアップで leave_notify および enter_notify イベントを有効にすると、マウスが離れたときにポップアップを非表示にできます。次に、これらを使用してタイムスタンプを設定およびクリアします。次に、gobject.timeout_add() で作成されたタイマー コールバックで、マウスが一定時間ポップアップ メニューから離れていたかどうかを確認します。その後、ポップアップを hide() し、タイマーをクリアします。

私が使用しているイベントとタイマーのコールバックは次のとおりです。

. . .
    self.mouse_in_tray_menu = None
    gobject.timeout_add(500, self.check_hide_popup)
. . .

def on_tray_menu_enter_notify_event(self, widget, event, data = None):
    self.mouse_in_tray_menu = None


def on_tray_menu_leave_notify_event(self, widget, event, data = None):
    self.mouse_in_tray_menu = event.time + 1 # Timeout in 1 sec


def check_hide_popup(self, data = None):
    if self.mouse_in_tray_menu and self.mouse_in_tray_menu < time.time():
        self.tray_menu.hide()
        self.mouse_in_tray_menu = None

    return True # Keep the timer callback running

タイマーを常に実行し続ける必要はありませんが、その方が簡単で、他のことにも使用しています. enter_notify と leave_notify の呼び出しは多少不安定なので、タイマーが必要です。

ところで、これは実際には Windows でのみ必要です。Linux では他の場所をクリックするとポップアップが閉じてしまうからです。

于 2010-07-17T02:52:21.273 に答える