首页 > 解决方案 > 如何将所有 Brython 输出重定向到 textarea 元素

问题描述

我有个问题。

我需要将所有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>

我知道默认情况下,Brython 中的所有输出(sys.stdout 和 sys.stderr)都会进入控制台。

我试过这个:

<!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>.

我试图搜索示例,但没有找到任何示例。

标签: pythonhtmltextareastdoutbrython

解决方案


原始具有将文本发送到控制台的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>

推荐阅读