2015-01-12 5 views
0

Я пытаюсь выполнить проект, следуя за парнем на форуме, но когда я использую функцию щелчка, чтобы связать первый def со вторым def, моя цель - как я могу связать 2 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, но он не может работать.

+4

A 'def' называется «функцией» (в Python «def» является сокращением для «функции определения»). Во всяком случае, «это не работает» недостаточно информации - вы получаете сообщение об ошибке или просто ничего не делаете, когда нажимаете кнопку или ...? И что вы имеете в виду, когда вторая функция «понимает» первую функцию? –

+1

Я имею в виду, когда я использую код выше, он не может работать. Ошибка: она не может определить directionLabel. –

ответ

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') 
Смежные вопросы