Skip to content

Commit 96c2822

Browse files
committed
fix(TTk): register resize event callbacks on init to avoid exception
Allows mainloop() to be started from a different thread without encountering exception "signal only works in main thread of the main interpreter" on start. This makes sense because window resizing events come from the host.
1 parent 4767f19 commit 96c2822

File tree

2 files changed

+7
-8
lines changed

2 files changed

+7
-8
lines changed

β€Žlibs/pyTermTk/TermTk/TTkCore/drivers/term_unix_common.pyβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ def _sigWinCh(signum, frame):
125125
def _registerResizeCb(callback):
126126
_TTkTerm._sigWinChCb = callback
127127
# Dummy call to retrieve the terminal size
128+
# signal only works in main thread of the main interpreter
128129
_TTkTerm._sigWinCh(signal.SIGWINCH, None)
129130
signal.signal(signal.SIGWINCH, _TTkTerm._sigWinCh)
130131
TTkTermBase.registerResizeCb = _registerResizeCb

β€Žlibs/pyTermTk/TermTk/TTkCore/ttk.pyβ€Ž

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,15 @@ def __init__(self, *,
106106
self._mouseCursor = None
107107
self._showMouseCursor = os.environ.get("TERMTK_MOUSE",mouseCursor)
108108
super().__init__(**kwargs)
109+
110+
# Register system event signals from main_thread
109111
TTkInput.inputEvent.connect(self._processInput)
110112
TTkInput.pasteEvent.connect(self._processPaste)
111113
TTkSignalDriver.sigStop.connect(self._SIGSTOP)
112114
TTkSignalDriver.sigCont.connect(self._SIGCONT)
113115
TTkSignalDriver.sigInt.connect( self._SIGINT)
116+
TTkSignalDriver.init()
117+
114118
self._drawMutex = threading.Lock()
115119
self._paintEvent = threading.Event()
116120
self._paintEvent.set()
@@ -127,6 +131,7 @@ def __init__(self, *,
127131
self._showMouseCursor = True
128132

129133
TTkHelper.registerRootWidget(self)
134+
TTkTerm.registerResizeCb(self._win_resize_cb)
130135

131136
frame = 0
132137
time = time.time()
@@ -140,12 +145,12 @@ def _fps(self):
140145
self.time = curtime
141146

142147
def mainloop(self):
148+
'''Enters the main event loop and waits until :meth:`~quit` is called or the main widget is destroyed.'''
143149
with ttk_capture_stderr():
144150
self._mainloop_1()
145151

146152
def _mainloop_1(self):
147153
try:
148-
'''Enters the main event loop and waits until :meth:`~quit` is called or the main widget is destroyed.'''
149154
TTkLog.debug( "" )
150155
TTkLog.debug( " β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— " )
151156
TTkLog.debug( " β•šβ•β•β–ˆβ–ˆβ•”β•β•β• β•šβ•β•β–ˆβ–ˆβ•”β•β•β• " )
@@ -160,13 +165,6 @@ def _mainloop_1(self):
160165
TTkLog.debug( "Starting Main Loop..." )
161166
TTkLog.debug(f"screen = ({TTkTerm.getTerminalSize()})")
162167

163-
# Register events
164-
TTkSignalDriver.init()
165-
166-
TTkLog.debug("Signal Event Registered")
167-
168-
TTkTerm.registerResizeCb(self._win_resize_cb)
169-
170168
self._timer = TTkTimer()
171169
self._timer.timeout.connect(self._time_event)
172170
self._timer.start(0.1)

0 commit comments

Comments
Β (0)