0

Ok。だから、私はしばらくこれを理解しようとしてきましたが、行き詰まっています。これを実行しようとするたびに、ウィンドウが開いてすぐに閉じます。私はそれを理解できないようです。助けてください。

ご参考までに。円柱を作成する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 アプリケーションです。つまり、既に をインスタンス化し、そのメソッドQApplicationを呼び出しているexec_()場合です。したがって、スクリプトでそれを行う必要はありません。これにより、アプリケーション全体がフリーズまたはクラッシュする可能性があることがわかりました。

どうやら、FreeCAD のマクロは を使用してコンパイルおよび実行されるexec()ため、実行が終了するとその状態 (グローバル変数) は保持されません。つまり、Qt ではなく PyQt が所有する QObjects (基本的に親を持たないすべての QObjects) は、ガベージ コレクションされると破棄されます。

これに対する簡単な解決策は、オブジェクトが収集されないようにするマクロの外部への参照を作成することです。そのような参照を置く場所の候補は、__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 に答える