From 186ff6b409fdca4ef4080b7bed8e3580ed2f9ac9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parodi=2C=20Eugenio=20=F0=9F=8C=B6?= Date: Thu, 30 Oct 2025 15:42:51 +0000 Subject: [PATCH] chore: use TextIOBase for the stderr handler --- libs/pyTermTk/TermTk/TTkCore/ttk.py | 6 ++- tests/t.generic/test.generic.010.daemon.01.py | 10 +++-- tests/t.ui/test.ui.035.error.handling.py | 38 ++++++++++++++----- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/libs/pyTermTk/TermTk/TTkCore/ttk.py b/libs/pyTermTk/TermTk/TTkCore/ttk.py index 5d450d25..8aaee1f3 100644 --- a/libs/pyTermTk/TermTk/TTkCore/ttk.py +++ b/libs/pyTermTk/TermTk/TTkCore/ttk.py @@ -23,13 +23,15 @@ __all__ = ['TTk'] import os +import io import signal import time +import queue import threading import platform import contextlib -from typing import Optional, Callable, TextIO, List +from typing import Optional, Callable, List from TermTk.TTkCore.drivers import TTkSignalDriver from TermTk.TTkCore.TTkTerm.input import TTkInput @@ -49,7 +51,7 @@ from TermTk.TTkWidgets.widget import TTkWidget from TermTk.TTkWidgets.container import TTkContainer -class _TTkStderrHandler(TextIO): +class _TTkStderrHandler(io.TextIOBase): def write(self, text): TTkLog.error(text) return len(text) diff --git a/tests/t.generic/test.generic.010.daemon.01.py b/tests/t.generic/test.generic.010.daemon.01.py index 928a50b8..5b28dc0a 100755 --- a/tests/t.generic/test.generic.010.daemon.01.py +++ b/tests/t.generic/test.generic.010.daemon.01.py @@ -31,12 +31,14 @@ def task(): print(f"{i=}",flush=True) time.sleep(0.1) -process = multiprocessing.Process(target=task, daemon=True) -process.start() -time.sleep(10) +if __name__ == '__main__': + process = multiprocessing.Process(target=task, daemon=True) + process.start() -print(f"Main Process exit...") + time.sleep(10) + + print(f"Main Process exit...") diff --git a/tests/t.ui/test.ui.035.error.handling.py b/tests/t.ui/test.ui.035.error.handling.py index adea5a23..ac97f7f1 100755 --- a/tests/t.ui/test.ui.035.error.handling.py +++ b/tests/t.ui/test.ui.035.error.handling.py @@ -23,6 +23,8 @@ import sys, os import threading +import multiprocessing +import time sys.path.append(os.path.join(sys.path[0],'../../libs/pyTermTk')) import TermTk as ttk @@ -43,28 +45,46 @@ class Fail(ttk.TTkWidget): if Fail.fail_state: raise Exception('Fail FAIL!!!') canvas.fill(color=ttk.TTkColor.BG_RED) - canvas.drawText(text='X', pos=(2,1)) + canvas.drawText(text='💀 Draw', pos=(2,1)) + +def _multiprocess_task(): + process = multiprocessing.current_process() + print(f"Task: {process.daemon=}", file=sys.stderr) + for i in range(100): + ttk.TTkLog.warn(f"{i=}") + print(f"{i=}",flush=True, file=sys.stderr) + time.sleep(0.3) timer = ttk.TTkTimer() timer.timeout.connect(_raise) +context = multiprocessing.get_context(method="spawn") +ctx = context.Process(target=_multiprocess_task, daemon=True) + root = ttk.TTk() # simulate error # Fail in the main Thread -ttk.TTkButton(parent=root,text=' X ',border=True).clicked.connect(_raise) +ttk.TTkButton(parent=root,pos=(0,0),text='💀 Main',border=True).clicked.connect(_raise) # Fail in the draw Thread -Fail(parent=root,pos=(0,3), size=(5,3)) +Fail(parent=root,pos=(9,0), size=(10,3)) # Generic Failure on a generic thread -ttk.TTkButton(parent=root,pos=(0,6),text=' X ',border=True).clicked.connect(lambda:threading.Thread(target=_raise).start()) +ttk.TTkButton(parent=root,pos=(19,0),text='💀 a Thread',border=True).clicked.connect(lambda:threading.Thread(target=_raise).start()) # Generic Failure on a TTkTimer -ttk.TTkButton(parent=root,pos=(0,9),text=' X ',border=True).clicked.connect(lambda:timer.start()) +ttk.TTkButton(parent=root,pos=(32,0),text='💀 a TTkTimer',border=True).clicked.connect(lambda:timer.start()) # Generic Quit -ttk.TTkButton(parent=root,pos=(0,13),text=' X ',border=True).clicked.connect(root.quit) -ttk.TTkButton(parent=root,pos=(0,16),text=' X ',border=True).clicked.connect(ttk.TTkHelper.quit) +ttk.TTkButton(parent=root,pos=(50,0),text='root.Quit',border=True).clicked.connect(root.quit) +ttk.TTkButton(parent=root,pos=(61,0),text='helper.Quit',border=True).clicked.connect(ttk.TTkHelper.quit) -win=ttk.TTkWindow(parent=root, pos=(5,0), size=(100,30), border=True, layout=ttk.TTkGridLayout()) +# Test Multiprocessing +ttk.TTkButton(parent=root,pos=(75,0),text='multiprocess',border=True).clicked.connect(ctx.start) + +win=ttk.TTkWindow(parent=root, pos=(0,3), size=(100,30), border=True, layout=ttk.TTkGridLayout()) ttk.TTkLogViewer(parent=win) -root.mainloop() \ No newline at end of file + +if __name__ == '__main__': + root.mainloop() + if ctx.is_alive(): + ctx.join()