우분투와 다른 배포판에 표시되는 상태 아이콘을 프로그래밍하는 방법은 무엇입니까?


23

해당 응용 프로그램은 일부 작업 (여기서는 오디오를 네트워크 스트림에 연결)을 수행하고 이러한 작업이 성공하면 최소화 된 상태로 실행됩니다. 따라서 연결 상태를 표시하려면 상태 아이콘이 필요합니다 (예 : CONNECTED / DISCONNECTED). 아이콘을 클릭 할 때만 응용 프로그램 창이 열리고 추가 옵션에 액세스 할 수 있습니다.

파이썬 2.6과 pyGtk를 사용하면 gtk_status_icon 을 사용하여 이것을 편리하게 깨달았습니다 . 나는 다양한 우분투 버전을 포함하여 가능한 한 많은 배포판에서 실행되도록 응용 프로그램을 작성했습니다. 사용자가 설치 한 후에 만 ​​가능한 종속성을 사용하도록주의를 기울였습니다.

그러나 이제는 미래의 Ubuntu 릴리스에서 gtk_status_icon이 더 이상 지원되지 않을 것이라고 들었습니다. 개발자는 대신 응용 프로그램 표시기를 사용해야합니다. 그렇다면 다음을 확인하는 것이 가장 좋습니다.

  1. 응용 프로그램의 로컬 아이콘이 올바르게 표시됩니다
  2. 응용 프로그램은 계속 실행되어 향후 Ubuntu 릴리스에서 아이콘을 표시합니다.
  3. 이 응용 프로그램은 것 또한 실행하고 다른 환경에서의 아이콘이 표시 표시기 애플릿 , libappindicator파이썬 - appindicator 제공되지 않습니다.

indicator-applet 이 실행되고 있지 않으면 gtk_status_icon에 대한 Application Indicator 폴백 메커니즘이 작동 하지 않습니다. 가져올 appindicator 모듈 이 없으면 Python 인터프리터가 실행되지 않습니다 . 다른 배포판을 위해 다른 버전을 개발해야합니까? 그렇지 않으면 더 나은 방법이 있습니다.

Ubuntu Wiki에 제공된 예제 이외의 ApplicationIndicator 사용 방법에 대한 설명서는 어디서 찾을 수 있습니까 ? 우분투와 비 우분투 배포판에 대해 서로 다른 소스 코드를 프로그래밍하지 않도록 표시기 애플릿이 실행 중인지 확인하기 위해 어떤 명령이 제공됩니까?

답변:


16

나는 여기에 실제로 파이썬-파이 디 네이터 라이브러리에 대한 더 많은 결정이 필요하다고 생각합니다. 존재하는 경우 필요한 모든 대체 사례를 지원합니다. XFCE, KDE 및 이전 그놈을 적절하게 처리합니다. 이 답변에서 수행하는 방법에 대한 좋은 예입니다 .

appindicator 라이브러리는 DBus를 사용하여 응용 프로그램 표시기 렌더링 프로세스가 사용 가능한지 확인합니다. Unity의 경우 또는 indicator-applet이 실행중인 경우입니다. 사용 가능한 경우 해당 메뉴를 사용하고 그렇지 않은 경우 동일한 메뉴에서 GtkStatusIcon을 사용하는 것으로 대체됩니다.

불행히도 라이브러리를 사용할 수없는 경우를 처리하려면 두 코드 경로를 모두 유지해야한다고 생각합니다. 그러나 다른 배포판에서 라이브러리를 얻는 데 도움을 드리겠습니다. :)


이 명확한 답변에 감사드립니다. 이것은 11.04에서 앱을 실행하려면 가야 할 경로를 가리 킵니다. GtkStatusIcon에 대한 작업 경로가 있지만 indicator-applet에 대한 모든 것을 다시 개발해야합니다. 버그 # 668375에 대한 귀하의 의견을 이해했다면 전체 아이콘 테마를 만들지 않고도 로컬 아이콘을 사용할 수 있습니까?
Takkat

AppIndicator 프로그래밍에 뛰어들 시간이 있었기 때문에 jgoguen의 제안을 사용하여 appindicator 모듈을 확인하는 것이 실제로 도움이되지 않는다는 것을 알았습니다. 맞춤형 아이콘은 10.04 LTS에서 렌더링되지 않기 때문입니다. 버그 # 668375에 대한 내 의견을 참조하십시오.
Takkat

내 대답 에는이 문제를 해결하는 매우 쉬운 방법이 포함되어 있습니다. 내 응용 프로그램에서 매우 잘 작동했으며 AppIndicators를 사용하는 응용 프로그램을 Windows로 이식하는 데 어려움이 없었습니다!
Nathan Osman

10

StackApplet 에서 잘 작동하는 훌륭한 솔루션을 가지고 있습니다. 실제 모듈이 존재하지 않을 때 내부적으로 사용하여 동일한 기능을 제공 하는 기능적으로 동등한 버전의 appindicator모듈을 만들었습니다 gtk.StatusIcon.

그것을 사용하는 것은 간단합니다 :

  1. 다음 파일을 다운로드하여 호출appindicator_replacement.py
  2. 응용 프로그램에 다음을 추가하십시오.

    try:
        import appindicator
    except ImportError:
        import appindicator_replacement as appindicator

그게 다야! 이제 응용 프로그램이 AppIndicators를 지원하거나 지원하지 않고 완벽하게 실행됩니다. 다른 플랫폼 특정 코드가 없다고 가정하면 Windows에서도 실행됩니다.


참고 : 파일은 MIT 라이센스에 따라 릴리스되므로 거의 모든 용도로 사용할 수 있습니다.


9

두 가지 모두에 대한 코드를 작성해야합니다. 다음과 비슷한 것을 사용하여 Python 코드에 appindicator가 있는지 감지 할 수 있습니다.

have_appindicator = True
try:
    import appindicator
except:
    have_appindicator = False

거기에서 have_appindicator를 사용하여 appindicator 코드 또는 gtk_status_icon 코드를 사용해야하는지 여부를 결정하십시오.

불행히도 이것은 우분투와 테스트 할 다른 환경이 모두 필요하다는 것을 의미합니다.


1
여전히 python-appindicator 가 설치되었지만 표시기 애플릿 이 실행되지 않는 환경이있을 수 있습니다 . 응용 프로그램도이를 처리해야합니다.
Takkat

이 경우 wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators > 사용자 정의 폴백을 참조하십시오 . 기본적으로 표시기 애플릿이 없으면 응용 프로그램 표시기에 대한 gtk.StatusIcon이 표시됩니다.
htorque

대체 옵션을 알고 있습니다. 내가 이해하지 못하는 것은 indicator-applet이 실행되고 있지 않다면 indicator-applet이 어떻게 폴백을 제공 할 수 있습니까?
Takkat

단순히 표시기 애플릿을 확인하고 뒤에서 gtk_status_icon 기능을 제공한다고 생각합니다.
jgoguen

1
@jgoguen : "it"은 무엇입니까? 11.04부터 Ubuntu / Unity는 더 이상 gtk_status_icon을 지원 하지 않습니다 . 다른 배포판에는 "it"이 없을 수 있습니다. 나는 정말로 이것에 대해 걱정하고있다.
Takkat

3
for line in os.popen("ps xa"): 
fields = line.split() 
pid = fields[0] 
process = fields[4]

applet_is_running = ( process.find('indicator-applet') > 0 )

이 방법으로 표시기 애플릿이 실행 중인지 감지 할 수 있습니다. 우분투 11.04에 대해서는 걱정할 필요가 없습니다. indicator-applet은 기본적으로 실행되는 필수 구성 요소이므로 대체 시나리오가 없습니다.


indicator-applet의 PID를 얻는 것을 지적 해 주셔서 감사합니다 (pidof를 사용하여 다른 가능한 종속성을 위해 이미이 작업을 수행함). 내가 알 수있는 한 표시기 애플릿은 하드웨어 요구 사항이 충족되는 경우에만 안정적으로 통일되어 실행됩니다. 사용자는 2D 그놈으로 부팅 할 수 있으며 표시기 애플릿을 실행하지 않기로 결정할 수 있습니다. 그러나 이것은 내 문제가 아닐 수도 있습니다.
Takkat

나는 그것이 우아하지 않을 수도 있지만 (당신이 원하는 모든 화장품을 추가 할 수 있습니다 : D) 당신에게 동의하지만 작동해야합니다. 개인적으로 나는 잘 작동하는 솔루션을 선호하고 우아함은 두 번째입니다 :)
OpenNingia

이 작업이 14.04 시스템에서 실행되고 있지 않은 것 같습니다. 접근 방식이 대체 되었습니까? /usr/lib/x86_64-linux-gnu/indicator-messages/indicator-messages-service대신 많은 작업이 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.