gtk.StatusIcon がトレイにあり、右クリックのコンテキスト メニューがあるクロスプラットフォーム アプリがあります。問題は、Windows マシンではメニューの配置がひどいことです。メニューの上部はマウス ポインターから始まるため、ほとんどのメニューは画面の下部まで伸びています。これは上にスクロールして使用できますが、ユーザーにとっては少し面倒です。
関連するもう 1 つの質問ですが、ユーザーが画面上の別の場所をクリックすると、メニューを非表示にすることはできますか?
gtk.status_icon_position_menu
Windows でこの「スクロール メニュー」の問題を回避するにはNone
、「popup-menu」シグナル コールバックを置き換える必要があります。
def popup_menu_cb(status_icon, button, activate_time, menu):
menu.popup(None, None, None, button, activate_time)
メニューはマウス カーソル上に表示されますが、それはすべての Windows プログラムが行う方法です。
それを非表示にする方法がわかりません...私が見つけた唯一のことは、メニューでマウスボタンを押して外に放すことです。:P
ポップアップで 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 では他の場所をクリックするとポップアップが閉じてしまうからです。