0

行。所以,我一直试图弄清楚这一点,但我只是卡住了。每次我尝试运行它时,窗口都会立即打开和关闭。我似乎无法弄清楚。请帮忙。

供参考。这是用于创建圆柱体的 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()
4

2 回答 2

2

FreeCAD 是一个 Qt 应用程序,这意味着 if 已经实例化了 aQApplication并调用了它的exec_()方法。因此,您不需要在脚本中执行此操作,因为这会 - 正如您发现的那样 - 冻结或崩溃整个应用程序。

看起来,FreeCAD 中的宏是使用 编译和执行的exec(),因此一旦执行完成,它们的状态(全局变量)就不会被保留。这意味着任何由 PyQt 而不是 Qt 拥有的 QObject(基本上都是没有父级的 QObject)将在垃圾收集时被销毁。

一个简单的解决方案是在宏之外创建一个引用,以防止对象被收集。放置此类引用的候选人可以是__main__或任何其他 python 模块:

...
import __main__
__main__.muffler = Muffler()
...
于 2014-05-20T22:22:23.813 回答
-2

您缺少一些初始化。

试试这个,而不是调用 Muffler():

app = QtGui.QApplication(sys.argv)
my_widget = Muffler()
sys.exit(app.exec_())

不要忘记在顶部添加:

import sys
于 2014-05-20T13:25:56.447 回答