2014-05-19 10 views
0

Ok. 그래서, 나는 이것을 잠시 동안 알아 내려고 노력해 왔고, 나는 막 붙어 있습니다. 매번이 프로그램을 실행하려고하면 창이 즉시 열리고 닫힙니다. 나는 그것을 알아낼 수없는 것 같습니다. 도와주세요.FreeCAD 매크로의 Pyqt 양식이 열려 있지 않습니다.

참고하시기 바랍니다. 이것은 실린더를 만드는 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

여기서 나머지 코드는 무엇입니까? 위젯을 실제로 인스턴스화하고 표시하는 위치는 어디입니까? 아마도 그 오류가있을 것입니다. – M4rtini

+0

'QtGui.QWidget'은 클래스에 포함되어 있고'init' 정의에서'self'로 식별되기 때문에'self.show'로 호출 할 수 있습니다. 'self.show'를 호출 한 직후'sleep (0)'에 추가하면 윈도우가 나타나지만 버튼이 작동하지 않습니다. –

+0

확인, 간단한 확인. 어디에서나 스크립트에'QtGui.QApplication'을 가지고 있습니까? – M4rtini

답변

2

FreeCAD 이미 가만히 있으면 의미 Qt는 응용 프로그램입니다 QApplication을 인스턴스화하고 exec_() 메소드라고합니다. 따라서 스크립트에서 그렇게 할 필요가 없습니다. 알 수 있듯이 전체 응용 프로그램이 멈추거나 중단 될 수 있습니다.

FreeCAD의 매크로는 exec()을 사용하여 컴파일되고 실행되므로 실행이 완료되면 상태 (전역 변수)가 보존되지 않습니다. 즉, Qt가 아닌 PyQt가 소유하고있는 모든 QObject (기본적으로 부모가없는 모든 QObject)는 수집 된 garbaged 때 파괴됩니다.

이 간단한 솔루션은 개체가 수집되지 않도록 매크로 외부에 참조를 만드는 것입니다. 그러한 참조를 넣을 수있는 곳은 __main__이나 다른 파이썬 모듈이 될 수 있습니다.

... 
import __main__ 
__main__.muffler = Muffler() 
... 
+0

친애하는 친구, 당신은 천재입니다! 이것은 그것을 정당하게 고쳤다. 너를 빚 졌어. 다시 한 번 감사드립니다! 당신은이기는 대답으로 관을 씌울 것입니다. '9 (^ ‿ ^) 6' –

-2

일부 초기화가 누락되었습니다.

대신 머플러()에 대한 호출이 시도 :

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

가 상단에 추가하는 것을 잊지 마십시오 :

import sys 
+0

FreeCAD를위한 매크로이기 때문에, FreeCAD가 끝나면 FreeCAD를 닫으므로'sys.exit (app.exec _()) '를 사용할 수 없습니다. –

+0

그런데'sys.exit (app.exec _()) '를 제거하고 FreeCAD를 실행할 때 FreeCAD가 종료되었습니다.창은 여전히 ​​작동하지만 FreeCAD의 모든 기능이 제거됩니다. 나는 그것을 닫아야 만한다. –