나는 운이없이 3 일 동안이 문제를 조사해 왔습니다. 나는 이것 모두에 아주 새롭다 그래서 어쩌면 나가 잃어버린 무언가가있다. QThread를 사용하거나PyQt와 Maya, threading = False?
가이 코드는 마야 다음에 "mayapy"파이썬 인터프리터에서 실행되도록 설계되었습니다 스레드 Maya.cmds, PyMel 평가 MEL :
문제에 적용됩니다. 여러 인스턴스에서 동일한 오류를 다시 만드는 간단한 예제를 만들었습니다.
하나의 버튼이 작동하지만 다른 버튼은 작동하지 않습니다. 그러나 그들은 같은 코드를 실행합니다.는
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