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
相关产品推荐
相关产品推荐

