2010-07-26 5 views
4

Comment puis-je rediriger les données stdout vers un widget tkinter Text?stdout to tkinter GUI

+0

Étape 1. Acceptez quelques réponses à vos questions précédentes ... –

Répondre

10

Vous devez créer une classe de type fichier dont la méthode write écrit à la place dans le widget Tkinter, puis sys.stdout = <your new class>. Voir this question.

Exemple (copié à partir du lien):

class IORedirector(object): 
    '''A general class for redirecting I/O to this Text widget.''' 
    def __init__(self,text_area): 
     self.text_area = text_area 

class StdoutRedirector(IORedirector): 
    '''A class for redirecting stdout to this Text widget.''' 
    def write(self,str): 
     self.text_area.write(str,False) 

puis, dans votre widget Tkinter:

# To start redirecting stdout: 
import sys 
sys.stdout = StdoutRedirector(self) 
# (where self refers to the widget) 

# To stop redirecting stdout: 
sys.stdout = sys.__stdout__ 
+0

Hi! Pourriez-vous peut-être me donner un exemple? Je suis très nouveau avec Python et j'ai du mal à faire fonctionner ça. Beaucoup obligé :) – FLX

+0

La question liée a tout le code dont vous avez besoin, je pense. Vous devez créer votre propre version de la classe 'StdoutRedirector' comme cela est fait, puis définir' sys.stdout = StdoutRedirector'. Je vais copier le code dans ma réponse. – katrielalex

0

C'est une vieille question, mais je l'ai trouvé une solution que je voudrais partager avec la communauté. Mon exemple conduit une liste du répertoire de travail vers une fenêtre Tk. J'utilise Python 3.6 sur Windows 8. J'ai couru le code à travers Jupyter Notebook et Eclipse en utilisant Pydev.

import os 
from tkinter import * 
from subprocess import Popen, PIPE 
root = Tk() 
text = Text(root) 
text.pack() 

def ls_proc(): 
    return Popen(['ls'], stdout=PIPE) 

with dir_proc() as p: 
    if p.stdout: 
     for line in p.stdout: 
      text.insert(END, line) 
    if p.stderr: 
     for line in p.stderr: 
      text.insert(END, line) 

root.mainloop()