无法使用 tkinter 在测验中从 sqlite 数据库中增加问题



我仍在研究我的测验程序,但我目前在让程序增加从我也有的数据库中检索到的问题时遇到了问题。当我尝试移动到数据库中的下一条记录时,我无法实际更改页面的内容,一切都保持原样,到目前为止我无法纠正该问题。我觉得这是我使用变量的问题,但我想不出任何解决方法。这是我的代码中遇到此问题的部分:

class ques(tk.Frame):
def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    fetchrecNum = "SELECT MAX(qnumber) FROM questions"
    cursor.execute(fetchrecNum)
    self.recNum=str(cursor.fetchall())
    self.recNum=self.recNum.strip("[('")
    self.recNum=self.recNum.strip("',)]")
    self.recNum=int(self.recNum)
    recordNum = tk.Label(self, text = self.recNum)
    recordNum.pack()
    self.Qn = 1
    self.quizScore = 0
    fetchQ = "SELECT questioncontent FROM questions WHERE qnumber=?"
    cursor.execute(fetchQ, [self.Qn])
    Q=str(cursor.fetchall())
    Q=Q.strip("[('")
    Q=Q.strip("',)]")
    question = tk.Label(self, text = Q)
    question.pack()
    fetchA1 = "SELECT qanswer1 FROM questions WHERE qnumber=?"
    cursor.execute(fetchA1, [self.Qn])
    A1=str(cursor.fetchall())
    A1=A1.strip("[('")
    A1=A1.strip("',)]")
    answer1 = tk.Label(self, text = A1)
    answer1.pack()
    fetchA2 = "SELECT qanswer2 FROM questions WHERE qnumber=?"
    cursor.execute(fetchA2, [self.Qn])
    A2=str(cursor.fetchall())
    A2=A2.strip("[('")
    A2=A2.strip("',)]")
    answer2 = tk.Label(self, text = A2)
    answer2.pack()
    fetchA3 = "SELECT qanswer3 FROM questions WHERE qnumber=?"
    cursor.execute(fetchA3, [self.Qn])
    A3=str(cursor.fetchall())
    A3=A3.strip("[('")
    A3=A3.strip("',)]")
    answer3 = tk.Label(self, text = A3)
    answer3.pack()
    fetchA4 ="SELECT qanswer4 FROM questions WHERE qnumber=?"
    cursor.execute(fetchA4, [self.Qn])
    A4=str(cursor.fetchall())
    A4=A4.strip("[('")
    A4=A4.strip("',)]")
    answer4 = tk.Label(self, text = A4)
    answer4.pack()
    fetchcA ="SELECT correctans FROM questions WHERE qnumber=?"
    cursor.execute(fetchcA, [self.Qn])
    self.cA=str(cursor.fetchall())
    self.cA=self.cA.strip("[('")
    self.cA=self.cA.strip("',)]")

def confirmAnswer(self):
    answerGiven = self.enterAnswer
    correctAnswer = self.cA
    if answerGiven == correctAnswer:
        self.rightOrWrong.configure(text ="Correct")
        self.quizScore = (self.quizScore + 1)
    else:
        self.rightOrWrong.configure(text="Incorrect")
    if self.Qn < self.recNum:
        self.Qn = (self.Qn+1)
        lambda: controller.show_frame(ques)
    else:
        self.rightOrWrong.configure(text="Quiz Complete! Your score was: " + str(self.quizScore))

不确定我还能如何尝试更改页面的内容,但我希望我可以向这里的其他人学习,因为我周围没有人非常乐于助人(包括老师(,这是我最好的选择。提前感谢任何帮助。

我无法测试它,但我会像在代码中一样做一些事情。

__init__我创建了空标签并执行了从数据库中读取数据并将它们放在标签中的分离方法。 稍后我可以使用此方法获取下一个问题。

要从数据库中获取一行,您可以使用 fetchone() .要从行中获取数据,您不必使用str()strip()而是索引row[0]row[1]等。如果数据库中的列顺序不同,则可能需要更改索引。

class ques(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.Qn = 1
        self.quizScore = 0
        self.correctAnswer = ''  # <-- create it at start (and use better name)
        # v-- create empty labels
        self.recordNum = tk.Label(self, text='')
        self.recordNum.pack()
        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.update_question_number() # <-- get question number
        self.update_question()        # <-- get new question
    def update_question_number(self)
        # Get question's number
        query = "SELECT MAX(qnumber) FROM questions"
        cursor.execute(query)
        row = cursor.fetchone()
        self.recordNum['text'] = row[0]
    def update_question(self):
        # Get new question
        query = "SELECT * FROM questions WHERE qnumber=?"
        cursor.execute(query, (self.Qn,))
        row = cursor.fetchone()
        self.question['text'] = row[0]
        self.answer1['text'] = row[1]
        self.answer2['text'] = row[2]
        self.answer3['text'] = row[3]
        self.answer4['text'] = row[4]
        self.correctAnswer = row[5]    
    def confirmAnswer(self):
        if self.enterAnswer == self.correctAnswer:
            self.rightOrWrong['text'] = "Correct"
            self.quizScore += 1
        else:
            self.rightOrWrong['text'] = "Incorrect"
        if self.Qn < self.recNum:
            self.Qn += 1           # <-- get new question
            self.update_question() # <-- get new question
            #lambda: controller.show_frame(ques) # ??? do you have to change frame ???
        else:
            self.rightOrWrong.['text'] = "Quiz Complete! Your score was: {}".format(self.quizScore)

最新更新