Форма 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
Другие вопросы по тегам