Menempatkan gtk yang sewenang-wenang. Letakkan di appindicator.Indicator

18

Menempatkan gtk. Letakkan di dalam gtk.Menu berfungsi, agaknya, dengan meletakkan gtk.MenuItem kosong terlebih dahulu. Tampaknya tidak dapat diandalkan - tetapi pada dasarnya berfungsi. Dengan appindicator.Indicator, itu tidak berfungsi. Entri tetap kosong. Bahkan jika Anda mengatur anak [border_size] ke 32, misalnya.

Satu-satunya widget yang berfungsi adalah gtk.Label (plus MenuItem, ImageMenuItem dan sebagainya tentu saja).

Sekarang Menu Me punya gtk. Masukkan di dalamnya, jadi pasti harus melakukan ini dengan benar. Bagaimana saya melakukannya?

Berikut beberapa contoh kode untuk menjelaskan tentang apa yang saya maksud:

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

Kode di atas berfungsi, namun ini tidak:

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

Di mana self.menu adalah appindicator.Indicator, jika itu adalah gtk.Menu, Entri akan setidaknya ditampilkan.

Ini beberapa kode yang berfungsi:

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()
Stefano Palazzo
sumber
Seperti @MarcoCeppi mengingatkan saya, ya - ini tidak seharusnya bekerja. Saya hanya berharap dan bermimpi, mungkin bisa. Karena Me Menu melakukan sesuatu yang mirip.
Stefano Palazzo
1
Saya cukup yakin bahwa Me Menu menggunakan libido (Indicator Display Objects) untuk melakukan itu. Lihat: launchpad.net/ido Secara khusus, idoentrymenuitem.c ( bazaar.launchpad.net/~canonical-dx-team/ido/trunk/annotate/… ). Sayangnya, saya tidak berpikir ada binding python. Anda mungkin ingin bertanya pada daftar email ayatana-dev.
andrewsomething
Apakah Anda mengetahui cara melakukan ini? Saya menghadapi masalah yang sama. Terima kasih.
Benjamin

Jawaban:

7

Dukungan menu Application Indicator didasarkan pada menu D-Bus, yang terbatas pada apa yang mereka dukung - mereka hanya mendukung fungsionalitas menu dasar, bukan hal-hal yang lebih eksotis seperti widget sewenang-wenang.

Satu hambatan besar bagi mereka yang pernah mendukung hal-hal semacam itu adalah kenyataan bahwa menu indikator aplikasi diberikan oleh proses yang berbeda, proses indikator aplikasi, sehingga program Anda tidak memiliki akses untuk secara langsung menggambar apa pun di atasnya. Untuk mengatasinya, diperlukan sesuatu yang mendukung seperti X-Embed di menu D-Bus atau memungkinkan semua GTK bekerja di D-Bus.

Michael Ekstrand
sumber
2

Indikator suara di Ubuntu memiliki slider untuk volume dan saya bertanya-tanya bagaimana itu mungkin. Setelah melihat kode itu, sepertinya ada GtkMenus yang dapat diisi melalui dbus sementara itu: https://developer.ubuntu.com/api/devel/ubuntu-12.04/c/dbusmenugtk/index.html

Tapi saya tidak tahu bagaimana menggunakannya. Ingin menulis indikator suara di mana saya dapat mengontrol volume per-aplikasi seperti halnya pavucontrol dapat melakukannya.

c_korn
sumber