0

请帮我 !

我正在用 Python 创建 GUI 可以在 3Ds Max 上运行,我听说有人说我必须使用 Pyside 来制作它。直到现在一切都很好。

这是我的代码:

import sys
from PySide import QtGui
from PySide.QtGui import *
from PySide.QtCore import *

class Window(QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.setMinimumHeight(660)
        self.setMinimumWidth(700)
        self.setMaximumHeight(660)
        self.setMaximumWidth(700)

        grid = QtGui.QGridLayout()
        grid.addWidget(self.First(), 0,0,2,0)


        self.setLayout(grid)

        self.setWindowTitle("Library")
        self.resize(700, 660)

    def First(self):
        groupBox = QtGui.QFrame()
        groupBox.setMaximumWidth(230)
        groupBox.setMaximumHeight(700)

        lbRenderer = QtGui.QLabel("Renderer :",self)
        lbFolders = QtGui.QLabel("Folders :",self)

        cbRenderer = QtGui.QComboBox(self)
        cbRenderer.addItem("Vray")
        cbRenderer.addItem("Octane")

        lvFolders = QtGui.QListView(self)
        lvFolders.setMaximumWidth(220)
        lvFolders.setMaximumHeight(500)

        btnAddNewObject = QtGui.QPushButton('Add New Objects',self)
        btnNewSet = QtGui.QPushButton('New Set',self)


        vbox = QtGui.QGridLayout()
        vbox.addWidget(lbRenderer,0,0)
        vbox.addWidget(cbRenderer,0,1,1,3)
        vbox.addWidget(lbFolders,2,0,1,4)
        vbox.addWidget(lvFolders,3,0,1,4)
        vbox.setColumnStretch(1, 1)
        vbox.addWidget(btnAddNewObject,4,0,1,2)
        vbox.addWidget(btnNewSet,4,3)


        groupBox.setLayout(vbox)
        return groupBox

app = QApplication.instance()
if app is None:
    app = QApplication(sys.argv)
    clock = Window()
    clock.show()
app.exec_()

我尝试了另一个与我的代码相同的代码,它通过“MAXScript Listener”运行良好。但我不知道为什么当我尝试运行它时,它什么也没有出现(我的 GUI 或警报是我的代码不好)。

这是我的命令

4

2 回答 2

1

首先 - 你初始化你的脚本错误,你调用返回的'initialize'函数#Success(意味着python初始化正确),但是你只需发送一个字符串(这是文件的路径),这什么都不做。你必须使用的是:

 python.ExecuteFile "C:\\Program Files\\Autodesk\\3ds Max 2015\\scripts\\Python\\yourPythonScript.py"

在 maxscript 侦听器\编辑器中。

欧特克文档说:

Autodesk 3ds Max 随附与 Python 2.7.3 兼容的 PySide 1.2 预构建版本。此版本包括以下模块子集:

QtCore
QtGui
QtNetwork
QtOpenGL
QtSql
QtSvg
QtTest
QtWebKit
QtXml

他们提供了一个简单的示例脚本,您可以运行它,将其保存在 python 文件中,然后使用开头提到的命令正确执行它。

代码在这里:

from PySide import QtGui
import MaxPlus

class _GCProtector(object):
    widgets = []

def make_cylinder():
    obj = MaxPlus.Factory.CreateGeomObject(MaxPlus.ClassIds.Cylinder)
    obj.ParameterBlock.Radius.Value = 10.0
    obj.ParameterBlock.Height.Value = 30.0
    node = MaxPlus.Factory.CreateNode(obj)
    time = MaxPlus.Core.GetCurrentTime()
    MaxPlus.ViewportManager.RedrawViews(time)

    return

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

def main():     
    MaxPlus.FileManager.Reset(True)
    w = QtGui.QWidget()
    w.resize(250, 100)
    w.setWindowTitle('Window')
    _GCProtector.widgets.append(w)
    w.show()

    main_layout = QtGui.QVBoxLayout()
    label = QtGui.QLabel("Click button to create a cylinder in the scene")
    main_layout.addWidget(label)

    cylinder_btn = QtGui.QPushButton("Cylinder")
    main_layout.addWidget(cylinder_btn)
    w.setLayout(main_layout)

    cylinder_btn.clicked.connect(make_cylinder)

if __name__ == '__main__':
    main()

他们还提到了这一点,这很重要:

通常使用 QtGui.QApplication() 在脚本中创建一个 PySide 应用程序对象。但是,在 3ds Max 中,已经有一个 PySide 应用程序正在运行,因此您可以获得该对象的句柄,如下所示:

QtGui.QApplication.instance()

将其用作启动脚本,并将您的 GUI 项目移植到该脚本中,它应该可以让您启动并运行。

于 2014-12-09T12:39:36.647 回答
0

我试图修复您的代码,但发生了任何事情,我不知道为什么。首先,我打开了您的代码并在 Pycharm 中运行它,但它无法运行。但它完全在 Maxscript Listener 中运行,你能给我解释一下吗?

其次,我试图修复您的代码。都是一样的,我可以在Maxscript上运行,但是里面的内容和功能都消失了。

这是我的代码

from PySide import QtGui
import MaxPlus

class _GCProtector(object):
    widgets = []


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

    def main():
        MaxPlus.FileManager.Reset(True)
        w = QtGui.QWidget()
        w.setWindowTitle('Window')
        _GCProtector.widgets.append(w)
        w.show()

        main_layout = QtGui.QGridLayout()
        main_layout.addWidget(First(),0,0)
        main_layout.addWidget(Second(),0,1)
        w.setLayout(main_layout)

    def First():
        groupBox = QtGui.QFrame()
        lbRenderer = QtGui.QLabel("Renderer :",self)
        vbox = QtGui.QGridLayout()
        vbox.addWidget(lbRenderer,0,0)
        groupBox.setLayout(vbox)
        return groupBox

    def Second():
        groupBox = QtGui.QFrame()
        lbRenderer = QtGui.QLabel("Renderer :",self)
        vbox = QtGui.QGridLayout()
        vbox.addWidget(lbRenderer,0,0)
        groupBox.setLayout(vbox)
        return groupBox

if __name__ == '__main__':
    main()

这是来自 Maxcript 的警报

于 2014-12-10T15:02:32.397 回答