Я не уверен, что это уместно, но некоторые прибегают к поиску, что PyQt довольно популярен в Maya. Вы можете попробовать метод здесь или здесь (объяснил здесь с исходным кодом) для создания нового потока через Maya и выполнения внутри него. Похоже, что в Maya включен модуль, который устанавливает новый объект потока с QApplication внутри него:
def initializePumpThread():
global pumpedThread
global app
if pumpedThread == None:
app = QtGui.QApplication(sys.argv)
pumpedThread = threading.Thread(target = pumpQt, args = ())
pumpedThread.start()
и затем устанавливает функцию для обработки событий Qt:
def pumpQt():
global app
def processor():
app.processEvents()
while 1:
time.sleep(0.01)
utils.executeDeferred( processor )
Возможно, вы можете сделать что-то подобное и с wxPython. (utils.executeDeferred является функцией Maya.) Обязательно ознакомьтесь с тем, как создать неблокирующий графический пользовательский интерфейс в wxPython wiki. Вместо processEvents () вы захотите настроить цикл обработки событий и проверить наличие «ожидающих» событий внутри (возможно, переименованной?) Функции pumpQt выше. (У источника wxPython есть реализация Python из MainLoop.) Вероятно, это должно быть сделано через функцию app.Yield (), но я не уверен.
def pumpWx():
global app
def processor():
app.Yield(True)
while 1:
time.sleep(0.01)
utils.executeDeferred( processor )
def initializePumpThread():
global pumpedThread
global app
if pumpedThread == None:
app = wx.App(False)
pumpedThread = threading.Thread(target = pumpWx, args = ())
pumpedThread.start()
Документы wxPython указывают на то, что SafeYield () является предпочтительным. Опять же, похоже, что это может быть первым шагом, но я не уверен, что это сработает, а не просто ужасно рухнет. (Есть некоторые обсуждения того, что вы хотите сделать в списке рассылки wxPython , но это из нескольких минорных версий wx назад.) На различных форумах также есть некоторые указания на то, что этот метод вызывает проблемы с вводом с клавиатуры. Вы также можете попробовать сделать:
def processor():
while app.Pending(): app.Dispatch()
для работы с текущим списком событий.
Удачи!