0

我正在编写我的第一个 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()
4

2 回答 2

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()
于 2013-09-20T16:39:05.760 回答
1

toggleLED您在该引用中有几行名为 的变量board,但board从未在该方法范围内可访问的任何地方定义。

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

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

然后,您可以参考self.board需要访问该实例的任何位置(Screen当然是在课堂内)。

于 2013-09-20T16:39:13.153 回答