我正在尝试做项目跟随论坛上的一些人,但是当我使用点击功能将第一个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,但是它无法工作。
答案 0 :(得分: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')