如果我想在程序中添加计时器(定时练习考试)

我将使用python3(comp当前已损坏,因此我无法测试示例)btw。我是否需要将计时器函数创建为单独的线程,并在响应计时器的主循环中创建事件驱动的中断?或者有没有一种更简单的方法来在主循环中创建计时器,而我太迟钝了,根本想不到呢?

# 回答1


NvrMind...回答了我自己的问题。
# 回答2


我正好有一个演示计时器应用程序的Tkinter脚本。您应该能够在主循环中做您想做的事情。

选择 | 换行 | 行号
  1. import Tkinter
  2. from Tkconstants import *
  3. import time
  4.  
  5. textFont1 = ("Arial", 16, "bold")
  6.  
  7. class Timer(Tkinter.Frame):
  8.     def __init__(self, master):
  9.         self.master = master
  10.         buttonFrame = Tkinter.Frame(master)
  11.         self.btnList = []
  12.         for i, name in enumerate(["Start", "Stop", "Exit"]):
  13.             def handler(i=i):
  14.                 return self.manage_timer(i)
  15.             btn = Tkinter.Button(buttonFrame, text=name, padx=5, pady=5,
  16.                          bd=4, bg='#ff0', fg="#00f",
  17.                          activebackground = "#00f",
  18.                          activeforeground = "#ff0",
  19.                          font=textFont1,
  20.                          relief='raised',
  21.                          command=handler)
  22.             btn.pack(side="left", fill=BOTH, expand=1)
  23.             self.btnList.append(btn)
  24.         buttonFrame.pack(fill=BOTH, expand=1)
  25.         self.start()
  26.  
  27.     def start(self):
  28.         Tkinter.Frame.__init__(self, self.master)
  29.         self.pack(fill=BOTH, expand=1)
  30.         self.clockVar = Tkinter.StringVar(self.master)
  31.         self.clockLabel = Tkinter.Label(self, textvariable=self.clockVar,
  32.                                         relief="raised", font=textFont1,
  33.                                         bd=3,
  34.                                         bg='#ffffff000',
  35.                                         fg="#000000fff",
  36.                                         activebackground = "#000000fff",
  37.                                         activeforeground = "#ffffff000",
  38.                                         takefocus=1,
  39.                                         padx=3,
  40.                                         pady=3,
  41.                                         width=16)
  42.         self.clockLabel.pack(fill=BOTH, expand=1)
  43.         self.clockVar.set("0.000")
  44.         self.btnList[1].configure(state=DISABLED)
  45.  
  46.     def update_time(self):
  47.         self.clockVar.set("%0.3f" % (time.time()-self.starttime))
  48.         if self.active:
  49.             self.after(10, self.update_time)
  50.         else:
  51.             self.clockVar.set("Elapsed time: %0.3f"% (time.time()-self.starttime))
  52.  
  53.     def manage_timer(self, idx):
  54.         if idx == 0:
  55.             self.btnList[0].configure(state=DISABLED)
  56.             self.btnList[1].configure(state=NORMAL)
  57.             self.active = True
  58.             self.starttime = time.time()
  59.             self.update_time()
  60.         elif idx == 1:
  61.             self.btnList[0].configure(state=NORMAL)
  62.             self.btnList[1].configure(state=DISABLED)
  63.             self.active = False
  64.         elif idx == 2:
  65.             self.master.destroy()
  66.  
  67. if __name__ == "__main__":
  68.     root = Tkinter.Tk()
  69.     app = Timer(root)
  70.     root.mainloop()
# 回答3


好的,乔里--答案是什么?
# 回答4


:嗯……这是错误的答案……我想我需要用一条线!因此,由于计时器被创建为对象的实例,而不只是一个函数,因此它允许我在确定要询问的问题和从用户那里获取输入的同时运行计时器,就像我使用的是单独的线程一样?
# 回答5


用户可以在计时器运行时与其他小部件交互。示例:

选择 | 换行 | 行号
  1. import Tkinter
  2. from Tkconstants import *
  3. import time
  4.  
  5. textFont1 = ("Arial", 16, "bold")
  6.  
  7. class EntryWidget(Tkinter.Entry):
  8.     def __init__(self, master, initial=""):
  9.         Tkinter.Entry.__init__(self, master=master)
  10.         self.value = Tkinter.StringVar()
  11.         self.config(textvariable=self.value, width=20,
  12.                     relief="ridge", font=textFont1,
  13.                     bg="#ddd", fg="#e00",
  14.                     justify='center')
  15.         self.pack(fill=BOTH, expand=1)
  16.         self.value.set(initial)
  17.  
  18. class Timer(Tkinter.Frame):
  19.     def __init__(self, master):
  20.         self.master = master
  21.         buttonFrame = Tkinter.Frame(master)
  22.         self.btnList = []
  23.         for i, name in enumerate(["Start", "Stop", "Exit"]):
  24.             def handler(i=i):
  25.                 return self.manage_timer(i)
  26.             btn = Tkinter.Button(buttonFrame, text=name, padx=5, pady=5,
  27.                          bd=4, bg='#ff0', fg="#00f",
  28.                          activebackground = "#00f",
  29.                          activeforeground = "#ff0",
  30.                          font=textFont1,
  31.                          relief='raised',
  32.                          command=handler)
  33.             btn.pack(side="left", fill=BOTH, expand=1)
  34.             self.btnList.append(btn)
  35.         buttonFrame.pack(fill=BOTH, expand=1)
  36.         self.start()
  37.  
  38.     def start(self):
  39.         Tkinter.Frame.__init__(self, self.master)
  40.         self.pack(fill=BOTH, expand=1)
  41.         self.clockVar = Tkinter.StringVar(self.master)
  42.         self.clockLabel = Tkinter.Label(self, textvariable=self.clockVar,
  43.                                         relief="raised", font=textFont1,
  44.                                         bd=3,
  45.                                         bg='#ffffff000',
  46.                                         fg="#000000fff",
  47.                                         activebackground = "#000000fff",
  48.                                         activeforeground = "#ffffff000",
  49.                                         takefocus=1,
  50.                                         padx=3,
  51.                                         pady=3,
  52.                                         width=20)
  53.         self.clockLabel.pack(fill=BOTH, expand=1)
  54.         self.clockVar.set("0.000")
  55.         self.btnList[1].configure(state=DISABLED)
  56.         self.w = EntryWidget(self, "Enter Text")
  57.         self.w.bind(sequence="<KeyRelease>", func=self.lower)
  58.  
  59.     def lower(self, event):
  60.         event.widget.value.set(event.widget.value.get().lower())
  61.  
  62.     def update_time(self):
  63.         self.clockVar.set("%0.3f" % (time.time()-self.starttime))
  64.         if self.active:
  65.             self.after(10, self.update_time)
  66.         else:
  67.             self.clockVar.set("Elapsed time: %0.3f"% (time.time()-self.starttime))
  68.  
  69.     def manage_timer(self, idx):
  70.         if idx == 0:
  71.             self.btnList[0].configure(state=DISABLED)
  72.             self.btnList[1].configure(state=NORMAL)
  73.             self.active = True
  74.             self.starttime = time.time()
  75.             self.update_time()
  76.         elif idx == 1:
  77.             self.btnList[0].configure(state=NORMAL)
  78.             self.btnList[1].configure(state=DISABLED)
  79.             self.active = False
  80.         elif idx == 2:
  81.             self.master.destroy()
  82.  
  83. if __name__ == "__main__":
  84.     root = Tkinter.Tk()
  85.     app = Timer(root)
  86.     root.mainloop()

标签: python

添加新评论