基于Tkinter的测验程序无法从SQLite数据库递增题目求助
解决Tkinter测验程序无法更新数据库题目问题
看起来你遇到的核心问题是切换题目时没有更新现有页面上的标签内容,同时还有一些变量使用和数据库查询的小问题需要修正。我来一步步帮你解决:
问题分析
- 页面元素未绑定为实例变量:你在
__init__里创建的question、answer1等标签都是局部变量,后续无法在confirmAnswer方法中更新它们的内容。 - 错误的页面刷新方式:
lambda: controller.show_frame(ques)这行代码只是定义了一个匿名函数但没有执行,而且就算执行,也会创建新的ques实例,而非更新当前实例的内容。 - 数据库查询冗余:你对每个字段单独查询数据库,既低效又容易出错,应该一次性获取当前题目的所有数据。
- 未正确获取用户输入:
answerGiven = self.enterAnswer没有获取输入框的实际内容,应该用get()方法(假设self.enterAnswer是Entry组件)。
解决方案
我们可以重构代码,把显示内容的标签改为实例变量,新增加载题目的方法,在切换题目时直接调用该方法更新页面内容:
class ques(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) # 获取总题数,优化取值方式 cursor.execute("SELECT MAX(qnumber) FROM questions") self.recNum = cursor.fetchone()[0] or 0 recordNum = tk.Label(self, text=self.recNum) recordNum.pack() self.Qn = 1 self.quizScore = 0 # 创建实例变量存储标签,方便后续更新 self.question = tk.Label(self, text="") self.question.pack() self.answer1 = tk.Label(self, text="") self.answer1.pack() self.answer2 = tk.Label(self, text="") self.answer2.pack() self.answer3 = tk.Label(self, text="") self.answer3.pack() self.answer4 = tk.Label(self, text="") self.answer4.pack() self.rightOrWrong = tk.Label(self, text="") self.rightOrWrong.pack() # 用户输入答案的输入框 self.enterAnswer = tk.Entry(self) self.enterAnswer.pack() # 确认按钮绑定方法 confirm_btn = tk.Button(self, text="确认答案", command=self.confirmAnswer) confirm_btn.pack() # 加载第一题 self.load_question() def load_question(self): # 一次性获取当前题目的所有数据 cursor.execute(""" SELECT questioncontent, qanswer1, qanswer2, qanswer3, qanswer4, correctans FROM questions WHERE qnumber=? """, [self.Qn]) data = cursor.fetchone() if data: q_content, a1, a2, a3, a4, correct = data # 更新标签内容 self.question.configure(text=q_content) self.answer1.configure(text=a1) self.answer2.configure(text=a2) self.answer3.configure(text=a3) self.answer4.configure(text=a4) self.cA = correct # 清空提示和输入框 self.rightOrWrong.configure(text="") self.enterAnswer.delete(0, tk.END) def confirmAnswer(self): # 获取用户输入的答案并去除前后空格 answerGiven = self.enterAnswer.get().strip() correctAnswer = self.cA if answerGiven == correctAnswer: self.rightOrWrong.configure(text="Correct") self.quizScore += 1 else: self.rightOrWrong.configure(text="Incorrect") if self.Qn < self.recNum: self.Qn += 1 # 加载下一题 self.load_question() else: self.rightOrWrong.configure(text=f"Quiz Complete! Your score was: {self.quizScore}")
关键修改点
- 实例变量化标签:把所有显示题目和选项的标签改成
self.xxx,这样在load_question里可以用configure(text=...)直接更新内容。 - 新增
load_question方法:专门负责从数据库取题并更新页面,避免重复代码,也方便切换题目时调用。 - 优化数据库查询:用一条SQL语句获取所有需要的字段,
fetchone()直接返回元组,省去繁琐的字符串处理。 - 修正页面刷新逻辑:切换题目时直接调用
self.load_question(),而非重新创建frame。 - 正确获取用户输入:用
self.enterAnswer.get()获取输入框内容,并去除前后空格避免输入错误。
这样修改后,点击确认按钮后程序会判断答案对错,自动加载下一题并更新页面内容,完美解决你遇到的问题。
内容的提问来源于stack exchange,提问作者Joshua Baldassari
相关产品推荐
相关产品推荐

