Skip to content

Commit 78e29f6

Browse files
committed
added called_on_main decorator
1 parent 353ce14 commit 78e29f6

3 files changed

Lines changed: 53 additions & 1 deletion

File tree

tests/test_tkthread.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,5 +396,33 @@ def func():
396396
self.assertIsNot(d['thread'], t)
397397

398398

399+
def test_called_on_thread(self):
400+
401+
d = {}
402+
main = tkthread._willdispatch._main_thread_
403+
404+
@tkthread.called_on_main
405+
def main_func(*args, **kw):
406+
d['args'] = args
407+
d['kw'] = kw
408+
d['thread'] = threading.current_thread()
409+
return 'done'
410+
411+
t = threading.current_thread()
412+
@thread_start()
413+
def tstart():
414+
r = main_func(1, 2, c=3)
415+
d['result'] = r
416+
417+
while tstart.is_alive():
418+
self.root.update()
419+
420+
self.assertEqual(d['result'], 'done')
421+
self.assertIs(d['thread'], main)
422+
self.assertEqual(d['args'], (1, 2))
423+
self.assertEqual(d['kw'], {'c':3})
424+
425+
426+
399427
if __name__ == '__main__':
400428
unittest.main()

tkthread/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ def run(func):
102102
import queue
103103

104104
from ._version import __version__
105-
from ._willdispatch import tkinstall, main, current, call
105+
from ._willdispatch import (
106+
tkinstall, main, current, call, called_on_main
107+
)
106108

107109
__all__ = ['TkThread', 'tk', '__version__',
108110
'tkinstall', 'main', 'current', 'call']

tkthread/_willdispatch.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ def _handler(d=d):
261261
d['outerr'] = (result, error)
262262

263263
main(sync=sync)(_handler)
264+
264265
if sync:
265266
result, error = d['outerr']
266267
if error is not None:
@@ -272,3 +273,24 @@ def _handler(d=d):
272273
def call(func, *args, **kwargs):
273274
"""Call the function on the main thread, wait for result."""
274275
return _callsync(True, func, args, kwargs)
276+
277+
278+
class called_on_main:
279+
"""Decorator to cause function call to execute on the main thread.
280+
281+
example:
282+
283+
@tkthread.called_on_main
284+
def gui_code():
285+
...
286+
287+
gui_code() # calling will automatically dispatch to main thread
288+
"""
289+
def __init__(self, func):
290+
self.func = func
291+
292+
def __call__(self, *args, **kw):
293+
return call(self.func, *args, **kw)
294+
295+
def __repr__(self):
296+
return '<called_on_main %r>' % self.func

0 commit comments

Comments
 (0)