Menggunakan Gtk.Widgets dalam Indikator Aplikasi dengan Python

44

Pada tahun 2010 Stefano Palazzo, mengajukan pertanyaan terkait, Menempatkan gtk yang sewenang-wenang. Letakkan di appindicator.Indicator , dan yang serupa ditanyakan di StackOverflow . Dalam kedua kasus konsensusnya adalah Indikator Aplikasi Ubuntu terbatas. Seperti yang dikatakan Michael Ekstrand:

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.

Namun, itu bertentangan dengan apa yang kita lihat pada indikator Bluetooth hari ini, pada 2016: menggunakan toggle switches.

masukkan deskripsi gambar di sini

Hal yang sama dapat diamati dengan indikator Ubuntu One dari 13.04:

masukkan deskripsi gambar di sini

Jadi jelas ada jalan. Saya telah mempelajari kode sumber indikator-bluetooth, tetapi ditulis dalam Vala. Saya, bagaimanapun, bekerja terutama dalam python, dan belajar Vala hanya untuk menulis ulang semua indikator saya yang sudah ada adalah pekerjaan yang terlalu banyak.

Jadi inti dari pertanyaan: Bagaimana kita bisa menggunakan Gtk.Widgets, atau paling tidak sebuah toggle switch seperti pada indikator Bluetooth, menggunakan Python?

CATATAN : Saya bersedia memberikan karunia pada pertanyaan ini untuk menghargai jawaban yang akan memberikan contoh kerja dengan python . Bahasa lain tidak diterima.

Sergiy Kolodyazhnyy
sumber
6
Indikator aplikasi terbatas bahkan tidak mendukung ikon on the fly (hanya memuat file gambar dari filesystem). Indikator yang telah Anda sebutkan adalah indikator SISTEM (bluetooth, ubuntu satu, suara, daya, ...). Mereka berbeda dan mereka tidak menggunakan libappindicator. Saya telah memposting beberapa posting yang dapat membantu memperjelas perbedaannya. Saya sudah mendapat indikator sistem yang bekerja menggunakan C. tetapi dengan python saya masih berjuang.
user.dz
2
Apakah ada cara untuk menarik perhatian para pengembang inti Ubuntu untuk pertanyaan ini?
don.joey
1
Setidaknya test = Gtk.CheckMenuItem("Monkey")berfungsi menambahkan kotak centang, tetapi harus ada lebih banyak. Sementara yang satu karya, satu ini harus bekerja, tapi tidak: Gtk.CheckMenuItemToggled("Monkey"). Saya cukup yakin itu bisa berhasil. Lihat: developer.gnome.org/gtk3/stable/GtkCheckMenuItem.html
Jacob Vlijm
1
@JacobVlijm ya, menambahkan menuitem tunggal berfungsi, itu juga berfungsi untuk menambahkan Gtk.Box dan menambahkan Gtk.Label ke kotak itu, tetapi tidak ada yang lain (katanya widget hanya dapat berisi satu item.
Sergiy Kolodyazhnyy
1
Gtk.ImageMenuItemsudah ditinggalkan dan tidak disarankan untuk menggunakan btw: developer.gnome.org/gtkmm/stable/deprecated.html
Jacob Vlijm

Jawaban:

1

Masalah ini ada karena AppIndicators membuatnya mudah untuk membuat menu indikator, mereka menghalangi pembuatannya. Mari kita lihat perbedaan antara contoh kode python menggunakan AppIndicator dan satu menggunakan GLib Menu seperti cara kode Bluetooth.

Pertama Anda diperintahkan untuk membuat gtk.Menu, ini adalah objek menu Gtk gaya lama yang menggunakan Gtk.Actionyang sekarang sudah usang. AppIndicator mengambil gtk.Menuobjek dari Anda selama set_menu(...)proses dan mem- parsingnya , mendorong setiap menu yang ditemukannya ke layanan indikator yang dibuat menggunakan libdbusmenu. Proses penguraian ini berarti bahwa apa pun yang tidak didukung oleh AppIndicator disaring, apa pun yang Anda lakukan.

Selanjutnya mari kita lihat menu Bluetooth. Itu dibuat menggunakan Gio.Menuobjek, ini adalah menu Gnome gaya baru menggunakan GActionsistem. Ini kemudian mendaftarkan layanannya sendiri tanpa menggunakan AppIndicatoratau libdbusmenudan mengaturnya menggunakan x-canonical-typeproperti khusus untuk membuat widget pengalih yang diteruskan ke libidountuk penguraian.

Seluruh latihan ini sangat buruk, karena itu semua penyesuaian Kesatuan Canonical sendiri. Jadi, begitu persatuan berjalan, tidak ada appatorator lagi pula.

Martin Owens -doctormo-
sumber