Экземпляр QApplication уже существует
Я делаю несколько простых PySide на 3Dsmax 2015.
Это моя ошибка:
python.ExecuteFile "C:\Program Files\Autodesk\3ds Max 2015\scripts\Python\demoUniTest.py"
-- Runtime error: Line 32 <module>()
<type 'exceptions.RuntimeError'> A QApplication instance already exists.
Это мой код:
import sys
from PySide.QtCore import *
from PySide.QtGui import *
from math import *
class Form(QDialog):
def __init__(self,parent=None):
super(Form,self).__init__(parent)
self.browser = QTextBrowser()
self.lineedit = QLineEdit("Type an expression and press Enter")
self.lineedit.selectAll()
layout = QVBoxLayout()
layout.addWidget(self.browser)
layout.addWidget(self.lineedit)
self.setLayout(layout)
self.lineedit.setFocus()
self.connect(self.lineedit, SIGNAL("returnPressed()"),self.updateUi)
self.setWindowTitle("Calculate")
def updateUi(self):
try:
text = self.lineedit.text()
self.browser.append("%s = <b>%s</b>" % (text,eval(text)))
except:
self.browser.append("<font color=red>%s is invalid</font>" %text)
app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
Когда я использую этот код на Picharm, не возникает никаких ошибок. Появляется только при использовании в 3Dsmax 2015 Listener
3 ответа
Прямая ссылка из файла справки ( используя PySide):
Обычно каждый создает объект приложения PySide в скрипте, используя QtGui.QApplication(). Однако в 3ds Max уже запущено приложение PySide, поэтому вы получаете дескриптор для этого объекта, например:
QtGui.QApplication.instance()
Как примечание, это несколько изменилось в 3DS Max 2018 и PySide2. Я просто сейчас играю с этим, и я смог заставить его работать после небольшого количества попыток. Вот ссылка на документацию, хотя следует помнить, что в коде есть небольшая опечатка (по крайней мере, на момент написания): http://help.autodesk.com/view/3DSMAX/2018/ENU/?guid=__developer_what_s_new_in_3ds_max_python_api_what_s_new_in_the_3ds_max_2018_p_html
Как упоминалось в других ответах, вам нужно сделать свой пользовательский интерфейс дочерним по отношению к основному приложению 3DS Max. Хорошей новостью является то, что они немного упростили это для вас с помощью функции GetQMaxMainWindow()
, Используйте это так:
from PySide2 import QtWidgets, QtCore, QtGui
import MaxPlus
import os
class SampleUI(QtWidgets.QDialog):
def __init__(self, parent=MaxPlus.GetQMaxMainWindow()):
super(SampleUI, self).__init__(parent)
self.initUI()
def initUI(self):
self.testBtn = QtWidgets.QPushButton("Test")
mainLayout = QtWidgets.QHBoxLayout()
testBtn = QtWidgets.QPushButton("Test!")
mainLayout.addWidget(testBtn)
self.setLayout(mainLayout)
if __name__ == "__main__":
try:
ui.close()
except:
pass
ui = SampleUI()
ui.show()
Вы создаете экземпляр QApplication в строке:
app = QApplication(sys.argv)
И получаю эту ошибку, потому что есть еще один экземпляр QApplication, созданный где-то до этого (предположительно где-то в "3Dsmax 2015 Listener"), и вам разрешен только один.
Увидеть: