PySide Widget для 3dsMax и Modo
Я пытаюсь создать простое приложение QT с использованием PySide и Python, которое я хочу запускать как скрипт 3dsMax, скрипт Modo и автономное приложение, если это необходимо. Итак, я сохранил следующие файлы в моем D:\PyTest. Это просто QLabel для этого теста.
Когда я запускаю его (TestWidget.py) как отдельный, он работает нормально. Когда я запускаю его (ModoStart.py) из Модо, он запускается правильно, но если я пытаюсь щелкнуть в любом месте Модо, он вылетает во все окно. В 3dsMax я получаю следующую ошибку: Traceback (последний вызов был последним): файл "D:/PyTest\TestWidget.py", строка 13, в SystemExit: -1
Любые идеи, как я могу заставить это работать?
Спасибо,
Ник
TestWidget.py
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
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
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)
ОБНОВИТЬ:
Я также пытался иметь один файл для всех трех вариантов (3dsMax/Modo/Stand-alone). Кажется, что он отлично работает для 3dsMax и Stand-Alone, но в Modo, если я нажимаю за пределами виджета или пытаюсь закрыть его, Modo мгновенно вылетает.
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()
1 ответ
Хорошо, с небольшой помощью The Foundry у меня есть рабочая версия. Они дали мне эту очень полезную ссылку http://sdk.luxology.com/wiki/CustomView
3dsMax.py
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
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
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
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)