Python脚本仅适用于空闲



我已经有一段时间了。但是,它仅在我从空闲开始时才能运行。如果我尝试从桌面运行它,则不会启动。这是用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()

相关内容

最新更新