tkinter。配置没有运行

时间:2017-03-24 01:09:50

标签: python tkinter configure

代码本质上是一个数学测验,要求用户输入答案。如果答案正确或错误,代码将显示。但是,如果将self.feedback.configure(text =“”)插入到“Check”方法中,那么当前self.feedback.configure(text =“Correct”)不会在方法“Next”中运行(有延迟0.2秒,因此代码应配置为“更正”0.2秒,然后再配置回“”空字符串)

这是代码:

from tkinter import *
from tkinter import ttk
import random
import time

class TimesTable:

    def __init__(self, parent):
        """ Sets up the GUI. 
        """
        self.points = 0

        self.problem_label = ttk.Label(parent, text = "Question:") #empty for now
        self.problem_label.grid(row = 0, column=0, sticky = W, padx = 10, pady = 10)

        self.answer_entry = ttk.Entry(parent, width = 7)

        self.check_btn = ttk.Button(parent, text = "Check Answer", command = self.Check)

        self.next_btn = ttk.Button(parent, text = "Start", command = self.Next)
        self.next_btn.grid(row = 0, column = 1, sticky = W, padx = 10, pady = 10)

        self.feedback = ttk.Label(parent, text = "Click 'Start' to begin!")
        self.feedback.grid(row = 1, column = 0, sticky = W, padx = 10, pady = 10)


    def Next(self):
        time.sleep(0.2)
        ***self.feedback.configure(text = "")*** #Fix this (taking it out makes the .configure in Check work)
        number1 = random.randrange(2,10)
        number2 = random.randrange(2,10)
        operation = ["*", "+", "-"]
        operation_ran = operation[(random.randrange((len(operation))))]
        display_question = "Question: {} {} {} = ".format(number1, operation_ran, number2)
        self.ans = eval("{} {} {} ".format(number1, operation_ran, number2))
        self.problem_label.configure(text = display_question)
        self.check_btn.grid(row = 1, column = 1, sticky = W, padx = 10, pady = 10)
        self.answer_entry.grid(row = 0, column = 1, sticky = W, padx = 10, pady = 10)
        self.next_btn.grid_remove()

    def Check(self):
        try:
            if int(self.answer_entry.get()) == int(self.ans):
                ***self.feedback.configure(text = "Correct!")*** #Why does this not work? in def Next, it is configured to nothing but shouln't it still sleep for 0.2s before configuring to nothing via the calling of method def Next???
                self.points += 1
                self.answer_entry.delete(0,END)
                self.answer_entry.focus()
                print(self.points) #Just to check point system works
                self.Next()
            else:
                ***self.feedback.configure(text = "Wrong. The answer is {}".format(self.ans))***
                if self.points > 0:
                    self.points -= 1
                self.answer_entry.delete(0,END)
                self.answer_entry.focus()
                print(self.points)
                self.Next()

        except ValueError:
            self.feedback.configure(text = "Please enter a valid number")
            self.answer_entry.delete(0,END)
            self.answer_entry.focus()

#main routine
if __name__ == "__main__":
    root = Tk()
    root.title("Math Quiz")
    tester = TimesTable(root)
    root.mainloop()

1 个答案:

答案 0 :(得分:0)

两个配置都正常运行,但您无法看到“正确”文本,因为它正在等待,您需要在等待查看更改之前更新屏幕。

您可以使用update_idletasks方法。
此外,您可以使用after方法代替睡眠。对于这个特定的代码,它并不重要,但至少会让你避免另一个导入(time模块)。

def Next(self):
    root.update_idletasks()
    root.after(200)
    self.feedback.configure(text = "")