Не совсем ответ, но комментарий. Я бы добавил это как комментарий, но у меня не хватает «очков репутации».
Для того, чтобы это стоило, вот разумный (я думаю) вариант использования для того, чтобы делать подобные вещи.
Мое приложение использует gtk и раскручивает множество потоков. Любой, кто сделал оба этих шага, знает, что вы не можете касаться GUI вне основного потока. Типичный обходной путь - передать вызываемый объект, который коснется GUI, на idle_add()
, который запустит его позже, в главном потоке, где это безопасно. Итак, у меня есть много случаев:
def threaded_gui_func(self, arg1, arg2):
if threading.currentThread().name != 'MainThread':
gobject.idle_add(self.threaded_gui_func, arg1, arg2)
return
# code that touches the GUI
Было бы немного короче и проще (и более подходящим для cut-n-paste), если бы я мог просто сделать
def thread_gui_func(self, arg1, arg2):
if idleIfNotMain(): return
# code that touches the GUI
, где idleIfNotMain () просто возвращает False, если мы находимся в главном потоке, но если нет, он использует inspect (или любой другой) для определения вызываемого объекта и аргументы для передачи idle_add()
, затем возвращает True Получить аргументы я могу понять. Получение вызова, кажется, не слишком легко. : - (