确定。所以,我一直试图弄清楚这一点,我只是卡住了。每当我尝试运行它时,窗口就会立即打开和关闭。我似乎无法弄明白。请帮忙。
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()
答案 0 :(得分:2)
FreeCAD是一个Qt应用程序,这意味着如果已经实例化QApplication
并将其称为exec_()
方法。因此,您不需要在脚本中执行此操作,因为您可以 - 正如您所发现的那样 - 冻结或崩溃整个应用程序。
看起来,FreeCAD中的宏是使用exec()
编译和执行的,因此一旦执行完成,它们的状态(全局变量)就不会被保留。这意味着任何由PyQt而不是Qt拥有的QObject(基本上都是没有父级的QObject)将在被收集时被销毁。
一个简单的解决方案是在宏外部创建一个引用来保持对象不被收集。候选者在哪里提供这样的引用可以是__main__
或任何其他python模块:
...
import __main__
__main__.muffler = Muffler()
...
答案 1 :(得分:-2)
你缺少一些初始化。
尝试这个而不是调用Muffler():
app = QtGui.QApplication(sys.argv)
my_widget = Muffler()
sys.exit(app.exec_())
不要忘记在顶部添加:
import sys