Python计时器在Tkinter数学游戏中的应用

4

我想为我的简单数学游戏添加一个计时器。目前一切都运行良好,当用户按下按钮时会得到问题,并对答案给予反馈。我想为用户添加一个计时器,以便查看回答乘法问题所需的时间。这是我的数学游戏原型的最后部分。我希望计时器在用户点击"nytt tal"(瑞典语中的新数字)时开始计时,在用户点击"svar"(瑞典语中的答案)时停止计时。以下是我的代码。

从Tkinter导入*
import tkMessageBox
import random
import time
import sys
# 向用户提问的定义 def fraga1(): global num3 num3 = random.randint(1, 10) global num4 num4 = random.randint(1, 10) global svar1 svar1 = num3 * num4 label1.config(text='What is ' + str(num3) + '*' + str(num4) + '?') entry1.focus_set()
# 基于答案的反馈定义 def svar1(): mainAnswer = entry1.get() if len(mainAnswer) == 0: tkMessageBox.showwarning(message='请输入数字!') return if int(mainAnswer) != svar1: tkMessageBox.showwarning(message='很遗憾,正确答案是: ' + str(svar1)) else: tkMessageBox.showinfo(message='正确!! :)')
# 退出按钮定义 def quit(): global root root.destroy()
# 计时器定义,这部分不起作用 def start(): global count_flag fraga1() count_flag = True count = 0.0 while True: if count_flag == False: break label['text'] = str(count) time.sleep(0.1) root.update() count += 0.1
# 窗口代码 root = Tk() root.title("乘法计时器") root.geometry('800x500')
count_flag = True # 欢迎信息标签 label2 = Label(root, text="你好!\n 我们来解决一些数学问题!") label2.config(font=('times', 18, 'bold'), fg='black', bg='white') label2.grid(row=0, column=0)
# 游戏玩法说明标签 label3 = Label(root, text="游戏玩法说明\n 点击“新问题”开始游戏") label3.config(font=('times', 12, 'bold'), fg='black', bg='white') label3.grid(row=2, column=2)
# 其他标签 label1 = Label(root) label1.grid(row=2, column=0)
# 开始按钮的输入小部件 entry1 = Entry(root) entry1.grid(row=3, column=0)
# 重启后会出现一个新问题 entry1.bind('', func=lambda e:checkAnswer())
# 按钮
fragaBtn = Button(root, text='新问题', command=fraga1) fragaBtn.grid(row=4, column=0)
svarButton = Button(root, text='答案', command=svar1) svarButton.grid(row=4, column=1)
quit_bttn = Button(root, text = "退出", command=quit) quit_bttn.grid(row=5, column=0)
root.mainloop()

你好,你应该看这里 => http://stackoverflow.com/questions/36777643/how-to-stop-a-timer-python 希望能帮到你 :) - Cid.C
5个回答

7
我想你需要的是这个。
from Tkinter import *
import time

class StopWatch(Frame):
    """实现一个秒表框架小部件。"""
    
    def __init__(self, parent=None, **kw):
        Frame.__init__(self, parent, kw)
        self._start = 0.0
        self._elapsedtime = 0.0
        self._running = 0
        self.timestr = StringVar()
        self.makeWidgets()
def makeWidgets(self): """制作时间标签。""" l = Label(self, textvariable=self.timestr) self._setTime(self._elapsedtime) l.pack(fill=X, expand=NO, pady=2, padx=2)
def _update(self): """使用经过的时间更新标签。""" self._elapsedtime = time.time() - self._start self._setTime(self._elapsedtime) self._timer = self.after(50, self._update)
def _setTime(self, elap): """将时间字符串设置为分钟:秒数:百分之几。""" minutes = int(elap / 60) seconds = int(elap - minutes * 60.0) hseconds = int((elap - minutes * 60.0 - seconds) * 100) self.timestr.set('%02d:%02d:%02d' % (minutes, seconds, hseconds))
def Start(self): """启动计时器,如果正在运行,则忽略。""" if not self._running: self._start = time.time() - self._elapsedtime self._update() self._running = 1
def Stop(self): """停止计时器,如果已停止,则忽略。""" if self._running: self.after_cancel(self._timer) self._elapsedtime = time.time() - self._start self._setTime(self._elapsedtime) self._running = 0
def Reset(self): """重置计时器。""" self._start = time.time() self._elapsedtime = 0.0 self._setTime(self._elapsedtime)
def main(): root = Tk() sw = StopWatch(root) sw.pack(side=TOP)
Button(root, text='开始', command=sw.Start).pack(side=LEFT) Button(root, text='停止', command=sw.Stop).pack(side=LEFT) Button(root, text='重置', command=sw.Reset).pack(side=LEFT) Button(root, text='退出', command=root.quit).pack(side=LEFT)
root.mainloop()
if __name__ == '__main__': main()

P.S:请将其适应您的代码,我刚刚在tkinter中实现了基本的计时器。


你发布的这段代码,它应该放在 def start() 的定义下面吗?当然是在 import 部分声明日期。 - SterlinkArcher
可以在开始时这样做,但是你需要不断调用开始函数而不是使用“while True”来打印标签并刷新它。 - tusharmakkar08
1
我真的不太理解你的回答,我已经尝试了你写的东西,但是它在我看来似乎不对。 - SterlinkArcher
1
@tusharmakkar08 我认为你需要解释一下你在代码中添加了什么来使程序运行得更好,而不是简单地用更好的代码解决方案回答。解释将很容易帮助提问者理解你的解决方案中发生了什么。 - Ron Zhang

1

如果你正在使用tkinter,那么你会使用该函数。

object.after(100, defineFunction)

第一个父级是毫秒

这适用于Python3.x,但我不能确定2.7,因为我不练习那个格式


0

当用户按下开始按钮时,使用存储当前时间的全局变量。然后,在您的函数svar中,当用户按下svar时,只需获取当前时间,将它们互相减去即可得到所花费的时间,然后将全局变量重置为0,这样就可以得到所花费的时间了。


0

我可以建议使用线程来提供额外的解决方案。

在我的一个项目中,我使用一个小计时器作为不同的线程运行,并且每秒更新一次:

import threading
import tkinter as tk
import time

root = tk.Tk()
timer = tk.Text(root, width=5, height=1)
timer.insert(tk.INSERT, "00:00")
timer.pack()
def show_time():
    start = time.time()
    seconds = 0
    while True:
        if time.time() - start > 1:
            seconds += int(time.time() - start)
            start = time.time()
            cur_index = timer.index(tk.INSERT)
            cur_index = str(int(cur_index[0]) - 1) + cur_index[1:]
            timer.delete(cur_index, tk.INSERT)
            timer.insert(tk.INSERT, str(int(seconds / 60)) + ":" + str(seconds % 60))
            root.update()
thread = threading.Thread(target=show_time)
thread.start()

-1

我觉得你可以使用“after”。 你创建一个小部件...

time = 60 #60 seconds for example
widget = Tkinter.Label().pack()

def count():
    global time
    if time > 0:
       time -= 1
       widget.config(text="Time left: " + str(time))

       widget.after(1000, count)

我使用Python 3.x 抱歉


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接