【问题标题】:Python timer in math game Tkinter数学游戏 Tkinter 中的 Python 计时器
【发布时间】:2013-07-08 06:52:24
【问题描述】:

我希望为我的简单数学游戏添加一个计时器。到目前为止,一切正常,用户在按下按钮时会收到问题,并会收到有关答案的反馈。我想为用户添加一个计时器,以查看回答乘法需要多少时间。这是我的数学游戏原型的最后一部分。我希望计时器在用户单击“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()

【问题讨论】:

标签: python user-interface python-2.7 timer tkinter


【解决方案1】:

我想你需要的是这个。

从 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__': 主要的()

P.S:在你的代码中加入这个我刚刚在 tkinter 中实现了基本计时器。

【讨论】:

  • 你发布的这段代码,它应该在 def start() 的定义下吗?导入部分中的日期
  • 是的,您可以在 start 中使用它,但是您需要一次又一次地调用 start 函数而不是 while True ..打印标签并刷新它
  • 我无法真正理解你的答案,我已经尝试过你写的东西,但不知何故它不适合我。
  • @tusharmakkar08 我认为您需要解释您在代码中添加的确切内容以使程序更好地工作,而不是简单地回答更好的代码解决方案。解释将很容易帮助提问者理解你的解决方案发生了什么。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我可以建议使用线程的其他解决方案。

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

    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()
    

    【讨论】:

      【解决方案4】:

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

      object.after(100, defineFunction)
      

      第一个父级是毫秒

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

      【讨论】:

        【解决方案5】:

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

        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 对不起

        【讨论】:

          猜你喜欢
          • 2022-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多