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

Python Discussion :

Récupérer la sortie du terminal (stdout je crois) dans une GUI ?


Sujet :

Python

  1. #21
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 66
    Par défaut
    Merci à vous deux de vos réponse !

    @valAa :
    Oui, tree est très groumant, et moi aussi je dois attendre avant d'avoir le 1er bloc...

    J'ai testé avec un sleep aussi.
    Au lieux de lancer un ping où un tree, j'ai codé un autre petit script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    i = 0
     
    while True:
    	print i
    	i += 1
    Et j'ai mis un time.sleep(0.001) dans la boucle, et là, ça marche.
    Seulement c'est plus long, et l'affichage n'est pas tout à fait en temps réel, ça prend rapidement du retard.

    @VinsS :
    Pour wxPython ce n'est en principe pas la peine, mais je crois qu'il existe des fonction "update", je vais chercher.
    J'avais eu déjà un soucis avec Tkinter là dessus, autant ça pourrait tout régler.

    Je vais me replonger dans mes recherches et je vous tiens au jus !
    Merci encore !

    PS : Grâce au sleep (merci valAa), on peux peut être en conclure que le widget n'a pas le temps de se rafraîchir. Donc comme l'a dit VinsS, peut être une fonction "update" quelque part !

  2. #22
    Membre confirmé
    Inscrit en
    Novembre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 66
    Par défaut
    J'ai du nouveau :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    import wx
    import subprocess
    import threading
    import sys
     
    class WorkerTread (threading.Thread):
    	def __init__ (self, window):
    		self.window = window
     
    		threading.Thread.__init__(self)
    		self.start()
     
    	def run (self):
    		self.reply = subprocess.Popen(["tree", "/usr/"], stdout=subprocess.PIPE)
     
    		ligne = True
    		while ligne:
    			ligne = self.reply.stdout.readline()
    			sys.stdout.flush()
    			wx.CallAfter(self.window.textCtrl_append, ligne)
     
    	def stop (self):
    		self.reply.kill()
     
    class Gui (wx.Frame):
    	def __init__ (self, titre):
    		self.titre = titre
     
    		wx.Frame.__init__(self, None, wx.ID_ANY, title=self.titre)
    		sizer = wx.GridBagSizer()
     
    		# ----------------------------------------------------------------------------------------------------------- Champ de texte
     
    		self.textCtrl = wx.TextCtrl(self, wx.ID_ANY, size=(800, 600), style=wx.TE_MULTILINE|wx.TE_READONLY)
    		self.textCtrl.SetBackgroundColour('#000000')
    		self.textCtrl.SetForegroundColour('#ffffff')
     
    		sizer.Add(self.textCtrl, (0, 0), flag=wx.EXPAND|wx.ALL, border=10)
     
    		# ----------------------------------------------------------------------------------------------------------- Boutons Quitter...
     
    		buttonExit = wx.Button(self, wx.ID_EXIT)
    		sizer.Add(buttonExit, (1, 0), flag=wx.ALIGN_CENTRE|wx.BOTTOM, border=10)
     
    		# ----------------------------------------------------------------------------------------------------------- Divers
     
    		# Initialisation
    		self.thread = WorkerTread(self)
     
    		# Sizer + Fit
    		self.SetSizerAndFit(sizer)
    		self.Fit()
     
    		# Non redimentionnable
    		self.SetMinSize(self.GetSize())
    		sizer.AddGrowableCol(0)
    		sizer.AddGrowableRow(0)
     
    		# Evénements
    		self.Bind(wx.EVT_BUTTON, self.exit, buttonExit)
    		self.Bind(wx.EVT_CLOSE, self.post_exit)
     
    	# ----------------------------------------------------------------------------------------------------------- Fonctions Générales
     
    	def textCtrl_append (self, texte):
    		self.textCtrl.AppendText(texte)
    		self.textCtrl.Update()
     
    	def post_exit (self, event):
    		self.thread.stop()
    		self.Destroy()
     
    	def exit (self, event):
    		self.Close()
     
    class Ihm (wx.App):
    	def OnInit (self):
    		root = Gui(u'stdout')
    		root.Show(True)
    		self.SetTopWindow(root)
    		return True
     
    if __name__ == '__main__':
    	app = Ihm()
    	app.MainLoop()
    J'ai trouvé les méthod Update et Refresh pour mon widget.
    Mais Refresh ne semble pas marcher dans mon cas.
    Je supprime le time.sleep()...

    Maintenant ça marche.
    Bien que lent aussi et le bouton "Quitter" qui est figé.

    Donc voilà, je ne sais pas ce qui est le plus propre entre le time.seelp ou le Update.

  3. #23
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Sans doute juste pour le fun car je ne sais pas si cela existe en wx ou QT.

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import Tkinter
    from time import sleep
    from subprocess import Popen, PIPE
     
    class Interface(Tkinter.Tk):
        def __init__(self, parent):
            Tkinter.Tk.__init__(self, parent)
            self.parent = parent
            self.title('test output')
            scroll = Tkinter.Scrollbar(self)
            self.Afficheopt = Tkinter.Text(self, fg='white', bg='black', bd=0)
            scroll.pack(side=Tkinter.RIGHT, fill=Tkinter.Y)
            self.Afficheopt.pack(side=Tkinter.LEFT, fill=Tkinter.Y)
            scroll.config(command=self.Afficheopt.yview)
            self.Afficheopt.config(yscrollcommand=scroll.set)
     
        def Cmd_Insert(self, cmd):
            self.Afficheopt.insert(Tkinter.END, cmd)
            self.Afficheopt.yview(Tkinter.END)
            self.Afficheopt.update()
     
    class Command():
        def __init__(self, command):
            self.command=Popen(command, universal_newlines=True, stdout=PIPE)
     
        def Maj(self):
            return self.command.stdout.readline()
     
    if __name__ == "__main__":
        def Intercepte():
            if globals()['texte']:
                globals()['texte'] = False
                #global texte
                #texte = False
            app.destroy()
     
        app = Interface(None)
        app.protocol("WM_DELETE_WINDOW", Intercepte)
        app.update()
        #reply = Command(["ping", "-c 50", "www.google.com"])
        reply = Command(['tree', '/usr/'])
        texte = True
        while texte:
            texte = reply.Maj()
            app.Cmd_Insert(texte)
        # sleep(10)
        # app.destroy()
        app.mainloop()
    Bon code

    Edit pour rajout d'un self.Afficheopt.yview

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Débutant] Récupérer les coordonnées d'un ensemble de pixels dans une matrice
    Par reda24 dans le forum Images
    Réponses: 5
    Dernier message: 01/06/2007, 18h06
  2. récupérer le nom du serveur et l'afficher dans une jsp
    Par barouz dans le forum Servlets/JSP
    Réponses: 21
    Dernier message: 19/04/2007, 15h32
  3. Recherche croisé dans une base de donnée
    Par elephant13 dans le forum C#
    Réponses: 1
    Dernier message: 24/03/2007, 15h26
  4. Réponses: 1
    Dernier message: 31/07/2006, 13h54
  5. Réponses: 1
    Dernier message: 05/05/2006, 14h37

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