Индикатор не работает на Ubuntu 16.04

Я написал простой индикаторный апплет для Ubuntu на python с gi.repository, который я успешно запускал на своей Ubuntu 14.04 в течение долгого времени без каких-либо проблем. После того, как я обновился до Ubuntu 16.04, я начал наблюдать странное поведение. Я снова попробовал это в Ubuntu 14.04, просто чтобы быть уверенным, и он работает нормально, но в Ubuntu 16.04 мои события меню не запускаются, и приложение иногда не отвечает, когда я пытаюсь изменить значок.

Некоторый базовый индикатор кода, который работает в Ubuntu 14.04, но не работает в Ubuntu 16.04.

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk as gtk
gi.require_version('AppIndicator3', '0.1')
from gi.repository import AppIndicator3 as appindicator

def main():
    indicator = appindicator.Indicator.new(
        'mytestindicator',
        gtk.STOCK_INFO,
        appindicator.IndicatorCategory.SYSTEM_SERVICES
    )
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    indicator.set_menu(build_menu())
    gtk.main()

def quit(source):
    gtk.main_quit()

def build_menu():
    menu = gtk.Menu()
    item_quit = gtk.MenuItem('Quit')
    item_quit.connect('activate', quit)
    menu.append(item_quit)
    menu.show_all()
    return menu

if __name__ == '__main__':
    main()

Итак, мой вопрос: что изменилось между Ubuntu 14.04 и 16.04 и как я могу создать надежный индикаторный апплет, который будет работать без сбоев в обеих системах?

Однако я заметил одну вещь: в Ubuntu 14 у меня есть gi.repository версии 3.12.0, а в Ubuntu 16 — 3.20.0, но не уверен, что это имеет значение.


person logileifs    schedule 25.10.2017    source источник
comment
Что за странное поведение?   -  person Barmar    schedule 26.10.2017
comment
События меню не запускаются, и приложение иногда не отвечает, когда я пытаюсь изменить значок   -  person logileifs    schedule 26.10.2017
comment
Простое нажатие пункта меню «Выход» в коде, который я разместил выше, не дает никакого эффекта. Большую часть времени он действительно работает, но примерно в 25% случаев, когда я запускаю приложение, индикатор и его меню просто совершенно не отвечают.   -  person logileifs    schedule 26.10.2017
comment
Поместите это объяснение в вопрос, а не в комментарий.   -  person Barmar    schedule 26.10.2017
comment
@Barmar На самом деле это вопрос   -  person logileifs    schedule 26.10.2017
comment
Он хорошо работает на Mint 18. Эта проблема регулярно возникает в Ubuntu 16.04: «Моя программа Gtk работает неправильно». Возможно, вам придется переключиться на другой оконный менеджер / дистрибутив.   -  person theGtknerd    schedule 26.10.2017
comment
@theGtknerd у вас есть какие-нибудь ссылки или ссылки, где я могу прочитать о таких проблемах? Если кто-то может указать мне что-то, что могло бы помочь, я был бы очень благодарен   -  person logileifs    schedule 26.10.2017
comment
google.com/   -  person theGtknerd    schedule 26.10.2017
comment
google.com/   -  person theGtknerd    schedule 26.10.2017
comment
@theGtknerd Итак, gtk3 не работает в Ubuntu 16, это приятно знать. Вы случайно не знаете, как я могу создать индикатор панели без него? с gtk2 возможно?   -  person logileifs    schedule 26.10.2017
comment
Давайте продолжим обсуждение в чате.   -  person theGtknerd    schedule 26.10.2017


Ответы (1)


Как мы уже обсуждали:

#!/usr/bin/env python

import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Notify', '0.7')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, GdkPixbuf, Gdk, Gio, GLib, AppIndicator3, Notify
import os, sys

APPINDICATOR_ID = 'Resource phone logger'

class GUI:
    def __init__(self, menu):

        menuitem_quit = Gtk.MenuItem('Quit')
        menuitem_quit.connect('activate', Gtk.main_quit)
        menu.append(menuitem_quit)
        menu.show_all()
        menu.connect('button-release-event', self.menu_button_release_event)


    def menu_button_release_event (self, menu, event):
        #code to only show left click
        if event.button == 3:
            menu.show()
        else:
            print ("show")
            menu.hide()

def main():
    Notify.init(APPINDICATOR_ID)
    image = os.path.abspath('posting.svg')
    indicator = AppIndicator3.Indicator.new(APPINDICATOR_ID, image, AppIndicator3.IndicatorCategory.APPLICATION_STATUS)
    indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)  
    menu = Gtk.Menu()
    indicator.set_menu(menu)
    app = GUI(menu)
    Gtk.main()
    Notify.uninit()

if __name__ == "__main__":
    sys.exit(main())
person theGtknerd    schedule 26.10.2017