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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy