0

フォーラムで誰かに従ってプロジェクトを実行しようとしていますが、クリックされた関数を使用して最初の定義を2番目の定義にリンクするとき、私の目的は2つの定義を互いにリンクする方法であり、2番目の定義は関数を理解できます最初の定義で。これは私のコードです

def addnewobject():
    w = QtGui.QWidget()
    w.setFixedSize(450,90)
    w.setWindowTitle('Select folder of new objects')
    _GCProtector.widgets.append(w)
    w.show()

    frameStyle = QtGui.QFrame.Sunken | QtGui.QFrame.Panel
    folder_lb = QtGui.QLabel("Folder : ")
    directoryLabel = QtGui.QLabel()
    directoryLabel.setFrameStyle(frameStyle)
    browse_btn=QtGui.QPushButton("Browse...")
    ex_lb = QtGui.QLabel("( ex : SCH, faucet, K7 )")
    cancel_btn = QtGui.QPushButton("Cancel")
    ok_btn = QtGui.QPushButton("OK")

    browser = QtGui.QGridLayout()
    browser.addWidget(folder_lb,0,0)
    browser.addWidget(directoryLabel,0,1,1,4)
    browser.addWidget(browse_btn,0,5)
    browser.addWidget(ex_lb,1,0,1,5)
    browser.addWidget(cancel_btn,2,4)
    browser.addWidget(ok_btn,2,5)
    browser.setColumnStretch(1, 1)
    w.setLayout(browser)

    browse_btn.clicked.connect(setExistingDirectory)
    cancel_btn.clicked.connect(w.close)

def setExistingDirectory():
    options = QtGui.QFileDialog.DontResolveSymlinks | QtGui.QFileDialog.ShowDirsOnly
    directory = QtGui.QFileDialog.getExistingDirectory("QFileDialog.getExistingDirectory()",directoryLabel.text(), options)
    if directory:
        directoryLabel.setText(directory)

browse_btn を使用して addnewobject から setExistingDirectory にリンクし、directoryLabel を定義していますが、機能しません。

4

1 に答える 1

1

directionLabelは 内のローカル変数なaddnewobjectので、setExistingDirectoryアクセスできません。そのラベルへの参照を、両方の関数が「見る」ことができる場所に保存する必要があります。

これらの関数がクラス内にある場合は、メンバー変数を使用します (接頭辞 を付けますself.)。これは私が推奨するアプローチです:

class MyApplication:
    def addnewobject(self):
        # (...)
        self.directionLabel = QtGui.QLabel()
        # (...)
        browse_btn.clicked.connect(self.setExistingDirectory)

    def setExistingDirectory(self):
        # (...)
        self.directoryLabel.setText('Test')

それらがトップレベルの関数である場合、グローバル変数は次のようになります。

directionLabel = None

def addnewobject():
    global directionLabel
    # (...)
    directionLabel = QtGui.QLabel()
    # (...)

def setExistingDirectory():
    directoryLabel.setText('Test')

または、クロージャーを使用して参照を渡すことができます。この場合、変数を「キャプチャ」して引数として渡すsetExistingDirectory無名関数 ( ) です。lambdadirectoryLabelsetExistingDirectory

def addnewobject():
    # (...)
    browse_btn.clicked.connect(lambda: setExistingDirectory(directoryLabel))

def setExistingDirectory(label):
    # (...)
    label.setText('Test')
于 2015-01-12T15:39:42.563 に答える