首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3 3dsMax和Modo的PySide Widget

3 3dsMax和Modo的PySide Widget
EN

Stack Overflow用户
提问于 2016-06-20 11:27:10
回答 1查看 808关注 0票数 2

我正在尝试使用PySide和Python创建一个简单的QT应用程序,如果需要的话,我希望它作为一个3 3dsMax脚本、一个Modo脚本和一个独立应用程序运行。因此,我在我的D中保存了以下文件:\PyTest。它只是这个测试的一个QLabel。

当我单独运行它(TestWidget.py)时,它工作得很好。当我从Modo启动它(ModoStart.py)时,它正确地启动了,但是如果我试图单击Modo中的任何位置,它就会崩溃整个窗口。在3 3dsMax中,我得到以下错误:跟踪(最近一次调用):文件"D:/PyTest\TestWidget.py",第13行,在SystemExit:-1

我有什么办法让它起作用吗?

谢谢,

尼克

TestWidget.py

代码语言:javascript
复制
import sys
from PySide import QtGui


def open_widget(app, parent_handle=None):
    w = QtGui.QLabel()
    w.setText("My Widget")
    w.show()

    if parent_handle is not None:
        w.setParent(parent_handle)

    sys.exit(app.exec_())


if __name__ == '__main__':
    open_widget(QtGui.QApplication(sys.argv))

MaxStart.py

代码语言:javascript
复制
import sys

FileDir = 'D:/PyTest'
if FileDir not in sys.path:
    sys.path.append(FileDir)

#Rest imports
from PySide import QtGui
import MaxPlus
import TestWidget
reload(TestWidget)

app = QtGui.QApplication.instance()
parent_handle = QtGui.QWidget(MaxPlus.GetQMaxWindow())
TestWidget.open_widget(app, parent_handle)

ModoStart.py

代码语言:javascript
复制
import sys

FileDir = 'D:/PyTest'
if FileDir not in sys.path:
    sys.path.append(FileDir)

#Rest imports
from PySide import QtGui
import TestWidget
reload(TestWidget)

app = QtGui.QApplication.instance()
TestWidget.open_widget(app)

更新:

我还尝试为所有三个选项(3 3dsMax/Modo/独立)提供一个文件。它似乎可以工作3 3dsMax和独立,但在Modo,如果我点击外面的Widget或如果我试图关闭它,莫多立即崩溃。

代码语言:javascript
复制
import sys
import traceback
from PySide import QtGui
handle = None
appMode = None
try:
    import MaxPlus
    appMode = '3dsMax'
    handle = MaxPlus.GetQMaxWindow()
except:
    try:
        import lx
        appMode = 'Modo'
    except:
        appMode = 'StandAlone'


app = QtGui.QApplication.instance()
if not app:
    app = QtGui.QApplication([])


def main():
    w = QtGui.QLabel(handle)
    w.setText("My Widget")
    w.resize(250, 100)
    w.setWindowTitle('PySide Qt Window')
    w.show()

    try:
        sys.exit(app.exec_())
    except Exception, err:
        traceback.print_exc()
        pass

main()
EN

回答 1

Stack Overflow用户

发布于 2016-06-21 11:21:06

好吧,在铸造公司的帮助下,我有了一个工作版本。他们给了我一个非常有用的链接http://sdk.luxology.com/wiki/CustomView

3dsMax.py

代码语言:javascript
复制
from PySide import QtGui
import MaxPlus
import sys
ui_dir = r'D:/PyTest/SubFolder/'
if not ui_dir in sys.path:sys.path.insert(0,ui_dir)
import ToolboxUI
reload(ToolboxUI)


parent = MaxPlus.GetQMaxWindow()

w = QtGui.QWidget(parent)
ToolboxUI.create_layout(w, '3dsMax')
w.show()

Modo.py

代码语言:javascript
复制
import lx
import lxifc
import sys
ui_dir = r'D:/PyTest/SubFolder/'
if not ui_dir in sys.path:sys.path.insert(0,ui_dir)
import ToolboxUI
reload(ToolboxUI)


class MyButtonTest(lxifc.CustomView):
    def customview_Init(self, pane):
        if pane is None:
            return False

        custom_pane = lx.object.CustomPane(pane)

        if custom_pane.test() is False:
            return False

        # get the parent object
        my_parent = custom_pane.GetParent()

        # convert to PySide QWidget
        p = lx.getQWidget(my_parent)

        # Check that it succeeds
        if p is not None:
            ToolboxUI.create_layout(p, 'Modo')
            return True

        return False

try:
    lx.bless(MyButtonTest, "My Button Test")
except:
    pass

StandAlone.py

代码语言:javascript
复制
from PySide import QtGui
import sys
import ToolboxUI

app = QtGui.QApplication([])

w = QtGui.QWidget()
ToolboxUI.create_layout(w, 'StandAlone')
w.show()

sys.exit(app.exec_())

ToolboxUI.py

代码语言:javascript
复制
from PySide import QtGui
appMode = None


def on_clicked(side):
    print "Hello from the " + side + " side: " + appMode


def left_click():
    on_clicked("left")


def center_click():
    on_clicked("center")


def right_click():
    on_clicked("right")


def create_layout(my_window, am):
    global appMode
    appMode = am

    buttonLayout = QtGui.QHBoxLayout()
    buttonLayout.setSpacing(0)

    leftButton = QtGui.QPushButton("Left")
    leftButton.setProperty("group", "left")
    leftButton.clicked.connect(left_click)

    rightButton = QtGui.QPushButton("Right")
    rightButton.setProperty("group", "right")
    rightButton.clicked.connect(right_click)

    centerButton = QtGui.QPushButton("Center")
    centerButton.setProperty("group", "center")
    centerButton.clicked.connect(center_click)

    buttonLayout.addWidget(leftButton)
    buttonLayout.addWidget(centerButton)
    buttonLayout.addWidget(rightButton)

    my_window.setLayout(buttonLayout)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37921360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档