Autodesk Maya에서 사용자 인터페이스를 만들기 위해 외부 GUI 라이브러리 사용

StackOverflow https://stackoverflow.com/questions/397337

문제

Autodesk Maya에서 도구를 개발합니다. 내가 구축 한 많은 도구에는 애니메이터와 모더 러가 사용할 수있는 간단한 창문 GUI가 있습니다. 이 Guis에는 종종 기본 창에서 일반적으로 볼 것으로 예상되는 것을 포함합니다. 레이블, 목록, 메뉴, 버튼, 텍스트 필드 등. 그러나 사용 가능한 도구, 특히 사용 가능한 위젯 유형으로 빌드 할 수있는 UI의 복잡성에는 제한이 있습니다.

ListView (Grid), 트리 등과 같은 고급 WXPython 위젯을 사용하는 데 관심이 있습니다. 여기에는 전체 UI를 표시하기 위해 완전한 WXFRAME (창)을 사용하여 창이 더 이상 창을 더 이상 표시하지 않습니다. Maya에 묶여 있습니다. 거래 차단기는 아니지만 Maya가 최소화 될 때 창은 소송을 따르지 않습니다.

나는 Tkinter와 함께 테스트로 이와 같은 것을 시도했지만 자체 스레드에서 실행하려면 메인 루프가 필요하다는 것을 알았습니다. 이것은 논리적이지만, 제 경우에는 Maya의 스레드와 충돌하여 창문이 닫힐 때까지 Maya가 진정시킵니다. 이는 Maya가 MANA GUI가 공유하는 단일 스레드로 모든 스크립트, Mel 또는 Python이라는 사실로 인해 발생하기 때문입니다. 이것은 하나의 스크립트가 객체를 삭제하는 것을 방지하는 것입니다. 다른 스크립트가 동일한 객체에서 작업하려고합니다.

WXPYTHON은 이와 동일한 "MainLoop"Methodolgy를 가지고 있습니다. Maya 내에서 작동 할 수 있도록 주변에 어떤 방법이 있는지 궁금합니다.

도움이 되었습니까?

해결책

이것이 독일인인지 확실하지 않지만 일부 인터넷 검색은 PYQT가 Maya의 인기가 높다는 것을 알 수 있습니다. 기술을 시도 할 수 있습니다 여기 또는 여기 (설명 여기 Maya를 통해 새 ThreadLoop을 생성하고 그 내부에서 실행하는 소스 코드와 함께. 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 기능입니다.) 비 블로킹 GUI Wxpython Wiki에서. ProcessEvents () 대신 이벤트 루프를 설정하고 위의 (희망적으로 이름이 바뀌 었는가) 내부에서 "보류중인"이벤트를 확인하려고합니다. (wxpython 소스는 a 파이썬 구현 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 Age에서 나온 것입니다.) 다양한 포럼 에이 기술이 키보드 입력에 문제가 발생한다는 몇 가지 표시가 있습니다. 당신은 또한 시도 할 수도 있습니다 :

def processor():
  while app.Pending(): app.Dispatch()

현재 이벤트 목록을 처리합니다.

행운을 빕니다!

다른 팁

GUI의 메인 루프 주위에 방법이 있는지 모르겠습니다. 모든 이벤트 체인과 레드 그리기 대기열을 처리해야하기 때문입니다.

그러나 파이프 나 세마포어와 같은 프로세스 간 통신의 몇 가지 수단이 있습니다. 어쩌면 Maya 확장을 실제 플러그인으로 분할하여 Maya로 단단하고 GUI에 대한 별도의 애플리케이션을하는 옵션 일 수 있습니다. 이 두 가지는 이러한 수단을 사용하여 플러그인과 GUI 간의 모델 정보를 전달하고 교환 할 수 있습니다. 그러나이 접근법이 응용 프로그램을 크게 복잡하게하기 때문에이 접근법을 실제로 추천 할 수 있는지 확실하지 않습니다.

대화 형 파이썬 쉘 인 Ipython을 살펴볼 수 있습니다. 그들은 이벤트 루프를 방해하고 자신의 일을하기 위해 그것을 연결하는 방법이 있습니다.

가장 좋은 방법은 필요한 내용으로 QWIDGET을 작성하고 C ++ API를 통해 MPXCommand 내에서 사용하는 것입니다. 이렇게하면 ScriptedPanel을 통해 완전한 사용자 정의 편집기를 Maya에 주입 할 수 있습니다.

그러나 Python에 묶인 경우 PYQT가 갈 길입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top