python - 在 Maya 中正确使用 PySide QThread 以避免硬崩溃
问题描述
我正在尝试使用 QThreads 在 Maya 中更新我的自定义工具的基于 Qt 的 UI。我有一个线程执行任意方法并通过发出的信号返回结果,然后我用它来更新我的 UI。这是我的自定义 QThread 类:
from PySide import QtCore
class Thread(QtCore.QThread):
result = QtCore.Signal(object)
def __init__(self, parent, method, **kwargs):
super(Thread, self).__init__(parent)
self.parent = parent
self.method = method
self.kwargs = kwargs
def run(self):
result = self.method(**self.kwargs)
self.result.emit(result)
我传递给线程的方法是从网址获取序列化数据的基本请求,例如:
import requests
def request_method(address):
request = requests.get(address)
return request.json()
以下是我如何使用自定义工具中的线程来动态更新我的 UI:
...
thread = Thread(parent=self, method=request_method, address='http://www.example.com/')
thread.result.connect(self._slot_result)
thread.start()
def _slot_result(self, result):
# Use the resulting data to update some UI element:
self.label.setText(result)
...
此工作流程适用于 Nuke 等其他 DCC,但由于某种原因,它会导致 Maya 有时会不一致地崩溃。没有错误消息,没有日志,只是硬崩溃。
这让我觉得我的 QThread 工作流程设计显然对 Maya 不友好。在使用 QThreads 时如何最好地避免 Maya 崩溃以及可能导致此特定问题的任何想法?
解决方案
我们工作室的一位工程师发现了一些与使用 Python 线程和 PyQt/PySide 相关的错误。请参阅:
- [PySide 1.x] https://bugreports.qt.io/browse/PYSIDE-810
- [PySide 2.x] https://bugreports.qt.io/browse/PYSIDE-813
记者备注:
尽管 QObject 是可重入的,但 GUI 类,尤其是 QWidget 及其所有子类,不是可重入的。它们只能在主线程中使用。
推荐阅读
- javascript - XMLHttp Javascript - 如何删除自动刷新
- plotly - 带有一个下拉列表和多个选择器的 Plotly Dash 散点图(全部)
- angular - 电容存储时序问题
- javascript - 如何在循环中执行事件,直到事件为真
- c# - C#:从数组中删除许多元素
- excel-2010 - 使用 excel 和 Visual Basic 每十秒计数一次
- python - Django 身份验证流程如何工作?【特例】
- node.js - find() 方法不适用于猫鼬中的异步函数
- java - JTable排序和渲染
- openvpn - 如何进行第 2 层 OpenVPN 站点到站点设置