У меня проблема.
Мне нужно перенаправить весь вывод Brython на элемент <textarea>.
<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>.
print()
Я пытался искать примеры, но я не нашел ни одного.
Оригинал sys.stdout имеет метод write(), а print() использует sys.stdout.write() для отправки текста на консоль.
sys.stdout
write()
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>