0

我正在尝试在论坛上关注某个人的项目,但是当我使用单击功能将第一个 def 与第二个 def 链接时,我的目的是如何将 2 def 相互链接,并且第二个 def 可以理解该功能在第一个定义中。这是我的代码

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使用闭包来传递一个引用,在这种情况下是一个匿名函数(lambda),它“捕获”directoryLabel变量并将其setExistingDirectory作为参数传递给。

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

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