为什么我不能通过点击定义两个def?

时间:2015-01-12 14:36:02

标签: python pyside maxscript

我正在尝试做项目跟随论坛上的一些人,但是当我使用点击功能将第一个def与第二个def链接时,我的目的是如何连接2 def def,而第二个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,但是它无法工作。

1 个答案:

答案 0 :(得分:1)

directionLabeladdnewobject内的局部变量,因此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')