Pertanyaan Bagaimana cara saya menulis indikator sistem Unity dengan Python?


Latar Belakang:

Kode Awal C: (bekerja dengan baik)

  • Saya sudah mendapatkan satu yang bekerja dalam bahasa C, lihat pertanyaan saya yang lain:

    Bagaimana cara mengembangkan Indikator Sistem untuk Kesatuan?

    Namun, indicator-sysmonitor sudah dikembangkan dengan Python karena banyak indikator aplikasi lainnya. Saya tidak suka ide bahwa pengembang berkewajiban untuk mem-port proyek mereka ke C atau menulis proxy Python-C jika mereka ingin menunjukkan indikator di layar penyambut / kunci / ubiquity. Sebaliknya, membuat indikator-sysmonitor membuat indikator sistem langsung dari python akan menjadi solusi terbaik (tidak ada solusi, dan ini akan menjadi solusi umum untuk semua proyek python yang saat ini menggunakan appindicator).

Kode Python: (Percobaan gagal saya ke kode port c ke python)

  • Saya berjuang untuk mem-port-nya menjadi Python. Berikut adalah kode saya saat ini yang tidak berfungsi. Itu membuat objek DBus untuk kedua Menu & Tindakan. Ini tercantum dalam plugin indikator XFCE. Namun tidak ditampilkan di panel.

    /usr/lib/indicator-test/indicator-test-service

    #!/usr/bin/python2
    
    import os
    import sys
    
    import gi
    from gi.repository import Gio, GLib
    
    APPLICATION_ID = 'local.sneetsher.indicator.test'
    DBUS_MENU_PATH = '/local/sneetsher/indicator/test/desktop'
    DBUS_ACTION_PATH = '/local/sneetsher/indicator/test'
    
    def callback():
        print ok
    
    def quit_callback(notification, loop):
        global connection
        global exported_action_group_id
        global exported_menu_model_id
    
        connection.unexport_action_group (exported_action_group_id)
        connection.unexport_menu_model (exported_menu_model_id)
    
        loop.quit()
    
    def cancel (notification, action, data):
        if action == "cancel":
            print "Cancel"
        else:
            print "That should not have happened (cancel)!"
    
    def bus_acquired(bus, name):
        # menu
        submenu = Gio.Menu()
        submenu.append("Show", "show")
        item = Gio.MenuItem.new(None, "_header")
        item.set_attribute([("x-canonical-type","s","com.canonical.indicator.root")])
        item.set_submenu(submenu)
        menu = Gio.Menu()
        menu.append_item (item)
    
        actions = Gio.SimpleActionGroup.new()
        action1 = Gio.SimpleAction.new("_header", None)
        actions.insert(action1)
        action2 = Gio.SimpleAction.new('show', None)
        actions.insert(action2)
        action2.connect("activate",callback)
    
        global connection
        connection = bus
    
        global exported_action_group_id
        exported_action_group_id = connection.export_action_group(DBUS_ACTION_PATH, actions)
    
        global exported_menu_model_id
        exported_menu_model_id = connection.export_menu_model(DBUS_MENU_PATH, menu)
    
    def setup ():
        #bus connection
        Gio.bus_own_name(Gio.BusType.SESSION, APPLICATION_ID, 0, bus_acquired, None, None)
    
    if __name__ == '__main__':
    
        connection = None
        exported_menu_model_id = 0
        exported_action_group_id = 0
        password = ""
    
        loop = GLib.MainLoop()
        setup ()
    
        loop.run()
    

    local.sneetsher.indicator.test

    [Indicator Service]
    Name=indicator-test
    ObjectPath=/local/sneetsher/indicator/test
    
    [desktop]
    ObjectPath=/local/sneetsher/indicator/test/desktop
    
    [desktop_greeter]
    ObjectPath=/local/sneetsher/indicator/test/desktop
    
    [desktop_lockscreen]
    ObjectPath=/local/sneetsher/indicator/test/desktop
    

    local.sneetsher.indicator.test.service

    [D-BUS Service]
    Name=local.sneetsher.indicator.test
    Exec=/usr/lib/indicator-test/indicator-test-service
    

    90_unity-greeter.gschema.override

    [com.canonical.unity-greeter]
    indicators=['ug-accessibility', 'com.canonical.indicator.keyboard', 'com.canonical.indicator.session', 'com.canonical.indicator.datetime', 'com.canonical.indicator.power', 'com.canonical.indicator.sound', 'local.sneetsher.indicator.test', 'application']
    

Pertanyaan:

Saya berharap alasannya mengapa, saya tidak membuat struktur menu atau meta (item semu seperti _header) karena mereka berada di kode C asli.

Adakah yang bisa membuat port kerja kode indikator sistem ini di C ke Python?


75
2018-06-14 11:21


asal


Bisakah Anda membuat pertanyaan Anda lebih spesifik? 'Bantu saya memperbaikinya' dengan banyak kode semacam mengatur saya. Apakah Anda tahu di mana itu salah? Tidak yakin kami dapat membantu tanpa pelacakan tertentu, misalnya. - don.joey
@ElderGeek, alasan utamaku adalah indicator-sysmonitor yang sudah dikembangkan dengan Python karena banyak indikator aplikasi lainnya. Saya tidak suka ide bahwa pengembang berkewajiban untuk mem-port proyek mereka ke C atau menulis proxy Python-C jika mereka ingin menunjukkan indikator di layar penyambut / kunci / ubiquity. Sebaliknya, membuat indicator-sysmonitor menciptakan indikator sistem langsung dari python akan menjadi solusi terbaik (tidak ada solusi, dan solusi umum untuk semua proyek python yang saat ini menggunakan appindicator). - user.dz
Jadi, pada dasarnya, Anda mau kami untuk membuat port kerja kode C Anda menjadi Python ... dan Anda tidak ingin mencoba memportnya sendiri? Tidak yakin apakah itu akan dijawab di sini, karena pada dasarnya Anda ingin menyewa programmer Python yang sangat khusus untuk menulis perangkat lunak / kode yang sangat khusus untuk indikator Anda. Indikator Sistem adalah binatang yang benar-benar berbeda dari indikator aplikasi. - Thomas Ward♦
Pertanyaan ini sangat spesifik untuk Ubuntu dan pengembangan di Ubuntu. Ini bukan hal-hal 'halo' biasa, dan membutuhkan pengetahuan tentang bagaimana Ubuntu diatur dan diprogram dengan penggunaan API tertentu. Komentar tentang ini menjadi lebih baik untuk SO tidak membantu - Sergiy Kolodyazhnyy
Karena Ubuntu akan menjauh dari Unity, apakah pertanyaan ini menjadi relevan lagi? - beruic


Jawaban: