Как я могу перенаправить весь вывод Brython на элемент textarea - PullRequest
0 голосов
/ 21 апреля 2020

У меня проблема.

Мне нужно перенаправить весь вывод Brython на элемент <textarea>.

Вот мой HTML -файл.

<!DOCTYPE html>
<html>
    <head>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.8/brython.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.8/brython_stdlib.js"></script>
    </head>
    <body onload="brython(1)">
        <textarea id="console"></textarea>
        <script type="text/python3">
            print('test')
        </script>
    </body>
</html>

Я знаю, что по умолчанию все выходные данные (sys.stdout и sys.stderr) в Brython отправляются на консоль.

Я пробовал это:

<!DOCTYPE html>
<html>
    <head>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.8/brython.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.8/brython_stdlib.js"></script>
    </head>
    <body onload="brython(1)">
        <textarea id="console"></textarea>
        <script type="text/python3">
            from browser import document
            import sys
            sys.stdout = document['console']
        </script>
        <script type="text/python3">
            print('test')
        </script>
    </body>
</html>

Но это дает мне AttributeError.

Traceback (most recent call last):
  module __main__2 line 1
    print('test')
AttributeError: 'TEXTAREA' object has no attribute 'write'

Мне нужно использовать print(), потому что пользователь введет код, а результат кода будет напечатан в <textarea>.

Я пытался искать примеры, но я не нашел ни одного.

1 Ответ

0 голосов
/ 21 апреля 2020

Оригинал sys.stdout имеет метод write(), а print() использует sys.stdout.write() для отправки текста на консоль.

Вы должны создать класс, который также имеет метод write() и присвоить этому классу sys.stdout. И ваш write() может поместить текст в <textarea>


Минимальный рабочий пример.

<!DOCTYPE html>
<html>
    <head>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.8/brython.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.8/brython_stdlib.js"></script>
    </head>
    <body onload="brython(1)">
        <textarea id="console"></textarea>
        <script type="text/python3">
            import sys
            from browser import document

            class MyOutput:
                def __init__(self):
                    self.console = document["console"]

                def write(self, text):
                    self.console.text += text

            sys.stdout = MyOutput()

            print("Hello World 1")

            print("Hello World 2")

        </script>
    </body>
</html>
...