You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt4开发儿童数学游戏:列表内容无法显示到GUI的问题排查

解决PyQt4中AttributeError: 'Ui_Form' object has no attribute 'l'的问题

咱们先拆解你遇到的错误,再一步步修复代码里的其他小问题:

错误根源分析

你看到的AttributeError是因为**self.l这个属性在retranslateUi执行的时候还没被创建**:

  • retranslateUi在setupUi方法里被直接调用,这时候程序刚启动,submit方法还没执行(只有点击SUBMIT按钮才会触发submit),所以self.l根本还没被定义,自然会报错说对象没有这个属性。
  • 另外你的submit方法里self.l = []只是把它设为空列表,这显然不是你要的数学题目内容;还有self.lineEdit.text == self.l()这行有两个低级错误:text是QLineEdit的属性,要获取输入文本得用text()方法;self.l是列表,不能加括号当函数调用。

分步修复方案

1. 提前初始化self.l属性

在Ui_Form类里提前初始化self.l,确保它在任何方法调用前都存在。可以加个构造方法:

class Ui_Form(object):
    def __init__(self):
        # 初始化列表,存题目字符串和正确答案,默认显示欢迎语
        self.l = ["Welcome!", 0]
    
    # 原有submit方法...

2. 修正submit方法的逻辑

你的submit方法需要生成随机数学题目,还要正确对比用户输入的答案:

def submit(self):
    # 随机生成1-10之间的加减法题目(这里用加法举例,你可以扩展成减法/乘法)
    num1 = random.randint(1, 10)
    num2 = random.randint(1, 10)
    # 把题目字符串和正确答案存到self.l里
    self.l = [f"{num1} + {num2}", num1 + num2]
    
    # 获取用户输入,处理非数字的情况
    try:
        user_answer = int(self.lineEdit.text().strip())
        if user_answer == self.l[1]:
            print("Correct!")
        else:
            print(f"Incorrect! The right answer is {self.l[1]}")
    except ValueError:
        print("Oops! Please enter a valid number.")
    
    # 更新label显示新的题目
    self.label.setText(_translate("Form", self.l[0], None))

3. 修复retranslateUi里的setText调用

_translate的第二个参数必须是字符串,而你原来传的是列表self.l,所以要改成列表里的题目字符串:

def retranslateUi(self, Form):
    Form.setWindowTitle(_translate("Form", "Math Game", None))
    self.lineEdit.setStatusTip(_translate("Form", "Enter answer here", None))
    self.pushButton.setText(_translate("Form", "SUBMIT", None))
    # 显示列表里的题目(初始化时是欢迎语)
    self.label.setText(_translate("Form", self.l[0], None))

完整修改后的代码

from PyQt4 import QtCore, QtGui
import random

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Form(object):
    def __init__(self):
        # 初始化题目列表,存[题目字符串, 正确答案]
        self.l = ["Welcome!", 0]

    #this is backend code
    def submit(self):
        # 生成随机加法题目
        num1 = random.randint(1, 10)
        num2 = random.randint(1, 10)
        self.l = [f"{num1} + {num2}", num1 + num2]

        # 获取并验证用户输入
        try:
            user_answer = int(self.lineEdit.text().strip())
            if user_answer == self.l[1]:
                print("Correct!")
            else:
                print(f"Incorrect! The right answer is {self.l[1]}")
        except ValueError:
            print("Oops! Please enter a valid number.")
        
        # 更新label显示题目
        self.label.setText(_translate("Form", self.l[0], None))

    #this is GUI code
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.setEnabled(True)
        Form.resize(311, 192)
        Form.setLayoutDirection(QtCore.Qt.LeftToRight)
        Form.setAutoFillBackground(True)

        self.lineEdit = QtGui.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(10, 140, 191, 41))
        self.lineEdit.setAlignment(QtCore.Qt.AlignCenter)
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Calibri"))
        font.setPointSize(20)
        font.setFamily(_fromUtf8("Calibri"))
        self.lineEdit.setFont(font)
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))

        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(210, 140, 91, 41))
        self.pushButton.clicked.connect(self.submit)
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("Calibri"))
        font.setPointSize(12)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.widget = QtGui.QWidget(Form)
        self.widget.setGeometry(QtCore.QRect(10, 10, 291, 121))
        self.widget.setAutoFillBackground(True)
        p = self.widget.palette()
        p.setColor(self.widget.backgroundRole(), QtCore.Qt.white)
        self.widget.setPalette(p)
        self.widget.setObjectName(_fromUtf8("widget"))

        self.label = QtGui.QLabel(self.widget)
        self.label.setGeometry(QtCore.QRect(60, 40, 341, 41))
        font = QtGui.QFont()
        font.setPointSize(24)
        self.label.setFont(font)
        self.label.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label.setObjectName(_fromUtf8("label"))

        self.widget.raise_()
        self.lineEdit.raise_()
        self.pushButton.raise_()

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    #translation of names from output name to edited name
    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Math Game", None))
        self.lineEdit.setStatusTip(_translate("Form", "Enter answer here", None))
        self.pushButton.setText(_translate("Form", "SUBMIT", None))
        self.label.setText(_translate("Form", self.l[0], None))

# 运行程序的入口代码
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

现在运行代码,启动后label会显示欢迎语,点击SUBMIT按钮会生成随机加法题目,输入答案后会在控制台输出对错提示,完美解决你的问题啦!

内容的提问来源于stack exchange,提问作者user9468043

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:09:09