2012-03-01 54 views
1

這個程序有什麼問題?每次我運行它時,第一個數學問題都是在我推動開始之前顯示的。答案總是第一個數學問題,它永遠不會改變。計時器之上也不應該存在數學問題。謝謝,斯科特Tkinter Math Quiz

from Tkinter import* 
import time 
import tkMessageBox 
import random 

def Questions():  
    number1 = random.randrange(1,25) 
    number2 = random.randrange(1,50) 
    answer = number1 + number2 
    prompt = ("Add " + str(number1) + " and " + str(number2)) 
    label1 = Label(root, text=prompt, width=len(prompt), bg='yellow') 
    label1.pack() 
    return answer 

def start(): 
    global count_flag 
    Questions() 
    count_flag = True 
    count = 0.0 
    while True: 
     if count_flag == False: 
      break 
     # put the count value into the label 
     label['text'] = str(count) 
     # wait for 0.1 seconds 
     time.sleep(0.1) 
     # needed with time.sleep() 
     root.update() 
     # increase count 
     count += 0.1 

def Submit(answer, entryWidget): 
    """ Display the Entry text value. """ 
    global count_flag 

    count_flag = False 
    print answer 

    if entryWidget.get().strip() == "": 
     tkMessageBox.showerror("Tkinter Entry Widget", "Please enter a number.") 

    if answer != int(entryWidget.get().strip()): 
     tkMessageBox.showinfo("Answer", "INCORRECT!") 
    else: 
     tkMessageBox.showinfo("Answer", "CORRECT!") 



# create a Tkinter window 
root = Tk() 

root.title("Math Quiz") 
root["padx"] = 40 
root["pady"] = 20 

# Create a text frame to hold the text Label and the Entry widget 
textFrame = Frame(root) 

#Create a Label in textFrame 
entryLabel = Label(textFrame) 
entryLabel["text"] = "Answer:" 
entryLabel.pack(side=LEFT) 

# Create an Entry Widget in textFrame 
entryWidget = Entry(textFrame) 
entryWidget["width"] = 50 
entryWidget.pack(side=LEFT) 

textFrame.pack() 

#directions  
directions = ('Click start to begin. You will be asked a series of questions.') 
instructions = Label(root, text=directions, width=len(directions), bg='orange') 
instructions.pack() 

# this will be a global flag 
count_flag = True 

answer = Questions() 

Sub = lambda: Submit(answer, entryWidget) 
#stopwatch = lambda: start(answer) 

# create needed widgets 
label = Label(root, text='0.0') 
btn_submit = Button(root, text="Submit", command = Sub) 
btn_start = Button(root, text="Start", command = start) 
btn_submit.pack() 
btn_start.pack() 
label.pack() 


# start the event loop 
root.mainloop() 

回答

2

你的問題是你如何調用Questions()方法。你只用

answer = Questions() 

問的答案,一旦你這樣做,你按下啓動(這就是爲什麼它顯示了你打開始之前)

要解決它,你可以使用這樣的代碼之前:

from Tkinter import* 
import time 
import tkMessageBox 
import random 

def Questions():  
    number1 = random.randrange(1,25) 
    number2 = random.randrange(1,50) 
    answer = number1 + number2 
    prompt = ("Add " + str(number1) + " and " + str(number2)) 
    label1 = Label(root, text=prompt, width=len(prompt), bg='yellow') 
    label1.pack() 
    return answer 

def start(): 
    global count_flag 
    global answer 
    answer = Questions() 
    count_flag = True 
    count = 0.0 
    while True: 
     if count_flag == False: 
      break 
     # put the count value into the label 
     label['text'] = str(count) 
     # wait for 0.1 seconds 
     time.sleep(0.1) 
     # needed with time.sleep() 
     root.update() 
     # increase count 
     count += 0.1 

def Submit(answer, entryWidget): 
    """ Display the Entry text value. """ 
    global count_flag 

    count_flag = False 
    print answer 

    if entryWidget.get().strip() == "": 
     tkMessageBox.showerror("Tkinter Entry Widget", "Please enter a number.") 

    if answer != int(entryWidget.get().strip()): 
     tkMessageBox.showinfo("Answer", "INCORRECT!") 
    else: 
     tkMessageBox.showinfo("Answer", "CORRECT!") 



# create a Tkinter window 
root = Tk() 

root.title("Math Quiz") 
root["padx"] = 40 
root["pady"] = 20 

# Create a text frame to hold the text Label and the Entry widget 
textFrame = Frame(root) 

#Create a Label in textFrame 
entryLabel = Label(textFrame) 
entryLabel["text"] = "Answer:" 
entryLabel.pack(side=LEFT) 

# Create an Entry Widget in textFrame 
entryWidget = Entry(textFrame) 
entryWidget["width"] = 50 
entryWidget.pack(side=LEFT) 

textFrame.pack() 

#directions  
directions = ('Click start to begin. You will be asked a series of questions.') 
instructions = Label(root, text=directions, width=len(directions), bg='orange') 
instructions.pack() 

# this will be a global flag 
count_flag = True 


Sub = lambda: Submit(answer, entryWidget) 
#stopwatch = lambda: start(answer) 

# create needed widgets 
label = Label(root, text='0.0') 
btn_submit = Button(root, text="Submit", command = Sub) 
btn_start = Button(root, text="Start", command = start) 
btn_submit.pack() 
btn_start.pack() 
label.pack() 


# start the event loop 
root.mainloop() 

在這段代碼中,每次點擊開始時答案都會更新,只有當您點擊開始時才更新。