2016-10-16 4 views
1

간단한 퀴즈 프로그램을 만들려고합니다. 10 가지 질문 범위의 모든 질문에 대해 텍스트를 변경하도록 라벨을 지정합니다. 따라서 1 번 질문에 '1 번 질문'이라고 표시됩니다. 하지만 즉시 '질문 10'이 표시되며 퀴즈를 칠 수 없습니다.루프 내 tkinter 레이블 텍스트를 계속 변경할 수 없습니다.

사전에는 단 하나의 질문 만 있지만 문제가 아니어야하며 그 질문을 10 번 반복해야합니다.

여기 내 코드의 조각입니다 (이 클래스의) :

self.label = tk.Label(self, text="This is page 1") 
    self.label.pack(side="top", fill="x", pady=10) 
    self.label1 = tk.Label(self, text='') 
    self.label1.pack() 
    self.label2 = tk.Label(self, text='') 
    self.label2.pack() 
    self.entry1 = tk.Entry(self) 
    self.entry1.pack() 
    self.label3 = tk.Label(self, text='') 
    self.label3.pack() 
    self.entry2 = tk.Entry(self) 
    self.entry2.pack() 

    my_dict = { 
     "Base-2 number system": "binary", 
    } 

    score = 0 

    for i in range(10): 
     question = (random.choice(list(my_dict.keys()))) 
     answer = my_dict[question] 
     self.label1.config(text=("Question " + str(i + 1))) 
     self.label2.config(text=(question + "?")) 

     guess = self.entry1.get() 

     if guess.lower() == answer.lower(): 
       score += 1 
     else: 
       score += 0 

    self.label3.config(text=("Your final score was " + str(score))) 
+2

사용자가 입력 위젯에 응답을 입력 할 때까지 기다려야합니다. 귀하의 코드는 그렇게하지 않습니다. BTW, 당신의 코드가 우리가 실행하고 수정할 수있는 [mcve]라면 당신을 도울 것입니다. –

+0

은'Label' 대신'Button'을 사용할 수 있습니다. 사용자가 버튼을 클릭하면 버튼의 텍스트가 변경됩니다. Button (..., command = function_name)을 사용하여 버튼에 기능을 할당 할 수 있습니다. – furas

답변

1

당신은 사용자가 입력 위젯에 자신의 답을 입력 할 때까지 기다릴 필요가있다. 게시 한 코드는 그렇게하지 않습니다. 사용자 작업에 의해 생성 된 이벤트를 기다렸다가 응답해야하기 때문에 명령 줄 프로그램과 비교하여 GUI 프로그램에서 약간 다른 논리를 구성해야합니다.

아래 코드는 원하는 모든 것을 수행하지는 않지만 실행은 가능합니다. :) 질문을 표시하고 사용자가 self.entry1 위젯에 응답을 입력 할 때까지 기다렸다가 해당 위젯의 Enter 키를 누르면 해당 답변을 처리하는 .get_answer 메서드를 호출 한 다음 .ask 메서드를 호출하여 새 질문을합니다 . 10 개의 질문 후 프로그램이 종료됩니다.

import tkinter as tk 
import random 

class Quiz(tk.Frame): 
    def __init__(self, root): 
     super().__init__(root) 
     self.root = root 
     self.pack() 

     self.label = tk.Label(self, text="This is page 1") 
     self.label.pack(side="top", fill="x", pady=10) 
     self.label1 = tk.Label(self, text='') 
     self.label1.pack() 
     self.label2 = tk.Label(self, text='') 
     self.label2.pack() 
     self.entry1 = tk.Entry(self) 
     self.entry1.bind("<Return>", self.get_answer) 
     self.entry1.pack() 
     self.label3 = tk.Label(self, text='') 
     self.label3.pack() 
     self.entry2 = tk.Entry(self) 
     self.entry2.pack() 

     self.start_quiz() 
     root.mainloop() 

    def start_quiz(self): 
     self.qdict = { 
      "Base-2 number system": "binary", 
      "Base-8 number system": "octal", 
      "Base-16 number system": "hexadecimal", 
     } 
     self.qkeys = list(self.qdict.keys()) 
     self.score = 0 
     self.count = 1 
     self.ask() 

    def ask(self): 
     self.question = random.choice(self.qkeys) 
     self.label1.config(text="Question {}".format(self.count)) 
     self.label2.config(text=self.question + "?") 

    def get_answer(self, event): 
     widget = event.widget 
     guess = widget.get() 
     answer = self.qdict[self.question] 
     if guess.lower() == answer.lower(): 
      self.score += 1 
     self.label3.config(text="Score: {}".format(self.score)) 

     self.count += 1 
     if self.count <= 10: 
      self.ask() 
     else: 
      self.root.destroy() 

Quiz(tk.Tk()) 
+0

도움이되었습니다. 이제 코드가 작동하고 더 많은 프레임을 전환 할 수 있습니다. 퀴즈도 효과가 있습니다. – pythoner

관련 문제