Maya教程之maya中PySide一个很诡异的问题
白羽 2018-08-09 来源 :网络 阅读 1565 评论 0

摘要:本文将带你了解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频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程