我已经有一段时间了。但是,它仅在我从空闲开始时才能运行。如果我尝试从桌面运行它,则不会启动。这是用tkinter制成的时钟。
import time
from tkinter import *
def showTime():
canvas.delete('text')
if True:
actualTime = time.localtime()
text = canvas.create_text((100,50,),
text =(actualTime[3],actualTime[4],actualTime[5]),
fill="white",
font=("Verdana",20,"bold"),
tag="text")
root.after(1000,showTime)
if "__main__" == __name__:
root = Tk()
root.resizable(False,False)
root.title("Clock")
canvas = Canvas(root, width=200, height=100,bg="black",cursor="target")
canvas.create_rectangle((20,20),(180,80),outline="ghostwhite")
canvas.pack()
showTime()
您需要启动tkinter mainloop。只需添加
root.mainloop()
在您的
之后到达脚本的末尾showTime()
呼叫。
您的脚本在空闲中工作的原因是,闲置本身是一个tkinter程序,并且它已经具有此答案中提到的事件循环。
btw, showTime
中的 if True:
语句是毫无意义的。
fwiw,这是您的程序,其中添加了Mainloop呼叫,还有其他一些次要更改。最好避免"恒星"导入,因为它们用导入的名称混乱您的名称空间,例如from tkinter import *
带来了130多个名称。除非您非常熟悉TKINTER定义的每个名称,否则这可能会导致与您定义的名称相撞的碰撞,但是如果您将恒星导入与另一个使用TKINTER使用的名称的模块一起使用。
import time
import tkinter as tk
def showTime():
canvas.delete('text')
actualTime = time.localtime()
text = canvas.create_text((100, 50),
text = actualTime[3:6],
fill="white",
font=("Verdana", 20, "bold"),
tag="text")
root.after(1000, showTime)
if "__main__" == __name__:
root = tk.Tk()
root.resizable(False,False)
root.title("Clock")
canvas = tk.Canvas(root, width=200, height=100, bg="black", cursor="target")
canvas.create_rectangle((20, 20), (180, 80), outline="ghostwhite")
canvas.pack()
showTime()
root.mainloop()
正如布莱恩·奥克利(Bryan Oakley)在评论中提到的那样,最好只更新帆布文本项目的文本字符串,而不是每秒浪费旧文本项目并构建新鲜的项目。因此,这是从您的代码中得出的新版本。
我使用 time.strftime
来构建时间字符串,因为它给出的输出比简单地切成 time.localtime
返回的 struct_time
对象:它始终在小时,分钟和秒数中使用2位数字,并且您可以轻松添加结肠(或其他任何)到格式字符串。请参阅链接的文档,以获取strftime
提供的所有格式选项。
我还把GUI放入课堂上。对于如此简单的GUI来说,这并不是真正的必要条件,但是它是一个很好的习惯,因为它使代码更模块化。
import tkinter as tk
from time import strftime
class Clock:
def __init__(self):
root = tk.Tk()
root.title("Clock")
root.resizable(False, False)
self.canvas = canvas = tk.Canvas(root, width=200, height=100,
bg="black", cursor="target")
canvas.create_rectangle((20, 20), (180, 80), outline="ghostwhite")
canvas.create_text((100, 50), tag = "text",
fill="white", font=("Verdana", 20, "bold"))
canvas.pack()
self.show_time()
root.mainloop()
def show_time(self):
w = self.canvas
w.itemconfig("text", text=strftime('%H %M %S'))
w.after(1000, self.show_time)
if "__main__" == __name__:
Clock()