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 :

comment on utilise les thread avec pygtk ?


Sujet :

GTK+ avec Python

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 69
    Points : 55
    Points
    55
    Par défaut comment on utilise les thread avec pygtk ?
    Bonjour,
    cela fait plusieurs jours que je tente de comprendre le thread (google, faq pygtk...) mais quelque chose m'échappe alors si vous pouviez corriger mon code (ou me dire exactement quoi changer) ça serait un bon début, et avec de bonnes explications ça serait encore mieux, merci d'avance.

    Actuellement la boucle for fonctionne mais l'interface freeze pendant ce temps, elle ne s'actualise qu'une fois la boucle terminé
    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import time
    import pygtk
    #~ pygtk.require(2.0)
    import gtk
    import gobject
     
    gobject.threads_init()
     
    class Base:
        def evt_delete(self, widget, evt, donnees=None):
            gtk.main_quit()
            return False
     
        def refresh(self):
            for i in xrange(10):
                self.text.set_text(str(i))
                print(i)
                time.sleep(0.1)
            print('ok')
            return False
     
     
        def __init__(self):
            self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
            self.fenetre.set_size_request(300, 300)
     
            self.fenetre.connect("delete_event", self.evt_delete)
     
            vSizer = gtk.VBox()
            self.text = gtk.Label('test')
            vSizer.pack_start(self.text, False, False)
            self.fenetre.add(vSizer)
     
            self.text.show()
            vSizer.show()
            self.fenetre.show()
     
            gobject.idle_add(self.refresh)
     
        def app(self):
            gtk.main()
     
     
    app = Base()
    app.app()

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Plutôt qu'un appel à time.sleep, essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while gtk.events_pending ():
      gtk.main_iteration ()
    Ceci redonne la main à GTK pour qu'il puisse traiter les événements

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 69
    Points : 55
    Points
    55
    Par défaut
    ok, mais du coup j'ai plus de pause et ça défile trop vite :s

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par dkmatt Voir le message
    ok, mais du coup j'ai plus de pause et ça défile trop vite :s
    Si tu souhaite appeler la méthode à intervalles réguliers, utilise plutôt glib.timeout_add

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 69
    Points : 55
    Points
    55
    Par défaut
    on m'a aussi dit que gobject.idle_add() ne devait pas être mis dans le thread principale, donc je suis censé le mettre où ?

  6. #6
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 69
    Points : 55
    Points
    55
    Par défaut
    comment arrêter le thread quand je quitte l'application ?
    pour l'instant il continu :s

    aussi, glib.timeout_add permet d'executer un code statique, mais mon code contient une boucle, comment la ralentir sans utiliser time.sleep ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    En cassant la boucle et en utilisant g_timeout_add

  8. #8
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 69
    Points : 55
    Points
    55
    Par défaut
    Je viens de comprendre un truc. Il faut mettre gobject.timeout_add() dans la fonction qu'elle appel

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def blabla(self) :
        ...
        ...
        ...
        ...
        handler = gobject.timeout_add(1000, self.blabla)
        return False
    Si on m'avait dis ça plus tot, j'aurais pas autant galéré

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Si tu renvoies True au lieu de False, le timeout sera automatiquement rappelé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/02/2007, 18h47
  2. comment utiliser les API avec Perl?
    Par megapacman dans le forum Langage
    Réponses: 5
    Dernier message: 23/08/2006, 15h18
  3. Comment utiliser les Threads en VC++?
    Par mambo dans le forum MFC
    Réponses: 2
    Dernier message: 16/06/2006, 14h04
  4. [CF][PPC/VB.NET] Comment utiliser les Socket avec Pocket PC ?
    Par joefou dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 17/05/2005, 14h24

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