You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Houdini PySide2 UI避免多实例创建及PySide版本适配疑问

Houdini Python Qt 窗口单实例实现与版本问题解答

窗口重复打开问题解决方案

实现逻辑

和你在Maya中用winID校验的思路完全一致,核心是给窗口添加全局唯一标识,每次执行脚本先做存在性校验:

  1. 给自定义窗口类设置唯一的objectName作为识别ID,作用等同于Maya的winID
  2. 每次运行脚本时,先获取Houdini主窗口,查找是否存在对应ID的窗口实例
  3. 若存在则先关闭、销毁旧实例,再创建新实例,避免多开

修改后完整代码

import sys
import webbrowser
import hou
from PySide2 import QtCore, QtUiTools, QtWidgets, QtGui

# 自定义窗口类
class someWidget(QtWidgets.QWidget):
    def __init__(self):
        super(someWidget,self).__init__()
        # 设置全局唯一的objectName,用于后续实例查找
        self.setObjectName("my_custom_someUI_window")
        ui_file = 'C:/Users/XY_Ab/Documents/houdini18.5/Folder_CGI/someUI.ui'
        self.ui = QtUiTools.QUiLoader().load(ui_file, parentWidget=self)
        self.setParent(hou.qt.mainWindow(), QtCore.Qt.Window)
        self.setFixedSize(437, 42)
        self.setWindowTitle("Requesting For Help")

# 存在性校验逻辑,等同于Maya的cmds.window(exists=True)校验
hou_main_window = hou.qt.mainWindow()
exist_window = hou_main_window.findChild(someWidget, "my_custom_someUI_window")
if exist_window:
    exist_window.close()
    exist_window.deleteLater()

# 新建并显示窗口
window_C = someWidget()
window_C.show()

PySide6无法导入的原因

Houdini的UI内核是基于固定版本的Qt编译的,不同版本的Houdini内置Qt版本是绑定死的:

  • 你当前使用的Houdini 18.5内置的是Qt5.x运行库,对应官方Python绑定就是PySide2
  • PySide6是Qt6.x对应的Python绑定,和Houdini内置的Qt5运行库接口完全不兼容,所以导入会直接报错
  • 截至Houdini 20的所有正式发行版本都仍在使用Qt5框架,除非后续Houdini官方将内核升级到Qt6,否则无法原生支持PySide6

内容的提问来源于stack exchange,提问作者AnD CGI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:57:03