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 :

ping et pygtk


Sujet :

GTK+ avec Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Par défaut ping et pygtk
    Bonjour,
    j'essaie de faire un ping en cliquant sur un bouton comme suit:
    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
                    ping=gtk.Button("PING")
             	ping.connect("clicked", self.Ping_wiener, None)
           def Ping_wiener(self, widget, data):
      		window=gtk.Window(gtk.WINDOW_TOPLEVEL
      		window.set_default_size(500,250)
      		window.set_position(gtk.WIN_POS_CENTER)
      		window.set_border_width(5)
      		window.connect("destroy", self.detruire, None)
      		vbox= gtk.VBox(False, 10) 
      		window.add(vbox)
     
    		textview = gtk.TextView()
    		textview.set_cursor_visible(False)
    		textview.set_wrap_mode(gtk.WRAP_CHAR)
    		buffertexte = textview.get_buffer()
    		lPing=os.popen('ping -c 4 192.168.124.128','r')
    		sLigne = lPing.readlines()	
    		buffertexte.set_text(sLigne)
    		vbox.pack_start(textview, False, False, 0)	
    		bouton = gtk.Button("Fermer")
    		bouton.connect("clicked", self.detruire, None)
    		vbox.pack_start(bouton, False, False, 0)
     
    	  	window.show_all()
     
      		gtk.main()
    mon but est d'afficher dans le textview le résultat de ping ligne par ligne comme on le voit souvent sur la console.
    mais la, il m'affiche une erreur disant que:
    TypeError: GtkTextBuffer.set_text() argument 1 must be string or read-only buffer, not list
    pourriez vous m'aider ??
    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Bonjour,

    D'après le message d'erreur, sLigne contient une liste. Il faut la parcourir et ajouter les valeurs à ton buffer à chaque itération.


    Petit commentaire tout de même, ce n'est pas très élégant de créer tes objets dans ta callback. A chaque clique sur ton bouton, ils vont être créer, ce qui est assez gourmand en ressource.

    Le plus propre est de créer tes objets au démarrage de l'application et de cacher/montrer ce que tu as besoin. Ton appli sera beaucoup plus fluide.


    Sinon, d'après la doc de python, la méthode os.popen est dépréciée depuis python 2.6.
    http://docs.python.org/library/os.html#os.popen
    Je te conseille de suivre les recommandations pour la pérennité de ton code.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Par défaut
    Merci Anium pour votre réponse,

    je suis débutant en python, pour la création de mes objets dans la fonction callback puisque j'ai déja la fonction d'initialisation qui sert à créer des objets voici le code complet:
    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
    50
    class Gae:	
    	def __init__(self):
     
      		self.window=gtk.Window(gtk.WINDOW_TOPLEVEL)
      		self.window.set_title("Wiener System Control")
      		self.window.set_default_size(800,600)
    	 	self.window.set_position(gtk.WIN_POS_CENTER)
    	  	self.window.set_border_width(5)
    	  	self.vbox= gtk.VBox() 
    	  	self.window.add(self.vbox)
                   ping=gtk.Button("PING")
             	ping.connect("clicked", self.Ping_wiener, None)
    	  	self.window.show_all()
    	  	self.window.connect("destroy", self.detruire, None)
    	def Ping_wiener(self, widget, data):
                    window=gtk.Window(gtk.WINDOW_TOPLEVEL)
      		window.set_title("Wiener Mib Browser")
      		window.set_default_size(500,250)
      		window.set_position(gtk.WIN_POS_CENTER)
      		window.set_border_width(5)
      		window.connect("destroy", self.detruire, None)
      		vbox= gtk.VBox(False, 10) 
      		window.add(vbox)
     
    		textview = gtk.TextView()
    		textview.set_cursor_visible(False)
    		textview.set_wrap_mode(gtk.WRAP_CHAR)
    		buffertexte = textview.get_buffer()
    		lPing=os.popen('ping -c 4 192.168.124.128','r')
    		sLigne = lPing.read()	
    		for ligne in sLigne : 
    			buffertexte.set_text(sLigne)
    		vbox.pack_start(textview, False, False, 0)	
    		bouton = gtk.Button("Fermer")
    		bouton.connect("clicked", self.detruire, None)
    		vbox.pack_start(bouton, False, False, 0)
     
    	  	window.show_all()
      		gtk.main() 
     
    	def detruire(self, widget, data):
    		gtk.main_quit()	
     
    def boucle():	
    	#*démarrer la boucle évènementielle
    	gtk.main()
     
    if __name__ == '__main__':
    	Gae()		
      	boucle()
    premièrement, je ne sais pas comment organiser mon code pour qu'il soit optimal et ne pas perdre les ressources, je suis débutant avec la POO.
    et j'aimerais bien savoir comment faire pour afficher le résultat du ping (4 lignes) ligne par ligne dans la nouvelle fenêtre (comme sur la console) puisque là, lorsque je clique sur le boutton ping j'attends qu'il lance la commande puis il affiche tout d'un seul coup dans la nouvelle fenêtre.

    Merci d'avance.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Bonjour,

    Voici un code corrigé. J'ai essayé de commenter un peu. Il reste surement des erreurs, je n'ai pas exécuté le code. Mais le principe est là.

    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
    50
    51
    52
    53
    class Gae(gtk.Window): # Hérite de Window -> Gae est donc une Window et a toute ses propriétés et méthodes	
    	def __init__(self):
     
      		gtk.Window.__init__(self) # On appel le constructeur de Window
     
      		# On appel des méthodes de Gae (donc de Window)
      		self.set_position(gtk.WINDOW_TOPLEVEL)
      		self.set_title("Wiener System Control")
      		self.set_default_size(800,600)
    	   	self.set_position(gtk.WIN_POS_CENTER)
    	  	self.set_border_width(5)
    	  	self.connect("delete_event", lambda w,e: gtk.main_quit()) # Appel de gtk.main_quit() lors de la fermeture de la fenetre
     
                    # On crée les objets qui seront ajoutés dans Gae, ils sont créés dans l'init, donc une seule fois
    	  	vbox= gtk.VBox() 
     
    	  	ping=gtk.Button("PING")
                    ping.connect("clicked", self.Ping_wiener, None)
     
                    close_button = gtk.Button(stock=gtk.STOCK_CLOSE)
                    close_button.connect("clicked", lambda w,e: gtk.main_quit(), None)
     
                    self.textview = gtk.TextView()
      		self.textview.set_cursor_visible(False)
      		self.textview.set_wrap_mode(gtk.WRAP_CHAR)
     
                    # Organisation des widgets
                    vbox.pack_start(ping, False, False, 0)
                    vbox.pack_start(self.textview, True, True, 10)
                    vbox.pack_end(close_button, False, False, 0)
     
    	  	self.add(vbox)	  		     
     
    	  	self.show_all()
     
    	def Ping_wiener(self, widget, data):
                    # Callback de mise à jour du textview
      		buffertexte = self.textview.get_buffer()
     
      		lPing=os.popen('ping -c 4 192.168.124.128','r')
      		sLigne = lPing.read()	
      		for ligne in sLigne : 
      		  buffertexte.insert_at_cursor(ligne)
     
     
     
    def boucle():	
    	#*démarrer la boucle évènementielle
    	gtk.main()
     
    if __name__ == '__main__':
    	Gae()		
      boucle()
    Le mieux serait de te renseigner sur la POO et de parcourir le tutorial de pygtk http://python.developpez.com/cours/p...troduction.php.

    Concernant, l'affichage ligne par ligne, il faudrait lancer la commande ping dans un thread et ajouter le text au fur et à mesure.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 136
    Par défaut
    Merci Anium pour vos conseils,

    pour l'organisation du code, je sais qu'il faut créer les objets une seule fois dans __init__, mais pour mon cas j'ai une fenêtre principale "wiener system control" qui contient un ensemble de bouttons comme ping et d'autres composants et quand je clique sur le boutton ping une autre fenetre s'affiche avec d'autres propriétés (taille, titre,...etc).
    comment faire dans ce cas ?

    et pour les threads, pourriez vous me guider par un exemple concret ?

    Merci pour ton aide.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 151
    Par défaut
    Bonjour,

    Désolé de ne répondre que maintenant..

    Il suffit de créer une fenêtre dans l'init de Gae. Par contre, le self.show_all() montrera tous les éléments de Gae dont la fenêtre, ce qu'il ne faut pas.

    Il faut donc montrer seulement les éléments désirés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vbox.show_all()
    self.show()
    Et lors du clique sur le bonton, il faut faire un fenetre.show_all() et la fenêtre apparaitra. Il faut aussi connecter le signal "delete_event" à une méthode qui cache la nouvelle fenêtre.

    Pour la partie thread, je n'ai pas eu l'occasion d'en utiliser en python. Ça ne doit pas être sorcier. Voici un lien : http://python.developpez.com/faq/?page=Thread

Discussions similaires

  1. Réponses: 15
    Dernier message: 04/01/2007, 11h15
  2. Envoyer un ping
    Par CultOfTheShade dans le forum C
    Réponses: 6
    Dernier message: 24/07/2003, 18h25
  3. Ping sous protocole TCP (et non UDP)
    Par ovdz dans le forum Développement
    Réponses: 2
    Dernier message: 19/06/2003, 14h10
  4. Ping de broadcast sous Windows
    Par ovh dans le forum Développement
    Réponses: 10
    Dernier message: 09/05/2003, 18h40
  5. ping sur un port
    Par Neo41 dans le forum Développement
    Réponses: 3
    Dernier message: 21/01/2003, 01h42

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