2017-12-31 222 views
-1

저는 여전히 퀴즈 프로그램에서 작업하고 있지만, 현재 가지고있는 데이터베이스에서 검색된 질문을 증가시키는 프로그램을 얻는 데 문제가 있습니다. 데이터베이스의 다음 레코드로 이동하려고 할 때 페이지의 내용을 실제로 변경할 수 없었기 때문에 모든 것이 그대로 유지되며이 시점에서 문제를 해결할 수 없었습니다. 변수의 사용에 문제가있는 것처럼 느껴지지만이 문제를 해결할 수있는 방법은 없습니다. 여기에 내 코드의 섹션입니다 나는이 문제에 봉착 여기서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)) 

내가 페이지의 내용을 변경하려고 노력에 대해 갈 수있는 방법을 다른 모르겠어요을하지만 난 내가 누군가로부터 배울 수 있기를 바랍니다 다른 곳에서는 아무도 주변에 아무도 (교사를 포함하여) 매우 도움이되지 않으며 이것이 내가 가진 최선의 선택입니다. 모든 도움을 미리 감사드립니다.

+0

자신이 [A, 최소 완료하고 검증 가능한 예]를 제공 도와 줘요 싶어 경우 (https://stackoverflow.com/help/mcve). – Nae

+0

하나의 검색어로 전체를 가져올 수 없습니까? 그리고 다른 질문을하기 위해 여러 번 실행할 수있는 분리 된 함수 (매개 변수 포함)에서이 작업을 수행해야합니다. '__init__'에서 빈 레이블 만 넣으면됩니다. – furas

+0

왜 fetchall을'str()'으로 변환합니까? 이것 없이는'[('과')]'을 제거 할 필요가 없습니다. 튜토리얼을 찾고 데이터베이스 작업 방법을 배워야하는 것 같습니다. – furas

답변

0

나는 그것을 테스트 할 수는 없지만 코드에서 뭔가를 할 것입니다.

__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)