3

我正在为我的简单数学游戏添加一个计时器。到目前为止,一切正常,用户在按下按钮时会收到问题,并会收到有关答案的反馈。我想为用户添加一个计时器,以查看回答乘法需要多少时间。这是我的数学游戏原型的最后一部分。我希望计时器在用户单击“nytt tal”时启动,这意味着瑞典语中的新数字,并在用户单击“svar”时停止,这意味着瑞典语中的回答。这是我的代码。

从 Tkinter 导入 *
导入 tkMessageBox
随机导入
进口时间
导入系统

# 向用户提出的问题的定义
def fraga1():
    全球数字3
    num3 = random.randint(1, 10)
    全球数字4
    num4 = random.randint(1, 10)
    全局变量 1
    svar1 = num3 * num4
    label1.config(text='Vad blir' + str(num3) + '*' + str(num4) + '?')
    entry1.focus_set()


#根据答案给出反馈的答案
定义 svar1():
   mainAnswer = entry1.get()
   如果 len(mainAnswer) == 0:
      tkMessageBox.showwarning(message='Skriv in några nummer!')
   返回
   如果 int(mainAnswer) != svar1:
      tkMessageBox.showwarning(message='Tyvärr det rätta svaret: ' + str(svar1))
   别的:
      tkMessageBox.showinfo(message='RÄTT!! :)')

#退出按钮定义
定义退出():
   全局根
   root.destroy()

#定时器的定义这部分不起作用
定义开始():
   全局计数标志
   fraga1()
   count_flag = 真
   计数 = 0.0
   而真:
      如果 count_flag == False:
          休息
   标签['文本'] = str(计数)
   时间.睡眠(0.1)
   根。更新()
   计数 += 0.1


#窗口代码
根 = Tk()
root.title("multiplikations tidtagning")
root.geometry('800x500')

count_flag = 真

# 标签中的欢迎信息
label2 = Label(root, text="Hej!\n Nu ska vi lösa lite matteproblem!")
label2.config(font=('times', 18, 'bold'), fg='black', bg='white')
label2.grid(行=0,列=0)

#说明如何在标签中播放

label3 = Label(root, text="Instruktioner!\n För att starta ett tt spel tryck på nyttspel")
label3.config(font=('times', 12, 'bold'), fg='black', bg='white')
label3.grid(行=2,列=2)

#其他标签
label1 = 标签(根)
label1.grid(行=2,列=0)


# 开始按钮的入口小部件
entry1 = 入口(根)
entry1.grid(行=3,列=0)

# restart 给出一个新问题
entry1.bind('', func=lambda e:checkAnswer())

#纽扣

fragaBtn = Button(root, text='Nytt tal', command=fraga1)
fragaBtn.grid(行=4,列=0)

svarButton = Button(root, text='Svar', command=svar1)
svarButton.grid(行=4,列=1)


quit_bttn = Button(root, text = "Avsluta", command=quit)
quit_bttn.grid(行=5,列=0)



root.mainloop()
4

5 回答 5

6

我想你需要的是这个。

从 Tkinter 导入 *
进口时间

类秒表(帧):  
    """ 实现秒表框架小部件。"""                                                                
    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 = 标签(self, textvariable=self.timestr)
        self._setTime(self._elapsedtime)
        l.pack(填充=X,展开=NO,pady=2,padx=2)                      

    定义_更新(自我):
        """ 用经过的时间更新标签。"""
        self._elapsedtime = time.time() - self._start
        self._setTime(self._elapsedtime)
        self._timer = self.after(50, self._update)

    def _setTime(self, elap):
        """ 将时间字符串设置为 Minutes:Seconds:Hundreths """
        分钟 = int(elap/60)
        秒 = int(elap - 分钟*60.0)
        hseconds = int((elap - 分钟*60.0 - 秒)*100)                
        self.timestr.set('%02d:%02d:%02d' % (分钟​​, 秒, hseconds))

    def 开始(自我):                                                     
        """启动秒表,运行时忽略。"""
        如果不是 self._running:            
            self._start = time.time() - self._elapsedtime
            self._update()
            self._running = 1        

    def 停止(自我):                                    
        """停止秒表,停止则忽略。"""
        如果self._running:
            self.after_cancel(self._timer)            
            self._elapsedtime = time.time() - self._start    
            self._setTime(self._elapsedtime)
            self._running = 0

    def 重置(自我):                                  
        """重置秒表。"""
        self._start = time.time()         
        self._elapsedtime = 0.0    
        self._setTime(self._elapsedtime)


定义主():
    根 = Tk()
    sw =秒表(根)
    sw.pack(侧面=顶部)

    Button(root, text='Start', command=sw.Start).pack(side=LEFT)
    Button(root, text='Stop', command=sw.Stop).pack(side=LEFT)
    Button(root, text='Reset', command=sw.Reset).pack(side=LEFT)
    Button(root, text='Quit', command=root.quit).pack(side=LEFT)

    root.mainloop()

如果 __name__ == '__main__':
    主要的()

PS:把它放在你的代码中我刚刚在 tkinter 中实现了基本计时器。

于 2013-07-10T12:44:08.790 回答
0

当人们按下开始时,使用一个全局变量来存储当前时间。然后,当用户在您的函数 svar 中按下 svar 时,只需获取当前时间,将它们彼此相减即可获得时间,然后将全局 var 也重置为 0,瞧,您已经花费了时间

于 2016-09-05T20:46:33.807 回答
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()
于 2019-08-22T11:22:28.027 回答
0

好吧,如果您使用的是 tkinter,那么您正在使用该功能

object.after(100, defineFunction)

第一个父母是毫秒

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

于 2021-07-28T15:01:58.190 回答
-1

我认为您可以使用“之后”。您创建一个小部件...

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 3x 抱歉

于 2016-01-24T16:26:14.823 回答