摘要:本文将带你了解Maya动画制作之 maya中PySide一个很诡异的问题,希望本文对大家学Maya有所帮助
本文将带你了解Maya动画制作之 maya中PySide一个很诡异的问题,希望本文对大家学Maya有所帮助
背景:
笔者想在maya主窗口中加一个button,并且点击的时候实现一些方法,然而,常规的代码居然出现了很诡异的问题。
maya 中的代码如下:
import maya.OpenMayaUI as omUIfrom PySide import QtCore, QtGuiimport shiboken,time def getMayaWindow(): ptr = omUI.MQtUtil.mainWindow() return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow) class Project_Display: def __init__(self): self.mayaWin = getMayaWindow() def myShow(self): self.projectBtn = QtGui.QPushButton(self.mayaWin) self.projectBtn.setGeometry(QtCore.QRect(390, 110, 100, 23)) self.projectBtn.setObjectName("pushButton") self.projectBtn.setText( "PushButton") self.projectBtn.clicked.connect(self.test1) self.projectBtn.show() def test1(self): print 'test' def main(): aa = Project_Display() aa.myShow() main()
此时,maya窗口中出现了一个button,点击它,毫无反应。
笔者此时仔细阅读了代码,发现代码虽然写的不很漂亮,但是功能上貌似没有问题,就是看起来怪怪的。
在机缘巧合之下,笔者把main函数取消掉,实例化Project_Display这个类,再调用myShow方法,诡异的一幕产生了。
代码如下:
import maya.OpenMayaUI as omUIfrom PySide import QtCore, QtGuiimport shiboken,time def getMayaWindow(): ptr = omUI.MQtUtil.mainWindow() return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow) class Project_Display: def __init__(self): self.mayaWin = getMayaWindow() def myShow(self): self.projectBtn = QtGui.QPushButton(self.mayaWin) self.projectBtn.setGeometry(QtCore.QRect(290, 110, 100, 23)) self.projectBtn.setObjectName("pushButton") self.projectBtn.setText( "PushButton") self.projectBtn.clicked.connect(self.test1) self.projectBtn.show() def test1(self): print 'test' aa = Project_Display()aa.myShow()
为了避免按钮的重叠导致的结果不准,这里把按钮出现的位置向左挪了100个像素。
此时,点击按钮是有效的。
笔者此刻心中一万头草泥马呼啸而过。
虽然从功能上来讲,问题是得以解决,然而,公司代码规定,每个单独的包调用时候必须要有一个main()函数。
于是,笔者加入了partial,代码如下:
import maya.OpenMayaUI as omUIfrom PySide import QtCore, QtGuiimport shiboken,timefrom functools import partial def getMayaWindow(): ptr = omUI.MQtUtil.mainWindow() return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow) class Project_Display: def __init__(self): self.mayaWin = getMayaWindow() def myShow(self): self.projectBtn = QtGui.QPushButton(self.mayaWin) self.projectBtn.setGeometry(QtCore.QRect(190, 110, 100, 23)) self.projectBtn.setObjectName("pushButton") self.projectBtn.setText( "PushButton") self.projectBtn.clicked.connect(partial(self.test1)) self.projectBtn.show() def test1(self,*args): print 'test' def main(): aa = Project_Display() aa.myShow() main()
同样,为避免按钮重复,此时的按钮又向左移动了100个像素。
于是,按钮又起作用了。
如果说partial有用的话,lambda应该也有用,于是笔者又做了如下修改:
import maya.OpenMayaUI as omUIfrom PySide import QtCore, QtGuiimport shiboken,timefrom functools import partial def getMayaWindow(): ptr = omUI.MQtUtil.mainWindow() return shiboken.wrapInstance(long(ptr), QtGui.QMainWindow) class Project_Display: def __init__(self): self.mayaWin = getMayaWindow() def myShow(self): self.projectBtn = QtGui.QPushButton(self.mayaWin) self.projectBtn.setGeometry(QtCore.QRect(90, 110, 100, 23)) self.projectBtn.setObjectName("pushButton") self.projectBtn.setText( "PushButton") self.projectBtn.clicked.connect(lambda *args: self.test1()) self.projectBtn.show() def test1(self): print 'test' def main(): aa = Project_Display() aa.myShow() main()
好吧,它果然有用。
总结:
以后有空研究下pyside的信号机制。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标常用软件之Maya频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号