Après avoir passé du temps à rediriger la sortie stdout et la journalisation vers un widget de texte tkinter, j'ai décidé que j'avais besoin d'aide. Mon code est le suivant:Rediriger la sortie de l'enregistreur Python vers le widget tkinter
#!/usr/bin/env python
from Tkinter import *
import logging
from threading import Thread
class IODirector(object):
def __init__(self,text_area):
self.text_area = text_area
class StdoutDirector(IODirector):
def write(self,str):
self.text_area.insert(END,str)
def flush(self):
pass
class App(Frame):
def __init__(self, master):
self.master = master
Frame.__init__(self,master,relief=SUNKEN,bd=2)
self.start()
def start(self):
self.master.title("Test")
self.submit = Button(self.master, text='Run', command=self.do_run, fg="red")
self.submit.grid(row=1, column=2)
self.text_area = Text(self.master,height=2.5,width=30,bg='light cyan')
self.text_area.grid(row=1,column=1)
def do_run(self):
t = Thread(target=print_stuff)
sys.stdout = StdoutDirector(self.text_area)
t.start()
def print_stuff():
logger = logging.getLogger('print_stuff')
logger.info('This will not show')
print 'This will show'
print_some_other_stuff()
def print_some_other_stuff():
logger = logging.getLogger('print_some_other_stuff')
logger.info('This will also not show')
print 'This will also show'
def main():
logger = logging.getLogger('main')
root = Tk()
app = App(root)
root.mainloop()
if __name__=='__main__':
main()
Je sais que l'on peut définir un nouveau gestionnaire d'enregistrement basé sur un widget de texte, mais je ne peux pas le faire fonctionner. La fonction "print_stuff" est juste une enveloppe autour de nombreuses fonctions ayant toutes leur propre configuration de logger. J'ai besoin d'aide pour définir un nouveau gestionnaire de journalisation qui est "global" afin qu'il puisse être instancié à partir de chacune des fonctions ayant leur propre enregistreur. Toute aide est très appréciée.
Merci pour votre réponse mais j'ai déjà un moyen de rediriger stdout dans mon code. Le problème est que l'enregistreur Python ne semble pas écrire sur stdout même si vous ajoutez spécifiquement stdout comme gestionnaire de l'enregistreur. Au moins, les messages de l'enregistreur ne sont pas inclus lorsque vous redirigez stdout. – user2073502