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>
Notatki:
Stackoverflow: How can I redirect all Brython output to a textarea element
