стандартный вывод в графический интерфейс tkinter - PullRequest
5 голосов
/ 26 июля 2010

Как перенаправить данные стандартного вывода в текстовый виджет tkinter?

Ответы [ 3 ]

9 голосов
/ 26 июля 2010

Вам нужно создать файловый класс, метод которого write записывает вместо этого в виджет Tkinter, а затем выполнить sys.stdout = <your new class>. См этот вопрос .

Пример (скопировано по ссылке):

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)

и затем в вашем виджете 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__
1 голос
/ 22 января 2018

Это старый вопрос, но я нашел решение, которым хотел бы поделиться с сообществом. Мой пример передает список рабочего каталога в окно Tk. Я использую Python 3.6 в Windows 8. Я запускал код через Jupyter Notebook и Eclipse, используя 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()
0 голосов
/ 14 июня 2019
log_box_1 = tk.Text(root, borderwidth=3, relief="sunken")

with subprocess.Popen("ls -la", shell=True, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p:
            for line in p.stdout:
                log_box_1.insert(tk.END, line)

С здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...