我开发的工具Autodesk Maya。许多工具,我建立具有简单窗口的图形用户界面的动画师和模型使用。这些图形用户界面,常常包含什么你通常希望看到任何基本的窗口;标签,列出了,菜单,按钮,文本区域,等等。但是,有限制的复杂性,联合国教科文组织统计研究所可以建立与可用的工具,特别是在类型的可用部件。

我有兴趣在采用一些更先进的wxPython部件,例如列表视图(grid)、树,等等。这将涉及使用一个完整的wxFrame(窗口),以显示整个用户界面,这将基本上意味着窗将不再被绑到Maya。不是一个处理器,但它意味着当Maya是最小化,窗口不会效仿。

我已经试过这样的事情之前与tkinter作为一个测试,但发现,它需要一个mainloop,mainloop在运行其自己的线。这是合乎逻辑的,但在我的情况下,冲突与玛雅的自己的线,基本上使玛雅挂到窗口关闭。这是由于这样的事实,Maya运行的所有脚本,请他们MEL或蟒蛇,在一个单一的线的主要玛雅GUI股。这是为防止一个脚本,比如说,从中删除的对象,而另一个脚本是试图做的工作上相同的对象。

wxPython有这个相同的"mainloop,mainloop"以及演示的方法与技巧。.我想知道如果有任何办法,以便它可以工作内Maya?

有帮助吗?

解决方案

我不知道如果这是密切相关,但一些谷歌上搜索现,PyQt是相当受欢迎内部的玛雅。你可以试试这种技术 在这里,在这里, (说明 在这里, 与源代码)创建一个新的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()

然后设置一个功能来处理夸脱活动:

def pumpQt():
    global app
    def processor():
        app.processEvents()
    while 1:
        time.sleep(0.01)
        utils.executeDeferred( processor )

你也许可以做一些类似的有wxPython。(工具.executeDeferred是玛雅的功能。) 一定要看看如何创建一个 非阻GUI 在wxPython wiki。而不是processEvents(),你会想到设置了一个活动循环,并检查对于"未决的"事件在内部(希望改名?) pumpQt功能上。(该wxPython源有 蟒蛇执行情况 的mainloop,mainloop.) 可能这应该是通过应用程序。产量()function,但我不知道。

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的邮件列表 但是这是从一些微小的版本的适前。) 还有一些指示在各种论坛,这种技术引起的问题与键盘输入。你也可以尝试做的事情:

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

处理当前的名单的事件。

祝你好运!

其他提示

我不知道是否有周围的GUI一个主循环的方式,因为它需要处理所有的事件链和重绘队列。

但也有进程间通信的若干装置,例如管道或信号量。也许这是一个选项,您的玛雅扩展拆分成实际的插件,是紧张到Maya,并为贵单独的应用程序。这两个可以使用这种手段进行沟通,插件和GUI之间交换模型信息。 我不知道,但是,如果我真的可以推荐这种方法,因为它非常的应用程序的复杂性。

您可以看看IPython中,一个交互式Python外壳,它的开发团队已经把一些努力与wxPython的整合它。他们有中断事件循环和挂钩到它自己做的东西的某种方式。

去创造你所需要的一个QWidget,并利用它从MPxCommand通的C ++ API中的最佳途径。这样,你还可以选择通过scriptedPanels注入完整的自定义编辑器到Maya的机会。

但是,如果你注定的Python,PyQt的是要走的路。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top