2017-12-16 38 views
2

pygtk 모듈로 주위를 둘러보고 우분투 17.10의 상단 표시 줄에 앱 표시기를 만들려고했습니다. 약간의 연구와클릭 후 PyGTK AppIndicator 메뉴를 열어 두는 방법은 무엇입니까?

, 나는 성공적으로 메인 스레드 일시 정지 할 수있는 메뉴를 만들었습니다 (현재 콘솔에 바로 인쇄 "업데이트"를.)

지금 내가 문제가 우연히 발견하고 나오지 않았어했습니다 ' 답을 찾지 마라.

상단 표시 줄에 라디오 스트리머를 만들려고하는데 모든 클릭에 대해 닫는 메뉴가 탐색 할 때 탐색에 매우 바람직하지 않습니다.

항목을 클릭 할 때 메뉴를 열린 상태로 유지하려면 어떻게해야합니까?

여기 내 코드입니다 :

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

안녕하세요. 답변 해주셔서 감사합니다. 메뉴를 열어 둘 수있는 방법을 찾지 못했기 때문에 이것이 디자인 선택 이었음을 의심스러워했습니다. 전에'gtk.Window'를 사용 했었습니다. 아마도 클릭 할 때 메뉴를 열어 둘 수있는 방법이나 적어도 가능한 해결 방법이 있기를 바랬습니다. 귀하의 의견을 보내 주셔서 감사합니다! – Jebby