임의의 gtk.Widget을 appindicator.Indicator에 넣기

임의의 gtk.Widget을 appindicator.Indicator에 넣기

gtk.Menu 안에 gtk.Widget을 넣는 것은 어느 정도 빈 gtk.MenuItem을 먼저 넣는 방식으로 작동합니다. 신뢰할 수 있는 것 같지는 않지만 기본적으로는 작동합니다. appindicator.Indicator를 사용하면 작동하지 않습니다. 항목이 비어 있습니다. 예를 들어 child[border_size]를 32로 설정하더라도 마찬가지입니다.

작동하는 유일한 위젯은 gtk.Label(물론 MenuItem, ImageMenuItem 등 포함)입니다.

이제 Me 메뉴에는 gtk.Entry가 있으므로 이 작업을 올바르게 수행하는 것이 확실히 가능해야 합니다. 어떻게 해야 하나요?

다음은 내가 하는 일을 설명하는 몇 가지 예제 코드입니다.

    self.item = gtk.MenuItem()
    self.item.add(gtk.Label("hello world!"))
    self.menu.append(self.item)

위의 코드는 작동하지만 다음과 같이 작동하지 않습니다.

    self.item = gtk.MenuItem()
    self.item.add(gtk.Entry())
    self.menu.append(self.item)

self.menu가 appindicator.Indicator인 경우 gtk.Menu라면 항목이 최소한 표시됩니다.

다음은 몇 가지 작동 코드입니다.

import gtk
import appindicator

class AppIndicator (object):

    def __init__(self):
        self.ind = appindicator.Indicator("hello world client",
            "distributor-logo", appindicator.CATEGORY_APPLICATION_STATUS)
        self.ind.set_status (appindicator.STATUS_ACTIVE)
        self.menu = gtk.Menu()
        item = gtk.MenuItem()

        item.add(gtk.Label("hello world"))
        # item.add(gtk.Entry())

        self.menu.append(item)
        self.menu.show_all()
        self.ind.set_menu(self.menu)


indicator = AppIndicator()
gtk.main()

답변1

Application Indicator 메뉴 지원은 D-Bus 메뉴를 기반으로 하며 지원 내용이 제한되어 있습니다. 기본 메뉴 기능만 지원하고 임의 위젯과 같은 특이한 기능은 지원하지 않습니다.

이러한 기능을 지원하는 데 있어 중요한 장애물 중 하나는 응용 프로그램 표시기 메뉴가 다른 프로세스, 즉 응용 프로그램 표시기 프로세스에 의해 렌더링되므로 프로그램이 직접 아무것도 그릴 수 없다는 사실입니다. 이 문제를 극복하려면 D-Bus 메뉴에서 X-Embed와 같은 기능을 지원하거나 모든 GTK가 D-Bus에서 작동하도록 허용해야 합니다.

답변2

Ubuntu의 사운드 표시기에는 볼륨 슬라이더가 있는데 이것이 어떻게 가능한지 궁금했습니다. 코드를 살펴보면 dbus를 통해 채울 수 있는 GtkMenus가 있는 것 같습니다: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

하지만 어떻게 사용하는지 모르겠습니다. pavucontrol처럼 앱별로 볼륨을 제어할 수 있는 사운드 표시기를 작성하고 싶었습니다.

관련 정보