2017-12-16 8 views
2

私はpygtkモジュールを使い、Ubuntu 17.10のトップバーにアプリケーションインジケータを作成していました。少し研究してクリック後、PyGTK AppIndicatorメニューを開いたままにするにはどうすればいいですか?

、私は成功しますが、メインスレッド一時停止することができ、メニューなされてきた(現在はコンソールにちょうど版画「更新」。)

今私は「問題に出くわしとcouldnました答えを見つける。

トップバーのラジオストリーマーを作ろうと思っています。クリックするたびに閉じるメニューは、検索時にはナビゲーションにとって非常に好ましくありません。

アイテムをクリックしたときにメニューを開いたままにするにはどうすればよいですか?

は、ここに私のコードです:

import os 
import signal 
import time 
from threading import Thread 

import gi 
gi.require_version("Gtk", "3.0") 
gi.require_version("AppIndicator3", "0.1") 

from gi.repository import Gtk as gtk 
from gi.repository import AppIndicator3 as appindicator 
from gi.repository import GObject as gobject 


class Indicator: 

    def __init__(self, name=None, icon=None): 

     self.path = os.path.abspath(os.path.dirname(__file__)) 

     signal.signal(signal.SIGINT, signal.SIG_DFL) 

     if name is None: 
      self.name = "MyApp" 
     else: 
      self.name = name 

     if icon is None: 
      self.icon = gtk.STOCK_INFO 
     else: 
      self.icon = icon 

     self.indicator = appindicator.Indicator.new(
      self.name, self.icon, 
      appindicator.IndicatorCategory.SYSTEM_SERVICES 
      ) 

     self.indicator.set_status(appindicator.IndicatorStatus.ACTIVE) 

     self.indicator.set_menu(self.create_menu()) 

     self.running = True 
     self.paused = False 

     self.thread = Thread(target=self.update) 
     self.thread.setDaemon(True) 
     self.thread.start() 

    def create_menu(self): 
     menu = gtk.Menu() 

     pause_entry = gtk.MenuItem("Pause") 
     pause_entry.connect("activate", self.pause) 
     menu.append(pause_entry) 

     quit_entry = gtk.MenuItem("Quit") 
     quit_entry.connect("activate", self.quit) 
     menu.append(quit_entry) 

     menu.show_all() 
     return menu 

    def update(self): 
     while self.running: 
      time.sleep(1) 
      if not self.paused: 
       print("Update", flush=True) 

    def start(self): 
     gobject.threads_init() 
     gtk.main() 

    def pause(self, menu): 
     self.paused = not self.paused 
     text = "Resume" if self.paused else "Pause" 
     for widget in menu.get_children(): 
      print(widget.get_text()) 
      widget.set_text(text) 

    def quit(self, menu=None): 
     self.running = False 
     gtk.main_quit() 


if __name__ == "__main__": 
    indicator = Indicator() 
    indicator.start() 

答えて

1

は残念ながら、私はあなたがアイテムをクリックすると、メニューが開いたままにすることができるとは思いません。

これはインジケータが一貫性のある均一な方法で機能し、カスタムアクション(右クリック、マウスオーバーなど)が適用されないようにするために、AppIndicator開発者が意図したデザインです。decisionエンドユーザーがオンにします。

私はリアルタイムでニュースを表示し、関連するpygtk/appindicator APIリファレンス資料を調査したときにappindicatorを作成しました。私が遭遇したサポートされているメニューアクションは、スクロールだけでした。

あなたのラジオストリーマープロジェクトに関しては、あなたのアプリケーションの主な焦点としてメニューを用意し、pygtkのウィンドウに適切にメニュー項目を表示させることをお勧めします。次に、callbacks and signalsを使用して必要な操作を実行します。これは私の小さなプロジェクトでも取り組んだアプローチであり、かなりうまくいきました。

+0

こんにちは@kingJulian。答えをありがとう。私はメニューを開いたままにする方法を見つけることができなかったので、これが設計上の選択であることを疑いました。前に 'gtk.Window'を使用していましたが、クリックするとメニューを開いたままにしておけばいいかもしれません。あなたのご意見ありがとうございます! – Jebby

関連する問題