我一直在调查这个问题3天,没有任何运气。我对这一切都很陌生,所以也许有一些我错过了。PyQt和Maya,线程= False?
的问题适用于:Maya.cmds,PyMel和评估MEL使用的QThread或只是线程
此代码被设计为在跟随玛雅“mayapy” Python解释器运行。我创建了一个简短的例子,它在多个实例中重新创建相同的错误。
一个按钮的作品,另一个没有。但他们运行相同的代码。
from PyQt4 import Qt
class doStuff(Qt.QThread):
taskProgress = Qt.pyqtSignal(int)
# --------------------------------------------------------- #
# Here things start to crash...
def run(self):
# This works
persp = mel.general.PyNode('persp')
print persp.translateX.get()
# This dont work
poiLights = mel.general.ls(exactType="pointLight")
for light in poiLights:
print light
# This dont work
geo = mel.general.PyNode('pPyramidShape1')
print mel.modeling.polyEvaluate(geo, face=True)
# Emit progress
self.taskProgress.emit(1)
return
# END
# --------------------------------------------------------- #
class ui(Qt.QWidget):
def __init__(self, parent=None):
super(ui, self).__init__(parent)
# Init QThread
self.thread = doStuff()
# Create Widgets
buttonNo = Qt.QPushButton("Start - Dont work")
buttonYes = Qt.QPushButton("Start - Works")
# Setup Layout
layout = Qt.QVBoxLayout()
layout.addWidget(buttonYes)
layout.addWidget(buttonNo)
self.setLayout(layout)
self.show()
# --------------------------------
# PROBLEM AREA: Button signals
# This one dont work, but starts the thread correctly.
self.connect(buttonNo, Qt.SIGNAL("clicked()"), self.thread.start)
# This one works, but dont start the thread correctly.
self.connect(buttonYes, Qt.SIGNAL("clicked()"), self.thread.run)
# --------------------------------
self.thread.taskProgress.connect(self.updateProgress)
return
# Feedback progress status
def updateProgress(self, value):
print 'Current progress is:', value
return
if __name__ == '__main__':
import sys
app = Qt.QApplication(sys.path)
program = ui()
# init maya
import pymel.core as mel
filePath = '/Users/ecker/Dropbox/Scripts/RibExporter/mayaScene3ani.ma'
mel.openFile(filePath, f=True, o=True)
sys.exit(app.exec_())
此代码创建按下时开始执行相同功能的2个按钮。一个执行thread.start
和thread.run
。
thread.start
将使线程的工作,因为它应该是能够将数据反馈到了Qt的接口(进度条),但大多数玛雅代码将开始返回各种错误是这样的:
Traceback (most recent call last):
File "/Users/ecker/Dropbox/Scripts/RibExporter/error_recreation2.py", line 22, in run
poiLights = mel.general.ls(exactType="pointLight")
File "/Applications/Autodesk/maya2012/Maya.app/Contents/Frameworks/Python.framework/Versions/Current/lib/python2.6/site-packages/pymel/core/general.py", line 969, in ls
res = _util.listForNone(cmds.ls(*args, **kwargs))
File "/Applications/Autodesk/maya2012/Maya.app/Contents/Frameworks/Python.framework/Versions/Current/lib/python2.6/site-packages/pymel/internal/pmcmds.py", line 134, in wrappedCmd
res = new_cmd(*new_args, **new_kwargs)
TypeError: Flag 'long' must be passed a boolean argument
这是一个布尔参数,不管我以什么样的格式和方式尝试给它什么参数,它总会给出与此非常相似的错误。在同一行res = new_cmd(*new_args, **new_kwargs)
需要一个布尔值。
我需要thread
到start
,不只是运行。除非有不同的线程方法,否则一个解决方法?
解决了所有问题。谢谢 :) – Ecker00 2012-02-17 13:42:31