I've created an indicator that I think should work, but doesn't. I've added the UI interface from a glade file, loaded it and added the menu to appindicator. The following is the entire source code beginning with the XML. Is there any reason why this shouldn't work?
#!/usr/bin/env python
#coding: utf-8
import gtk
import sys
import appindicator
MENU_DEFINITION = """
<?xml version="1.0" encoding="UTF-8"?>
<interface> <requires lib="gtk+" version="2.24"/> <!-- interface-naming-policy project-wide --> <object> <property name="visible">True</property> <property name="can_focus">False</property> <child> <object> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_action_appearance">False</property> <property name="label" translatable="yes">Show dialog</property> <property name="use_underline">True</property> <signal name="toggled" handler="on_show_dialog_toggled" swapped="no"/> </object> </child> <child> <object> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_action_appearance">False</property> <property name="label" translatable="yes">New events</property> <property name="use_underline">True</property> <signal name="activate-item" handler="on_new_events_activate_item" swapped="no"/> <signal name="activate" handler="on_new_events_activate" swapped="no"/> </object> </child> <child> <object> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_action_appearance">False</property> <property name="label" translatable="yes">Exit indicator</property> <property name="use_underline">True</property> <signal name="activate-item" handler="on_exit_indicator_activate_item" swapped="no"/> <signal name="activate" handler="on_exit_indicator_activate" swapped="no"/> </object> </child> </object>
</interface>
"""
class JesTestMenu: def __init__(self): ui = gtk.Builder() ui.add_from_string(MENU_DEFINITION) ui.connect_signals(self) menu = ui.get_object("jes_test_menu") ind = appindicator.Indicator("jes_test_menu", "indicator-messages", appindicator.CATEGORY_APPLICATION_STATUS) ind.set_status(appindicator.STATUS_ACTIVE) ind.set_attention_icon("new-messages-green") ind.set_menu(menu) menu.show_all() print("Indicator should now be visible") def on_exit_indicator_activate_item(self, widget, data=None): print("Exit activate item") sys.exit() def on_exit_indicator_activate(self, widget, data=None): print("Exit activate") sys.exit() def on_new_events_activate_item(self, widget, data=None): pass def on_new_events_activate(self, widget, data=None): pass def on_show_dialog_toggled(self, widget, data=None): pass
if __name__ == "__main__": menu = JesTestMenu() gtk.main() 1 Answer
The problem is that your Indicator object (ind) is not a class variable, it's scope is only in the __init__ function. This means it is being destroyed by Python's garbage collection once your class finishes initation. To fix this, replace ind with self.ind:
self.ind = appindicator.Indicator("jes_test_menu", "indicator-messages", appindicator.CATEGORY_APPLICATION_STATUS)
self.ind.set_status(appindicator.STATUS_ACTIVE)
self.ind.set_attention_icon("new-messages-green")
self.ind.set_menu(menu) 3