Vraag Hoe schrijf ik een Unity-systeemindicator in Python?


Achtergrond:

C Oorspronkelijke code: (werkt prima)

  • Ik krijg er al een in C-taal, zie mijn andere vraag:

    Hoe een systeemindicator voor eenheid te ontwikkelen?

    Echter, indicator-sysmonitor is al in Python ontwikkeld als vele andere toepassingsindicatoren. Ik hou niet van het idee dat ontwikkelaars hun projecten moeten overbrengen naar C of een Python-C-proxy moeten schrijven als ze de indicator willen weergeven in greeter / lock / ubiquity-schermen. In plaats daarvan is het maken van indicator-sysmonitor een systeemindicator rechtstreeks van python de beste oplossing (geen tijdelijke oplossingen, en het zal een generieke oplossing zijn voor alle python-projecten die momenteel gebruikmaken van de app-indicator).

Python-code: (mijn mislukte proef om c-code naar python te poorten)

  • Ik heb moeite om het naar Python te porteren. Hier is mijn huidige code die niet werkt. Het maakt DBus-object voor zowel Menu & Acties. Het wordt vermeld in de plug-in voor XFCE-indicators. Maar niet getoond op het paneel.

    /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']
    

Vraag:

Ik verwacht de reden waarom ik de menustructuur of de meta niet heb gemaakt (zoals pseudo-items _header) zoals ze zich in de oorspronkelijke C-code bevinden.

Kan iemand een werkende haven van maken deze systeemindicatorcode in C naar Python?


75
2018-06-14 11:21


oorsprong


Kun je je vraag specifieker maken? 'Help me het te repareren', met veel code, zet me dat soort dingen af. Weet jij waar het fout gaat? We weten niet zeker of we kunnen helpen zonder een specifieke traceback, bijvoorbeeld. - don.joey
@ElderGeek, mijn voornaamste reden is indicator-sysmonitor die al in Python is ontwikkeld als vele andere toepassingsindicatoren. Ik hou niet van het idee dat ontwikkelaars hun projecten moeten overbrengen naar C of een Python-C-proxy moeten schrijven als ze de indicator willen weergeven in greeter / lock / ubiquity-schermen. In plaats daarvan maken indicator-sysmonitor maakt een systeemindicator rechtstreeks van python de beste oplossing (geen tijdelijke oplossingen en een generieke oplossing voor alle pythonprojecten die momenteel gebruikmaken van de app-indicator). - user.dz
Dus eigenlijk wil je dat ons om een ​​werkende poort van je C-code in Python te maken ... en je wilt het niet zelf proberen te porteren? Ik weet niet zeker of dat hier ooit zal worden beantwoord, omdat je in principe een zeer gespecialiseerde Python-programmeur wilt inhuren om een ​​zeer gespecialiseerd stuk software / code voor je indicatoren te schrijven. Systeemindicatoren zijn compleet verschillende beesten van toepassingsindicatoren. - Thomas Ward♦
Deze vraag is heel specifiek voor Ubuntu en ontwikkeling op Ubuntu. Dit zijn geen gemiddelde 'Hello World'-dingen, en vereist zowel kennis van hoe Ubuntu is georganiseerd als programmering met gebruik van specifieke API's. Opmerkingen over dat dit beter is voor SO zijn niet nuttig - Sergiy Kolodyazhnyy
Omdat Ubuntu weggaat van Unity, is deze vraag dan zelfs nog relevanter? - beruic


antwoorden: