Tkinter和Python-变量类型错误以及如何覆盖字符串-反应时间测试

时间:2019-07-11 15:39:27

标签: python tkinter

我已经在控制台中进行了反应测试,但是我很好奇要用它来制作桌面应用程序,所以我决定检查Tkinter,但是我遇到了一些转换和功能问题。 首先,对于倒计时,Tkinter可以覆盖字符串以产生倒计时(3,2,1,GO)的效果。 其次,我不确定如何将'start'变量设置为浮点数,以便可以将其减去以提供'elapsed'变量的值。 我觉得我真的很近。只是缺少一些东西。

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

root = Tk()

content = ttk.Frame(root, padding=(3,3,12,12), width=500, height=100)

def callback():
    elapsed = time.time()- start
    print(elapsed)
    result.set(elapsed)

result = StringVar()

def countdown():    
    time.sleep(random.randint(2,6))
    d = '!__GO__!'
    cd.set(d)
    start = time.time()
    start.set(start)

start = StringVar()
cd = StringVar()

ttk.Button(content, text="Start", command=countdown).grid(column=1, row=1, sticky=NW)
ttk.Label(content, text="Click on GO!").grid(column=2, row=1, sticky=N)
ttk.Button(content, text="Go", command = callback).grid(column=2, row=2, sticky=N)
ttk.Label(content, text="Result is: ").grid(column=2, row=3, sticky=(E,W))
ttk.Label(content, textvariable=cd).grid(column=2, row=4, sticky=S)
ttk.Label(content, textvariable=result).grid(column=3, row=3, sticky=S)

我希望倒数显示3,然后2覆盖它,然后1,然后GO。 然后显示从按下“开始”按钮到按下“开始”按钮为止的经过时间(即经过时间= time.time()-开始)

1 个答案:

答案 0 :(得分:0)

time.sleep将阻塞您的主线程,以便您的程序在time.sleep期间冻结。您需要thread函数,或使用tkinter可用的after方法,该方法允许您在特定时间后触发回调。

from tkinter import *
from tkinter import ttk
from datetime import datetime
import random

root = Tk()

content = ttk.Frame(root, padding=(3,3,12,12), width=500, height=100)
content.pack()

def callback():
    global start_time
    elapsed = datetime.now() - start_time
    result.set(elapsed)

result = StringVar()

def start(): #generates random countdown timer
    t = random.randint(2,6)
    def countdown(num): #function to provide countdown effect
        start_var.set(num)
        if num >=1:
            num -= 1
            root.after(1000,lambda: countdown(num)) #call itself again until countdown reaches 0
        else:
            start_var.set("GO!")
            global start_time
            start_time = datetime.now()
    countdown(t)

start_var = StringVar()

ttk.Button(content, text="Start", command=start).grid(column=1, row=1, sticky=NW)
ttk.Label(content, text="Click on GO!").grid(column=2, row=1, sticky=N)
ttk.Button(content, text="Go", command=callback).grid(column=2, row=2, sticky=N)
ttk.Label(content, text="Result is: ").grid(column=2, row=3, sticky=(E,W))
ttk.Label(content, textvariable=start_var).grid(column=2, row=4, sticky=S)
ttk.Label(content, textvariable=result).grid(column=3, row=3, sticky=S)

root.mainloop()