#1 Le 25/06/2014, à 09:27
- Gaara
Python et Appindicator, module pour iconifier une application
Bonjour à tous,
J'essaie d'utiliser Appindicator pour ajouter un icone sur la barre des tâche d'Ubuntu, pour que mon logiciel soit invisible à la demande de l'utilisateur.
Je comprend à peu près le fonctionnement, la fonction quitApplication fonctionne bien.
Mais lorsque j'appelle self.fenetre (la fenêtre principale), le self n'est pas reconnu.
Comment puis-je faire pour restaurer la fenêtre qui est cachée par l'usage de self.fenetre.hide() ?
Voici un bout de mon code: (j'ai aussi posé la question sur StackOverflow, sans bcp de succès )
import gtk
import appindicator
[...]
def __init__(self):
self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
[...]
def hide_window(fenetre):
self.fenetre.hide()
self.bouton1.connect("clicked", hide_window)
self.boite3.pack_start(self.bouton1, True, True, 0)
self.bouton1.show()
self.fenetre.show()
self.fenetre.show_all()
def callback(self, fenetre):
self.fenetre.show() # here is the problem, self is not working
while gtk.events_pending():
gtk.main_iteration()
def quitApplication(a, buf):
gtk.main_quit() # this is working well
exit()
if __name__ == "__main__":
ind = appindicator.Indicator ("example-simple-client", "indicator-messages", appindicator.CATEGORY_APPLICATION_STATUS)
ind.set_status (appindicator.STATUS_ACTIVE)
ind.set_icon ("/path/to/ico.png")
# create a menu
menu = gtk.Menu()
buf = "Restaurer"
menu_items = gtk.MenuItem(buf)
menu.append(menu_items)
menu_items.connect("activate", callback, buf)
menu_items.show()
buf = "Quitter"
menu_items = gtk.MenuItem(buf)
menu.append(menu_items)
menu_items.connect("activate", quitApplication, buf)
menu_items.show()
ind.set_menu(menu)
base = recTV()
gtk.main()
Merci !
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#2 Le 25/06/2014, à 10:07
- pingouinux
Re : Python et Appindicator, module pour iconifier une application
Bonjour,
def hide_window(fenetre): self.fenetre.hide() ............................. def callback(self, fenetre): self.fenetre.show() # here is the problem, self is not working
Ce qui me paraît bizarre, c'est que le fenetre utilisé dans chacune de ces fonctions n'est pas celui passé en argument. Autrement dit, l'argument fenetre n'est pas utilisé.
Hors ligne
#3 Le 25/06/2014, à 10:32
- Gaara
Re : Python et Appindicator, module pour iconifier une application
Bonjour pingouinux,
Pour tout dire, je ne comprend pas encore les arguments. Pour les fonctions "classiques", je mets en général (self, a, donnees=None):
Et si ça ne marche pas, je change un peu au pif (par ex je remplace "a" par le nom de la classe), jusqu'à ce que ça marche... Un peu empirique comme méthode, j'avoue...
Mais là, rien ne fonctionne. Python à l'air "d'oublier" toutes les variables en "self" pour toute la partie sous if __name__ == "__main__":, ce qui peut être logique, car c'est en dehors de la classe.
l'argument fenetre n'est pas utilisé.
Le code devrait fonctionner comme ça selon toi ?
En fait, j'ai cette erreur:
Traceback (most recent call last):
File "recTV_v0.2.py", line 767, in callback
self.fenetre.show()
AttributeError: 'gtk.MenuItem' object has no attribute 'fenetre'
Et si je met def callback(fenetre, buf): à la place de def callback(self, fenetre):
cette erreur:
Traceback (most recent call last):
File "recTV_v0.2.py", line 767, in callback
self.fenetre.show()
NameError: global name 'self' is not defined
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#4 Le 25/06/2014, à 11:41
- pingouinux
Re : Python et Appindicator, module pour iconifier une application
Je n'ai pas d'expérience sur gtk. Il faudrait trouver de la doc sur les arguments attendus par gtk.MenuItem.connect, et notamment ce qui est transmis à callback en cas d'appel.
Tu peux aussi essayer :
def callback(fenetre,buf):
with open("/tmp/mon_fichier_log",'w') as f :
f.write("type(fenetre)=%s type(buf)=%s\n"%(type(fenetre),type(buf))
fenetre.show() # here is the problem, self is not working
while gtk.events_pending():
gtk.main_iteration()
Tu verras ainsi dans le fichier /tmp/mon_fichier_log les types d'arguments passés à callback.
Quelqu'un d'autre pourra peut-être t'aider de façon plus précise.
Hors ligne
#5 Le 25/06/2014, à 12:41
- Gaara
Re : Python et Appindicator, module pour iconifier une application
Dans le fichier il y a ceci:
type(fenetre)=<type 'gtk.MenuItem'> type(buf)=<type 'str'>
or le type de self.fenetre est:
<type 'gtk.Window'>
Je vais étudier un peu la doc et voir s'il y a une solution.
Avant, j'utilisais le module python-eggtrayicon avec succès, mais il n'existe plus sous Trusty.
Merci quand même
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#6 Le 25/06/2014, à 17:05
- Gaara
Re : Python et Appindicator, module pour iconifier une application
Ça y est j'ai trouvé !
En fait tout est dans le __init__(self):
avec ind qui devient self.ind
self.ind = appindicator.Indicator ("example-simple-client", "indicator-messages", appindicator.CATEGORY_APPLICATION_STATUS)
les fonctions sont des fonction "normales", et le if __name__ == "__main__": reste inchangé.
Les exemples dans les docs ou les manuels sont toujours des trucs tordus... je comprend pas pourquoi, c'est un peu ch..ant !
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne