Search on blog:

Python: Jak przekierować print() do textarea w Brython

Oryginalnie sys.stdout posiada methodę write() i funkcja print() używa tego sys.stdout.write() do wysłania tekstu na konsolę.

Aby przekierować print() do elementu na stronie lub w GUI trzeba stworzyć klasę z metodą write(), która pobiera tekst i umiesza go na stronie lub w GUI, i należy przypisać tą klasę do sys.stdout. Można także przypisać oryginalny sys.stdout do jakieś zmiennej aby później przypisać do sys.stdout aby ponownie wysyłać tekst na konsolę.

---

Minimalny działający przykład dla Brython.

Strona posiada <textarea> z id="console"` i tworzę klasę MyOutput, która używa write do umieszczenia tekstu w document["console"]. Gdy przypiszę instancję tej klasy do sys.stdout to wtedy print() wysyła tekst do <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

            my_output = MyOutput()

            original_stdout = sys.stdout

            sys.stdout = my_output

            print("Hello World 1")
            print("Hello World 2")
            print("Hello World 3")

            sys.stdout = original_stdout

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

Można też przypisać instację do zmiennej my_output = MyOutput() i użyć jej w print(..., file=my_output) aby wyświetlać tylko wybrany tekst.

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

            my_output = MyOutput()

            print("Hello World 1", file=my_output)
            print("Hello World 2", file=my_output)
            print("Hello World 3", file=my_output)

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

Można też użyć bezpośrednio my_output.write() ale wtedy trzeba dodawać '\n' do tekstu.

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

            my_output = MyOutput()

            my_output.write("Hello World 1" + "\n")
            my_output.write("Hello World 2" + "\n")
            my_output.write("Hello World 3" + "\n")

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

If you like it
Buy a Coffee