pyqt 界面关闭信号_为什么在调用另一个python函数之前,pyqt信号中的错误会冻结用户界面?...

这篇博客讨论了一个在PySide2中使用Qt创建UI时遇到的问题,即静态方法在Maya 2017和2018中作为信号连接器的行为差异。作者发现静态方法在Maya 2017中会导致程序挂起,但在2018年则可以正常工作,除非直接从类内部调用。为了解决这个问题,建议避免使用静态方法,或者将它们包装在try/except块中。此外,升级到Maya 2017的更新4可能是另一种可能的解决方案。

正如我在评论中所说,我可以在2017年和2017年复制你的bug更新2,但在2018年工作得很好。

幸运的是,有一个足够简单的解决方案,您只需将方法移出

__init__

使其成为普通的实例方法。现在按预期执行错误。(老实说,在内部有一个嵌套函数

爱因斯坦

不管怎么说有点奇怪,我会把它搬走,不管它是不是小车)

有趣的是,静态方法也有同样的问题!如果你试着在课堂上给他们打电话,他们会挂起来的。但是,如果你在课堂之外调用它,它可以正常工作,或者如果你用

try

except

当从类内调用时,它现在将工作。

查看以下代码。我包括3个实例、一个实例方法、一个静态方法和一个用

尝试

除了

:

from PySide2 import QtWidgets, QtGui, QtCore

from shiboken2 import wrapInstance

import maya.OpenMayaUI as mui

mainWin = None

def showUI():

global mainWin

if mainWin != None:

print "reloading UI..."

mainWin.close()

mainWin = myWindow()

mainWin.show()

def getMayaWindow():

ptr = mui.MQtUtil.mainWindow()

return wrapInstance(long(ptr), QtWidgets.QWidget)

class myWindow(QtWidgets.QDialog):

def __init__(self, parent=getMayaWindow()):

super(myWindow, self).__init__(parent, QtCore.Qt.WindowStaysOnTopHint)

# Works.

self.testButton = QtWidgets.QPushButton('error')

self.testButton.clicked.connect(self.funcApply)

# Fails.

self.testButton2 = QtWidgets.QPushButton('error static method')

self.testButton2.clicked.connect(self.staticFuncApply)

# Works.

self.testButton3 = QtWidgets.QPushButton('error static method with try/except')

self.testButton3.clicked.connect(self.staticTryExceptFuncApply)

self.layout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.TopToBottom, self)

self.layout.addWidget(self.testButton)

self.layout.addWidget(self.testButton2)

self.layout.addWidget(self.testButton3)

self.setLayout(self.layout) # Normally need to specify what layout this widget needs to use.

# Move this out and make it a normal instanced method.

# This will work as expected.

def funcApply(self):

oooo # this should error!

# Static methods still broken, but ok in Maya 2018.

@staticmethod

def staticFuncApply():

oooo

# Static methods wrapped with try except works.

@staticmethod

def staticTryExceptFuncApply():

try:

oooo

except Exception as e:

print e

showUI()

# myWindow.staticFuncApply() # Calling static method outside of class works ok.

所有这些工作在玛雅2018年,但静态方法将在2017年失败。

希望您可以避免使用静态方法,因为将其全部包装在

尝试

除了

不是一个实际的解决方案。您还可以尝试将您的maya更新到2017更新4,以查看它是否已修补。

希望这有帮助!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值