IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec Python Discussion :

Changer plusieurs fois une image dans une méthode


Sujet :

GTK+ avec Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 38
    Par défaut Changer plusieurs fois une image dans une méthode
    Bonjour,

    Je débute avec python et pygtk et je bloque:

    J'ai une application qui se présente sous la forme d'une fenêtre avec une image de fond (qui est en fait un bouton).
    Au clic sur cette image, je lance une méthode qui passe un appel voip avec différents traitements.
    Au début de cette méthode, je dois changer d'image pour afficher "communication en cours", à la fin de la fonction, je dois afficher une autre image "erreur de communication" si besoin, avant de finalement rebasculer sur l'image d'accueil.
    Le problème, c'est que la modification de l'image n'est prise en compte qu'à la sortie de ma méthode, je ne peux donc pas gérer l'affichage de mes images de cette façon.

    Existe-t-il un moyen de contourner ce problème?

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2003
    Messages : 48
    Par défaut
    Bonjour,

    Au début de ton programme tu dois surement avoir gtk.main(). En fait, c'est une sorte de "boucle infini" qui permet, en autre, de rafraichir l'affichage, capter les signaux des widgets afin de lancer les fonctions associées.

    Dans ton cas, je suppose que tu as défini un signal "clicked" sur ton bouton qui lance une fonction "fonction_clicked(...)"

    Lorsque tu cliques sur le bouton, la boucle main intercepte le signal et exécute ta fonction. Cependant elle n'exécute pas la fonction dans un thread sérapé. Donc tant que ta fonction ne sera pas terminée, ton affichage sera comme figé.
    Dans la plupart des cas, ces fonctions rendent la main rapidement donc ça ne pose pas de problème. Dans ton cas, la solution est d'utiliser les threads.

    Voici un exemple qui se rapproche de ce que tu souhaites faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    import gtk, pygtk, time, threading
    from threading import Thread
    gtk.gdk.threads_init()
    import gobject
     
    class VoIP(Thread):
        def __init__(self, image):
            Thread.__init__(self)
            self.image = image
     
        def run(self):
            self.image.set_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_LARGE_TOOLBAR)
            for i in range(5):
                print i
                time.sleep(1)
     
            connected = True
            if(connected):
                self.image.set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_LARGE_TOOLBAR)
            else:
                self.image.set_from_stock(gtk.STOCK_DISCONNECT, gtk.ICON_SIZE_LARGE_TOOLBAR)
     
    class MyWindow:
        def __init__(self):
            self.gtkwindow = gtk.Window()
            button = gtk.Button()
            self.image = gtk.Image()
            self.image.set_from_stock(gtk.STOCK_DISCONNECT, gtk.ICON_SIZE_LARGE_TOOLBAR)
     
            button.add(self.image)
            self.gtkwindow.add(button)
     
            button.connect("clicked", self.fonction_clicked)
            self.gtkwindow.connect("destroy", gtk.main_quit)
            self.gtkwindow.show_all()
     
     
        def fonction_clicked(self, button):
            voip = VoIP(self.image)
            voip.start()
     
     
    if __name__ == "__main__":
        window = MyWindow()
     
        gtk.gdk.threads_enter()
        gtk.main()
        gtk.gdk.threads_leave()
    J'espère avoir répondu à ta question.

Discussions similaires

  1. [Débutant] Manipulation d'images : intégrer une image dans une image
    Par noscollections dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2014, 11h51
  2. Mettre une Image dans une Image
    Par shadowhocine dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 19/12/2006, 18h40
  3. Réponses: 3
    Dernier message: 30/10/2006, 11h21
  4. Réponses: 5
    Dernier message: 24/08/2006, 15h00
  5. Insérer une légende dans une image avec une police plus petite
    Par Paulinho dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 29/04/2006, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo