非常酷的消防车 · postman---postman参数关联 ...· 2 月前 · |
憨厚的毛衣 · CVPR 2024 | 绝了!!最新 ...· 3 月前 · |
阳刚的青蛙 · 搞机器学习,Python和R哪个更合适?-C ...· 3 月前 · |
阳刚的火腿肠 · iframe双滚动条-掘金· 9 月前 · |
豪情万千的铁板烧 · varchar2改为clob的解决步骤-CS ...· 9 月前 · |
我正在用Python的tkinter库编写一个程序。
我的主要问题是,我不知道如何创建一个计时器或时钟,如
hh:mm:ss
。
我需要它来自我更新(这是我不知道该怎么做的);当我在一个循环中使用
time.sleep()
时,整个图形用户界面都会冻结。
Tkinter根窗口有一个名为
after
的方法,可用于调度在给定时间段后调用的函数。如果该函数本身调用了
after
,那么您已经设置了一个自动重复的事件。
下面是一个有效的示例:
# for python 3.x use 'tkinter' rather than 'Tkinter'
import Tkinter as tk
import time
class App():
def __init__(self):
self.root = tk.Tk()
self.label = tk.Label(text="")
self.label.pack()
self.update_clock()
self.root.mainloop()
def update_clock(self):
now = time.strftime("%H:%M:%S")
self.label.configure(text=now)
self.root.after(1000, self.update_clock)
app=App()
请记住,
after
并不能保证函数会准时运行。它只安排作业在给定的时间量之后运行。如果应用程序很忙,那么在调用它之前可能会有延迟,因为Tkinter是单线程的。延迟通常以微秒为单位测量。
使用frame.after()而不是顶级应用程序的Python3时钟示例。还显示了如何使用StringVar()更新标签
#!/usr/bin/env python3
# Display UTC.
# started with https://docs.python.org/3.4/library/tkinter.html#module-tkinter
import tkinter as tk
import time
def current_iso8601():
"""Get current date and time in ISO8601"""
# https://en.wikipedia.org/wiki/ISO_8601
# https://xkcd.com/1179/
return time.strftime("%Y%m%dT%H%M%SZ", time.gmtime())
class Application(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.now = tk.StringVar()
self.time = tk.Label(self, font=('Helvetica', 24))
self.time.pack(side="top")
self.time["textvariable"] = self.now
self.QUIT = tk.Button(self, text="QUIT", fg="red",
command=root.destroy)
self.QUIT.pack(side="bottom")
# initial time display
self.onUpdate()
def onUpdate(self):
# update displayed time
self.now.set(current_iso8601())
# schedule timer to call myself after 1 second
self.after(1000, self.onUpdate)
root = tk.Tk()
app = Application(master=root)
root.mainloop()
我刚刚使用MVP模式创建了一个简单的计时器(然而,对于这个简单的项目,它可能有些夸张)。它有退出、启动/暂停和停止按钮。时间以HH:MM:SS格式显示。时间计数是使用每秒运行几次的线程和计时器启动的时间与当前时间之间的差值来实现的。
from tkinter import *
import time
tk=Tk()
def clock():
t=time.strftime('%I:%M:%S',time.localtime())
if t!='':
label1.config(text=t,font='times 25')
tk.after(100,clock)
label1=Label(tk,justify='center')
label1.pack()
clock()
tk.mainloop()
对于这个问题,我有一个简单的答案。我创建了一个线程来更新时间。在线程中,我运行了一个while循环,它获取时间并更新它。检查以下代码,不要忘记将其标记为正确答案。
from tkinter import *
from tkinter import *
import _thread
import time
def update():
while True:
t=time.strftime('%I:%M:%S',time.localtime())
time_label['text'] = t
win = Tk()
win.geometry('200x200')
time_label = Label(win, text='0:0:0', font=('',15))
time_label.pack()
_thread.start_new_thread(update,())
win.mainloop()
root.after(ms, func)
是您需要使用的方法。只需在主循环开始之前调用它一次,并在每次调用它时在绑定函数中重新调度它。下面是一个示例:
from tkinter import *
import time
def update_clock():
timer_label.config(text=time.strftime('%H:%M:%S',time.localtime()),
font='Times 25') # change the text of the time_label according to the current time
root.after(100, update_clock) # reschedule update_clock function to update time_label every 100 ms
root = Tk() # create the root window
timer_label = Label(root, justify='center') # create the label for timer
timer_label.pack() # show the timer_label using pack geometry manager
root.after(0, update_clock) # schedule update_clock function first call
root.mainloop() # start the root window mainloop
from tkinter import *
from tkinter import messagebox
root = Tk()
root.geometry("400x400")
root.resizable(0, 0)
root.title("Timer")
seconds = 21
def timer():
global seconds
if seconds > 0:
seconds = seconds - 1
mins = seconds // 60
m = str(mins)
if mins < 10:
m = '0' + str(mins)
se = seconds - (mins * 60)
s = str(se)
if se < 10:
s = '0' + str(se)
time.set(m + ':' + s)
timer_display.config(textvariable=time)
# call this function again in 1,000 milliseconds
root.after(1000, timer)
elif seconds == 0:
messagebox.showinfo('Message', 'Time is completed')
root.quit()
frames = Frame(root, width=500, height=500)
frames.pack()
time = StringVar()
timer_display = Label(root, font=('Trebuchet MS', 30, 'bold'))