Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/06/2014, à 10: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 tongue )

     
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, à 11: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, à 11: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, à 12: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, à 13: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. hmm

Merci quand même smile


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, à 18: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