Введення довільного gtk.Widget в додаток. Індикатор


18

Поміщення будь-якого gtk.Widget всередині gtk.Menu працює, дещо, додавши спочатку порожній gtk.MenuItem. Це не здається надійним - але в основному це працює. З програмою appindicator.Indicator це не працює. Запис залишається порожнім. Навіть якщо ви встановите, наприклад, дитину [border_size] на 32.

Єдиний віджет, який працює - це gtk.Label (плюс, звичайно, MenuItem, ImageMenuItem тощо).

Тепер у меню Меню є 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()

Як нагадав мені @MarcoCeppi, так - це не повинно працювати. Я просто сподіваюся і мрію, можливо, це може. Оскільки Меню "Мене" робить щось, схоже, схоже.
Стефано Палацо

1
Я майже впевнений, що в меню «Меню» використовується лібідо (об’єкти відображення індикаторів) для цього. Див: launchpad.net/ido Зокрема, idoentrymenuitem.c ( bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate / ... ). На жаль, я не думаю, що є прив'язки пітона. Ви можете запитати у списку електронної пошти ayatana-dev.
andrewsomething

Ви дізналися, як це зробити? Я зіткнувся з тією ж проблемою. Спасибі.
Бенджамін

Відповіді:


7

Підтримка меню Індикатор додатків заснована на меню D-Bus, які обмежені в тому, що вони підтримують - вони підтримують лише основні функції меню, а не більш екзотичні речі, такі як довільні віджети.

Одним із важливих перешкод, що їх коли-небудь підтримують, є той факт, що меню індикатора додатків надається іншим процесом, процесом індикатора додатків, тому ваша програма не має доступу безпосередньо нічого на ній намалювати. Для подолання цього потрібно або підтримати щось на зразок X-Embed в меню D-Bus, або дозволити всім GTK працювати над D-Bus.


2

Звуковий індикатор Ubuntu має повзунки для гучності, і я задумався, як це можливо. Після перегляду коду, здається, є GtkMenus, який можна заповнити через dbus тим часом: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

Але я не знаю, як ними користуватися. Хотіла написати звуковий індикатор, де я можу контролювати гучність на додаток так, як це може зробити pavucontrol.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.