未定义全局名称“variablename”

时间:2013-09-20 16:36:42

标签: python python-2.7

我正在编写我的第一个Python脚本并收到错误NameError: global name 'board' is not defined。为什么python会抛出这个错误,怎么修复呢?

class Screen(QtGui.QMainWindow):

    def __init__(self):

        super(Screen, self).__init__()
        self.initUI()


    def toggleLED(self, pressed):

        source = self.sender()

        if self.LedOn:
            source.setText('LED Off')
            self.LedOn = 0
            board.setHigh(13)
        else:           
            source.setText('LED On')
            self.LedOn = 1
            board.setLow(13)



def main():

    app = QtGui.QApplication(sys.argv)
    screen = Screen()   
    board = Arduino('COM3')

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:5)

名为board的变量是main()的本地变量,在Screen类的实例中不可见。

解决此问题的最简洁方法可能是让Screen的实例保留对board的引用:

class Screen(QtGui.QMainWindow):

    def __init__(self, board):

        super(Screen, self).__init__()
        self.board = board
        self.initUI()


    def toggleLED(self, pressed):

        source = self.sender()

        if self.LedOn:
            source.setText('LED Off')
            self.LedOn = 0
            self.board.setHigh(13)
        else:
            source.setText('LED On')
            self.LedOn = 1
            self.board.setLow(13)



def main():

    app = QtGui.QApplication(sys.argv)
    board = Arduino('COM3')
    screen = Screen(board)

    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

答案 1 :(得分:1)

toggleLED中有几行引用了一个名为board的变量,但board永远不会定义在该方法范围内可以访问的任何位置。

您可能希望在创建board对象时将其传递给Screen,以便Screen实例具有对该对象的引用。有很多方法可以做到这一点;如果某个板对Screen的功能至关重要,我会把它放在初始化器中:

def __init__(self, board):
    super(Screen, self).__init__()
    self.initUI()
    self.board = board

然后,您可以在需要访问该实例的任何地方引用self.board(当然在Screen课程内)。