我不确定这是否密切相关,但一些谷歌搜索发现 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 上的如何创建非阻塞 GUI 。您需要设置一个事件循环,而不是 processEvents(),并检查上面的(希望重命名?)pumpQt 函数中的“待处理”事件。(wxPython 源代码有一个MainLoop 的Python 实现。)可能这应该通过 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()
处理当前事件列表。
祝你好运!