Форма Pyqt в макросе FreeCAD не остается открытой
Хорошо. Итак, я пытался понять это некоторое время, и я просто застрял. Каждый раз, когда я пытаюсь запустить это, окно просто открывается и закрывается немедленно. Я просто не могу понять это. Пожалуйста помоги.
FYI. Это макрос для FreeCAD, который создает цилиндры. Я уже делал другие макросы, и они работают просто отлично. У меня не возникало проблем, пока я не представил PyQt GUI.
import FreeCAD, math
from FreeCAD import Base, Draft, Part
from PyQt4 import QtGui, QtCore
class Muffler(QtGui.QWidget):
def __init__(self):
super(Muffler, self).__init__()
self.initUI()
def initUI(self):
#Introduce Labels and inputs
self.t0 = QtGui.QLabel("Cylinder",self)
self.t01 = QtGui.QLabel(" ",self)
self.t1 = QtGui.QLabel("Radius of Cylinder (mm)",self)
self.l1 = QtGui.QLineEdit(self)
self.l1.setText("31.75")
self.t2 = QtGui.QLabel("Length of Cylinder (mm)",self)
self.l2 = QtGui.QLineEdit(self)
self.l2.setText("50")
#Create buttons
self.createButton = QtGui.QPushButton("Create",self)
self.cancelButton = QtGui.QPushButton("Cancel",self)
#Create window and size it
layout = QtGui.QGridLayout()
self.resize(240,180)
self.setWindowTitle("Cylinder")
#Design Layout of window
layout.addWidget(self.t0, 0, 0)
layout.addWidget(self.t01, 0, 1)
layout.addWidget(self.t1, 1, 0)
layout.addWidget(self.l1, 1, 1)
layout.addWidget(self.t2, 2, 0)
layout.addWidget(self.l2, 2, 1)
layout.addWidget(self.createButton, 3, 0)
layout.addWidget(self.cancelButton, 3, 1)
#Set Layout and show it
self.setLayout(layout)
self.show()
#Give functionality to the buttons
QtCore.QObject.connect(self.createButton, QtCore.SIGNAL('clicked()'),self.build)
QtCore.QObject.connect(self.cancelButton, QtCore.SIGNAL('clicked()'),self.close)
def build(self):
#some code
def close(self):
self.hide()
Muffler()
2 ответа
FreeCAD является приложением Qt, это означает, что если вы уже создали экземпляр QApplication
и назвал это exec_()
метод. Поэтому вам не нужно делать это в вашем скрипте, так как это может - как вы выяснили - заморозить или вывести из строя все приложение.
Как кажется, макросы во FreeCAD компилируются и выполняются с использованием exec()
и, следовательно, их состояние (глобальные переменные) не сохраняется после завершения выполнения. Это означает, что любые объекты QObject, которые принадлежат PyQt, а не Qt (которые в основном являются всеми объектами QObject, у которых нет родителя), будут уничтожены, когда они будут собраны.
Простым решением этой проблемы будет создание ссылки вне макроса, которая будет препятствовать сбору объекта. Кандидаты, куда можно поставить такую ссылку, могут быть __main__
или любой другой модуль Python:
...
import __main__
__main__.muffler = Muffler()
...
Вам не хватает инициализации.
Попробуйте это вместо вызова Muffler():
app = QtGui.QApplication(sys.argv)
my_widget = Muffler()
sys.exit(app.exec_())
Не забудьте добавить вверху:
import sys