【问题标题】:NameError: name is not defined. Why is Python throwing this error despite name being defined? [duplicate]NameError:名称未定义。尽管名称已定义,为什么 Python 仍会抛出此错误? [复制]
【发布时间】:2020-01-05 05:04:49
【问题描述】:

我正在 PyQt5 中构建一个简单的计算器。我正在使用以下代码:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QPushButton, QAction, QLineEdit, QMessageBox, QVBoxLayout, QTextBrowser
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Calculator')
        self.setGeometry(100, 100, 500, 300)

        self.layout = QVBoxLayout(self)
        self.setLayout(self.layout)

        self.number = QLineEdit(self)
        self.number.move(50, 50)
        self.number.resize(280, 40)
        self.number.setPlaceholderText('First number')
        self.layout.addChildWidget(self.number)

        self.number2 = QLineEdit(self)
        self.number2.move(50, 100)
        self.number2.resize(280, 40)
        self.number2.setPlaceholderText('Second number')
        self.layout.addChildWidget(self.number2)

        # minus button
        self.minus = QPushButton('-', self)
        self.minus.move(80, 180)
        self.minus.resize(20, 40)
        self.minus.clicked.connect(self.minus_onclick)
        self.layout.addChildWidget(self.minus)

        # plus button
        self.plus = QPushButton('+', self)
        self.plus.move(120, 180)
        self.plus.resize(20, 40)
        self.plus.clicked.connect(self.plus_onclick)
        self.layout.addChildWidget(self.plus)

        # * button
        self.into = QPushButton('*', self)
        self.into.move(160, 180)
        self.into.resize(20, 40)
        self.into.clicked.connect(self.into_onclick)
        self.layout.addChildWidget(self.into)

        # division button
        self.div = QPushButton('/', self)
        self.div.move(200, 180)
        self.div.resize(20, 40)
        self.div.clicked.connect(self.div_onclick)
        self.layout.addChildWidget(self.div)

        #equalto button
        self.equal = QPushButton('=', self)
        self.equal.move(240, 180)
        self.equal.resize(20, 40)
        self.equal.clicked.connect(self.equal_onclick)
        self.layout.addChildWidget(self.equal)


    def plus_onclick(self):
        op = '+'

    def minus_onclick(self):
        op = '-'

    def into_onclick(self):
        op = '*'

    def div_onclick(self):
        op = '/'

    #final calculator code
    def equal_onclick(self):
        num1 = int(self.number.text())
        num2 = int(self.number2.text())
        if op == '+':
            result = num1 + num2
            QMessageBox.question(self, 'Result-' + result , QMessageBox.Ok, QMessageBox.Ok)
        elif op == '-':
            result = num1 - num2
            QMessageBox.question(self, 'Result-' + result , QMessageBox.Ok, QMessageBox.Ok)
        elif op == '*':
            result = num1 * num2
            QMessageBox.question(self, 'Result-' + result , QMessageBox.Ok, QMessageBox.Ok)
        elif op == '/':
            result = num1 / num2
            QMessageBox.question(self, 'Result-' + result , QMessageBox.Ok, QMessageBox.Ok)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()

    sys.exit(app.exec_())

但是,当我按下“=”按钮时,出现以下错误: NameError: name 'op' is not defined

我完全不知道为什么python会抛出这个错误,有人可以指出错误吗?名称op定义的,我不明白错误的原因。 提前致谢。 :)

【问题讨论】:

  • 您想在所有op 用法前加上self.,以便改用self.op。这样,您实际上是在窗口实例中设置值,而不是写入被有效丢弃的局部变量(并且在您的 equal_onclick 方法中明确不可用)。

标签: python python-3.x pyqt5


【解决方案1】:

如果您希望变量在其他类方法中可见,您应该将op 称为self.op

在您的def equal_onclick(self): 方法中,您只需将其称为if op == '+':,并且该方法尝试将其视为应在方法中定义的变量,并且正如错误告诉您的那样,它不知道这是什么@ 987654325@ 变量是或包含。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2017-08-03
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多