Sov*_*iut 7 python scripting wxwidgets wxpython maya
我在Autodesk Maya中开发工具.我构建的许多工具都有简单的窗口GUI,供动画师和建模人员使用.这些GUI通常包含您通常希望在任何基本窗口中看到的内容; 标签,列表,菜单,按钮,文本字段等.但是,您可以使用可用工具构建的UI的复杂性存在限制,特别是在可用小部件的类型中.
我有兴趣使用一些更高级的wxPython小部件,如ListView(网格),树等.这将涉及使用完整的wxFrame(窗口)来显示整个UI,这实际上意味着窗口将不再被绑在玛雅身上.不是交易破坏者,但这意味着当Maya被最小化时,窗口将不会跟随.
我之前尝试使用tkinter作为测试,但发现它需要MainLoop才能在自己的线程中运行.这是合乎逻辑的,但在我的情况下,它与Maya自己的线程冲突,基本上使Maya挂起,直到窗口关闭.这是因为Maya在主Maya GUI共享的单个线程中运行所有脚本,无论是MEL还是Python.这是为了防止一个脚本在另一个脚本尝试对同一个对象进行操作时删除一个对象.
wxPython具有相同的"mainloop"方法.我想知道它是否有任何解决方法,以便它可以在Maya中工作?
小智 2
我不确定这是否有密切关系,但一些谷歌搜索发现 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()
Run Code Online (Sandbox Code Playgroud)
然后设置一个函数来处理 Qt 事件:
def pumpQt():
global app
def processor():
app.processEvents()
while 1:
time.sleep(0.01)
utils.executeDeferred( processor )
Run Code Online (Sandbox Code Playgroud)
您或许也可以使用 wxPython 做类似的事情。(utils.executeDeferred 是一个 Maya 函数。)请务必在 wxPython wiki 上查看如何创建非阻塞 GUI 。您需要设置一个事件循环并检查上面(希望重命名?)pumpQt 函数内的“待处理”事件,而不是 processEvents()。(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()
Run Code Online (Sandbox Code Playgroud)
wxPython 文档表明 SafeYield()是首选。再说一遍,这似乎可能是第一步,但我不确定它是否会起作用,而不仅仅是严重崩溃。( wxPython 邮件列表上有一些关于您想要做什么的讨论,但它来自 wx 的几个小版本。)在各种论坛中也有一些迹象表明这种技术会导致键盘输入问题。您也可以尝试这样做:
def processor():
while app.Pending(): app.Dispatch()
Run Code Online (Sandbox Code Playgroud)
处理当前的事件列表。
祝你好运!
| 归档时间: |
|
| 查看次数: |
3276 次 |
| 最近记录: |