Partage
  • Partager sur Facebook
  • Partager sur Twitter

Avoir un retour du stdout en temps réel

    26 mars 2015 à 3:31:05

    Bonjour à vous,

    Pour l'instant, j'ai un problème concernant la sortie en temps réel d'un fichier

    J'ai réussit à recopier le stdout vers un fichier log.txt

    Maintenant j'aimerais récupérer ce fichier ( log.txt ), l'affichez dans, soit un Text, soit une Listbox, soit un Label.

    Au départ, j'aimais bien l'idée du Text, mais, avec la sourit l'on peut cliquer dessus et donc le modifier..

    J'aimerais simple recréer une sorte de "command prompt "( pour l'instant, pas besoin d'écrire, seulement lire .. )

    J''ai créé un petit exemple, avec la modification de mon code : ( assez long, mais inclus tout )

    Copier/Coller :)

    #!/usr/bin/env python
    #-*-coding:Utf-8 -*
    import sys
    import Tkinter as tk
    import tkFileDialog as tkFD
    import os, os.path
    import string
    from Tkinter import BOTH, END, LEFT
    #Images
    from PIL import Image, ImageTk
    
    
    #Variables Initiale Externes
    LogFile = "Sys/log.txt"
    ImageFile = "Multimedia/logonltsitegivrer.gif"
    
    
    ###########################################################
    ###### CLASSES ############################################
    ###########################################################
    
    #Log
    class MyOutput():
        def __init__(self, logfile):
            self.stdout = sys.stdout
            self.log = open(logfile, 'w')
     
        def write(self, text):
            self.stdout.write(text)
            self.log.write(text)
            self.log.flush()
     
        def close(self):
            self.stdout.close()
            self.log.close()
    
    # Centrez Fenetre
    def CenterWindows(original, w, h):
            """ Centrez les fenetres vers l'ecran:
            nom, weight, height"""
            original = original
            w = w
            h = h
            ws = original.winfo_screenwidth()
            hs = original.winfo_screenheight()
            # calculate position x, y
            x = (ws/2) - (w/2)
            y = (hs/2) - (h/2)
            original.geometry('%dx%d+%d+%d' % (w, h, x, y))
            
    
    ###  Classe Fenetre Principale
    class Fenetre_Principale(tk.Tk):
        """Programme Principale, Regroupement de tous les programmes"""
        ### Variable Constructeur.. ################################
        def __init__(self, parent):
            """Constructor"""
            tk.Tk.__init__(self,parent)
            self.parent = parent
            #Debut
            self.title("Bienvenue sur noSource")
            self.frame = tk.Frame(parent)
            self.frame.grid()
            #Centrez Fenetre
            centrez = CenterWindows(self,  850, 550)
                    
            #Frames
            self.LblFrame()
            
            #Classes
            ##Gauche
            ###Label
            Label_Principale(self.leftFrame).showLabel_P()
            ###Bouton
            Bouton_1(self.leftFrame).show_btn()
            Bouton_2(self.leftFrame).show_btn()
            Bouton_Quitter(self.leftFrame).show_btn()
            ###Images Logo
            ImageLogo(self.leftFrame).showLogo()
            
            ##Droit
            ###TextDfilement
            Label_Secondaire(self.rightFrame).showLabel()
            BoutonClear(self.rightFrame).showBtnClear()
            Boite_ListBox(self.rightFrame).showBoite_ListeTexte()
    
        def LblFrame(self):
            """ Afficher les 2 frames """
            self.rightFrame = tk.Frame(self, width=300, height = 600)
            self.rightFrame.grid(row=0, column=1, padx=10, pady=2)
    
            self.leftFrame = tk.Frame(self, width=300, height = 600)
            self.leftFrame.grid(row=0, column=0, padx=10, pady=2)
    
        # Ouvrir Fenetre Aide --------------------------------------------
        def openHelpWindow(self):
            """"""
            self.hide()
            subFrame = HelpAide(self)
            
        # Cacher Fenetre -------------------------------------------------
        def hide(self):
            """"""
            self.withdraw()
            
        # Afficher la Fenetre Principale ---------------------------------
        def show(self):
            """"""
            self.update()
            self.deiconify()
    
    ### Classe Widgets ####
    ##Classe Bouton Gauche
    class Label_Principale(tk.Label):
        """ Label Principale : titre, version..."""
        def __init__(self, master):
            """Constructeur"""
            self.master = master
        def showLabel_P(self):
            """Afficher titre princiaple"""
             #Bienvenue..
            tk.Label(self.master, text="Bienvenue Sur Foo").\
                                grid(row=0, column=0, padx=10, pady=2)
            #Creer espace
            tk.Label(self.master, text=" ").\
                                grid(row=1, column=0, padx=10, pady=2)
            #Montrez les informations
            tk.Label(self.master, text=" ").\
                                grid(row=2, column=0, sticky='w', padx=10, pady=2)
            #Version
            tk.Label(self.master, text=" ").\
                                grid(row=3, column=0, sticky='w', padx=10, pady=2)
    
                  
    ##Bouton Principale
    #Bouton1
    class Bouton_1(tk.Button):
        """"""
        def __init__(self, master):
            """"""
            self.master = master
        def show_btn(self):
            """Afficher Bouton"""
            try :
                Btn11 = tk.Button(self.master, text="Btn1", command=self.test1)
                Btn11.grid(row=9, column=0, sticky='we', padx=10, pady=2)
    
            except :
                print ("Btn1")
        def test1(self):
            """afficher bonjour stdout"""
            print 'Bouton1'
            
    #Bouton2         
    class Bouton_2(tk.Button):
        """"""
        def __init__(self, master):
            """"""
            self.master = master
            
        def show_btn(self):
            """Afficher Bouton2"""
            try :
                Btn22 = tk.Button(self.master, text="Btn2", command=self.test2)
                Btn22.grid(row=10, column=0, sticky='we', padx=10, pady=2)
    
            except :
                print ("Btn2")
    
        def test2(self):
            """afficher bonjour stdout"""
            print 'Bouton2'
            
    #### Fin Bas de Page ####
    ##Classe Bouton Quitter
    class Bouton_Quitter(tk.Button):
        """Bouton quitter"""
        def __init__(self,master):
            """Constructeur"""
            self.master = master
        ### Fonction ####
        def show_btn(self):
            """Afficher bouton"""
            QuitBtn = tk.Button(self.master, text="Quitter", fg='red', command=self.master.quit)
            QuitBtn.grid(row=12, column=0, sticky='we', padx=10, pady=2)
            
        def hide_btn(self):
            """Cacher Bouton Quitter"""
    
    #Images Logo
    class ImageLogo(tk.PhotoImage):
        """"""
        def __init__(self, master):
            """"""
            self.master = master
    
        def showLogo(self):
            """Afficher Logo"""
            try:
                #Image Logo
                imageEx = tk.PhotoImage(file = ImageFile)
                imageLogoA = tk.Label(self.master, image=imageEx)
                imageLogoA.grid(row=13, column=0, padx=10, pady=2)
                imageEx.img = imageEx
            except:
                print("Image not found")
    
    #### Coter Droit #########################################################
    class Label_Secondaire(tk.Label):
        """ Afficher label secondaire"""
        def __init__(self, master):
            """Constructeur"""
            self.master = master
        def showLabel(self):
            """Afficher label"""
            #Titre qui change Selon choix...
            self.labelA = tk.Label(self.master, text='Afficher')
            self.labelA.grid(row=0, column=0, columnspan=2, padx=10, pady=10)
            
            self.labelB = tk.Label(self.master, text='Ce que StringVar')
            self.labelB.grid(row=1, column=0,columnspan=2,  padx=10, pady=10)
            
            self.labelC = tk.Label(self.master, text=' Coter droit...')
            self.labelC.grid(row=2, column=0, columnspan=2, padx=10, pady=10)
            
            self.labelD = tk.Label(self.master, text=' Coter droit...')
            self.labelD.grid(row=3, column=0, columnspan=2, padx=10, pady=10)
            
            self.labelE = tk.Label(self.master, text='---------------------------------------------------------------------------')
            self.labelE.grid(row=4, column=0, columnspan=2, padx=10, pady=10)
    
    class BoutonClear(tk.Button):
        """Bouton Clear, effacer le TEXT.."""
        def __init__(self, master):
            """Constructeur"""
            self.master = master
        def showBtnClear(self):
            """Afficher bouton Clear"""
            ##### Fin Bas de page #####################
            #Bouton CLear
            ClearBtn = tk.Button(self.master, text="Clear", fg='green', command='')
            ClearBtn.grid(row=5, column=0,  columnspan=2, sticky='we', padx=10, pady=2)
    
    
    #Classe Boite Texte
    class Boite_ListBox(tk.Listbox):
        """ Boite Texte défilement"""
        def __init__(self,master):
            """Constructeur"""
            self.master = master
            self.repcourant = os.getcwd()
        def showBoite_ListeTexte(self):
            """ Afficher la boite texte """
            #Boite Texte Dialog **
            self.textLog = tk.Listbox(self.master, width =58, height =19 )
            self.textLog.grid(row=6, column=0, columnspan=2, padx=10, pady=2)
            self.textLog.insert(END, 'Initialisation...')
            self.textLog.insert(END, self.showTexte_Boite())
            self.textLog.update()
                
        def showTexte_Boite(self):
            """Afficher du texter"""
            afficheTout = open(LogFile, 'r')
            for lignes in afficheTout :
                return lignes
            
    ### Principale ################################################
    def main():
        #LOG
        sys.stdout = MyOutput(LogFile)
        #App
        app = Fenetre_Principale(None)
        app.mainloop()
        app.destroy()
    
        
    ######### Fin Programme ##############################
    #### Démarrarrez PRogramme Principale #####
    if __name__ == "__main__":
        main()
    

    Comment faire afficher ce qui se trouve dans log.txt en temps réel dans le Listbox

    Dois-je créer une boucle , qui effectue une lecture à chaque seconde?

    Peut-être qu'il y a un meilleur moyen?

    -inclure le stdout directement dans la Listbox, sans fichier?

    -créer un Label ?

    Merci de votre aide.

    -
    Edité par nolimitech 26 mars 2015 à 5:31:56

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      26 mars 2015 à 17:41:30

      Au départ, j'aimais bien l'idée du Text, mais, avec la sourit l'on peut cliquer dessus et donc le modifier..

      La documentation a dit

      By default, you can edit the text widget’s contents using the standard keyboard and mouse bindings. To disable editing, set the state option to DISABLED (but if you do that, you’ll also disable the insert and delete methods).

      Source

      • Partager sur Facebook
      • Partager sur Twitter
        26 mars 2015 à 23:51:18

        Salut,

        Merci pour cette réponse.

        C'est exactement cela, mais j'ai besoin de la commande insert avec Tkinter.Text

        . Sauf s'il y a un autre moyen d'afficher un texte en temps réel.

        Es-ce possible? Je vois rien sur google

        Dois-je créer une boucle while?

        ...
        while foo:
             print sys.stdout.read()
        

        Une autre solution ou idée? 

        Merci de votre aide encore une fois :)

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          27 mars 2015 à 7:26:17

          Sauf s'il y a un autre moyen d'afficher un texte en temps réel

          En le rendant NORMAL quand on a besoin d'insérer, puis DISABLED quand on a plus besoin d'insérer ?

          • Partager sur Facebook
          • Partager sur Twitter
            27 mars 2015 à 8:16:25

            Ah surment...

            Voici ce que j'ai réussis en final. Grâce à un exemple script d'horloge en temps réel.

            #!/usr/bin/env python
            #-*-coding:Utf-8 -*
            
            import sys
            import Tkinter as tk
            import tkFileDialog as tkFD
            import os, os.path
            import string
            from Tkinter import BOTH, END, LEFT
            #Threading
            import threading, Queue, time
            #Images
            from PIL import Image, ImageTk
            
            #Test
            import subprocess
            
            #Variables Initiale Externes
            LogFile = "log.txt"
            RepCour = os.getcwd()
            
            tempsReel = True
            tempsPass = False
            lignesNum = 0
            
            #Log
            class MyOutput():
                def __init__(self, logfile):
                    self.stdout = sys.stdout
                    self.log = open(LogFile, 'w')
             
                def write(self, text):
                    self.stdout.write(text)
                    self.log.write(text)
                    self.log.flush()
            
                def close(self):
                    self.stdout.close()
                    self.log.close()
            
            # Centrez
            def CenterWindows(original, w, h):
                    """ Centrez les fenetres vers l'ecran:
                    nom, weight, height"""
                    original = original
                    w = w
                    h = h
                    ws = original.winfo_screenwidth()
                    hs = original.winfo_screenheight()
                    # calculate position x, y
                    x = (ws/2) - (w/2)
                    y = (hs/2) - (h/2)
                    original.geometry('%dx%d+%d+%d' % (w, h, x, y))
            
            ###  Classe Fenetre Principale
            class Fenetre_Principale(tk.Tk):
                """"""
                def __init__(self, parent):
                    """Constructor"""
                    tk.Tk.__init__(self,parent)
                    self.parent = parent
                    #Debut
                    self.title("Test")
                    self.frame = tk.Frame(parent)
                    self.frame.grid()
                    CenterWindows(self, 700,500)
                    #Frames
                    self.LblFrame()
                    #Classes
                    Bouton_1(self.leftFrame).show_btn()
                    Bouton_2(self.leftFrame).show_btn()
                    BoutonClear(self.rightFrame).showBtnClear()
                    Bouton_Quitter(self.leftFrame).show_btn()
            
                    showHeure(self.leftFrame, self)
                    showTextBox(self.rightFrame, self)
                    
                def LblFrame(self):
                    """ Afficher les 2 frames """
                    self.rightFrame = tk.Frame(self, width=300, height = 600)
                    self.rightFrame.grid(row=0, column=1, padx=10, pady=2)
            
                    self.leftFrame = tk.Frame(self, width=300, height = 600)
                    self.leftFrame.grid(row=0, column=0, padx=10, pady=2)
            
            #Bouton1
            class Bouton_1(tk.Button):
                """"""
                def __init__(self, master):
                    """"""
                    self.master = master
                def show_btn(self):
                    """Afficher Bouton"""
                    try :
                        Btn11 = tk.Button(self.master, text="Btn1", command=self.test)
                        Btn11.grid(row=9, column=0, sticky='we', padx=10, pady=2)
            
                    except :
                        print ("Btn1")
                def test(self):
                    """afficher bonjour stdout"""
                    print 'Bouton1'
                    
            #Bouton2         
            class Bouton_2(tk.Button):
                """"""
                def __init__(self, master):
                    """"""
                    self.master = master
                    
                def show_btn(self):
                    """Afficher Bouton2"""
                    try :
                        Btn22 = tk.Button(self.master, text="Btn2", command=self.test)
                        Btn22.grid(row=10, column=0, sticky='we', padx=10, pady=2)
            
                    except :
                        print ("Btn2")
            
                def test(self):
                    """afficher bonjour stdout"""
                    print 'Bouton2'
                    
            ##Classe Bouton Quitter
            class Bouton_Quitter(tk.Button):
                """Bouton quitter"""
                def __init__(self,master):
                    """Constructeur"""
                    self.master = master
                ### Fonction ####
                def show_btn(self):
                    """Afficher bouton"""
                    QuitBtn = tk.Button(self.master, text="Quitter", fg='red', command=self.leaving)
                    QuitBtn.grid(row=12, column=0, sticky='we', padx=10, pady=2)
                    
                def leaving(self):
                    """"""
                    #showHeure(self.master, self).cleanup_on_exit()
                    self.master.quit()
                    
                def hide_btn(self):
                    """Cacher Bouton Quitter"""
            
            class BoutonClear(tk.Button):
                """Bouton Clear, effacer le TEXT.."""
                def __init__(self, master):
                    """Constructeur"""
                    self.master = master
                    
                def showBtnClear(self):
                    """Afficher bouton Clear"""
                    #Bouton CLear
                    ClearBtn = tk.Button(self.master, text="Clear", fg='green', command=self.test)
                    ClearBtn.grid(row=5, column=0,  columnspan=2, sticky='we', padx=10, pady=2)
            
                def test(self):
                    """ Aucune idée quoi faire...  """
                    os.remove(LogFile)
                    sys.stdout = MyOutput(LogFile)
                    showTextBox(self.master, self).clearwindow()
                    print 'Clear..'
            
            class showHeure(object):
                """Afficher heure temps réel"""
                def __init__(self, master, root):
                    """"""
                    self.master = master
                    self.root = root
                def HeureDirect(self):
                    
                    self.win = tk.Text(self.master, undo=True, width=10, height=1)
                    self.win.grid(row=8, column=0, sticky='we', padx=10, pady=2)
            
                    self.queue = Queue.Queue(maxsize=1)
                    self.poll_thread_stop_event = threading.Event()
                    self.poll_thread = threading.Thread(target=thread1, name='Thread', args=(self.queue,self.poll_thread_stop_event))
                    self.poll_thread.start()
            
                    self.poll_interval = 250
                    self.poll()
            
                    self.root.wm_protocol("WM_DELETE_WINDOW", self.cleanup_on_exit)
                    
                def cleanup_on_exit(self):
                    """Needed to shutdown the polling thread."""
                    print 'Window closed. Cleaning up and quitting'
                    self.poll_thread_stop_event.set()
                    self.master.quit() #Allow the rest of the quit process to continue
            
                def poll(self):
                    if self.queue.qsize():
                        self.selected_files = self.queue.get()
                        self.win.delete(1.0,tk.END)
                        self.win.insert(tk.END, self.selected_files)
                    self._poll_job_id = self.master.after(self.poll_interval, self.poll)
            
            class showTextBox(tk.Text):
                """Afficher heure temps réel"""
                def __init__(self, master, root):
                    """"""
                    self.master = master
                    self.root = root
                    
                    #Boite Texte Dialog **
                    self.textLog = tk.Text(self.master, width =58, height =19 )
                    self.textLog.grid(row=6, column=0, columnspan=2, padx=10, pady=2)
            
                    self.yscroll = tk.Scrollbar(command=self.textLog.yview, orient=tk.VERTICAL)
                    self.yscroll.grid(row=0, column=2, sticky=tk.N+tk.S)
                    self.textLog.configure(yscrollcommand=self.yscroll.set)
            
                    self.textLog.insert(END, 'Initialisation...')
                    self.textLog.insert(END, '\n')
            
                    self.queue = Queue.Queue(maxsize=1)
                    self.poll_thread_stop_event = threading.Event()
                    self.poll_thread = threading.Thread(target=thread2, name='Thread', args=(self.queue,self.poll_thread_stop_event))
                    self.poll_thread.start()
            
                    self.poll_interval = 250
                    self.poll()
            
                    self.root.wm_protocol("WM_DELETE_WINDOW", self.cleanup_on_exit)
                    
                def cleanup_on_exit(self):
                    """Needed to shutdown the polling thread."""
                    print 'Window closed. Cleaning up and quitting'
                    self.poll_thread_stop_event.set()
                    self.master.quit() #Allow the rest of the quit process to continue
            
                def poll(self):
                    if self.queue.qsize():
                        self.selected_files = self.queue.get()
                        self.textLog.insert(END, self.selected_files)
                    self._poll_job_id = self.master.after(self.poll_interval, self.poll)
            
                def clearing(self):
                    """Essayer de rafraichir.."""
                    self.textLog.update_idletask()
            
            #Thread
            def thread1(q, stop_event):
              """q is a Queue object, stop_event is an Event.
              stop_event from http://stackoverflow.com/questions/6524459/stopping-a-thread-python
              """
              while(not stop_event.is_set()):
                if q.empty():
                  q.put(time.strftime('%H:%M:%S'))
            
            def thread2(q, stop_event):
              """q is a Queue object, stop_event is an Event.
              stop_event from http://stackoverflow.com/questions/6524459/stopping-a-thread-python
              """
              numligne = 0
              abc = open(LogFile, 'r')
              while(not stop_event.is_set()):
                if q.empty():
                    for line in abc.readlines():
                        q.put(line)
                        
                          
            ### Principale ################################################
            def main():
                #LOG
                sys.stdout = MyOutput(LogFile)
                
                #App
                app = Fenetre_Principale(None)
                app.mainloop()
                app.destroy()
            
                
            ######### Fin Programme ##############################
            #### Démarrarrez PRogramme Principale #####
            if __name__ == "__main__":
                main()
            

            Es-ce bien? Parce que c'est exactement ce que je cherchais.. J'ai encore quelques défaut à revoir.

            Mais il fonctionne. J'arrive pas encore à quitter par le Bouton ( pour les threads )

            Seulement par le X, grâce à mv_protocol.

            Merci encore de votre aide.

            -
            Edité par nolimitech 27 mars 2015 à 8:18:12

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              27 mars 2015 à 8:47:23

              Quel intérêt de créer 4 classe héritant de Tk.Button ? L'intérêt d'une classe est de pouvoir créer plusieurs objets dont les attributs peuvent éventuellement changer...
              • Partager sur Facebook
              • Partager sur Twitter
                28 mars 2015 à 18:42:01

                Salut,

                Aucune idée.. Il y a beaucoup de choses que je ne comprend pas encore. C'est pour cela que j'essaie et je demande.

                J'ai jamais vraiment touchés aux attributs. Pour le moment j'essaye de bien construire mes blocs ( un échec total, haha )

                Je m'instruit par internet, par les forums. ( S'il fallait que google réclame 0.10$ par recherche, OUCH)

                Désolé, si c'est pas beau à regarder. C'est le genre de chose qu'on apprend au fur et à mesure. Au début, je mettais tout dans une même classe. Aujourd'hui j'essaie plusieurs méthode.

                Pour l'instant, j'ai obtenus ce que je voulais. Mais pas encore satisfait.

                OldProgrammer, c'est la première fois j'essayais cela. Je croyais que c’était de cette façon qu'il fallait. Quel méthode dois-je utiliser? :(

                C'est probablement pour ça que j'ai souvent des AttributeError: instance has no attribute. hahahahaha

                Merci de m'éclaircir.

                • Partager sur Facebook
                • Partager sur Twitter

                Avoir un retour du stdout en temps réel

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown