Python脚本只在空闲时工作

2024-03-29 02:18:45 发布

您现在位置: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()

Tags: textimportfalseiftimetkinter状态create
1条回答
网友
1楼 · 发布于 2024-03-29 02:18:45

你需要启动Tkinter主循环。只要加上

root.mainloop()

在你的剧本后面

^{pr2}$

打电话。在

您的脚本在IDLE中工作的原因是IDLE本身是一个Tkinter程序,并且它已经有了一个事件循环,如this answer所述。在


{cdw}这句话毫无意义。在

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

正如bryanoakley在评论中提到的那样,最好只是更新Canvas文本项的文本字符串,而不是破坏旧的文本项并每秒创建一个新的文本项。所以这里有一个从你的代码派生出来的新版本。在

我使用^{}来构建时间字符串,因为它比简单地切片struct_time返回的struct_time对象提供更好的输出:它总是为小时、分钟和秒组件使用2位数字,并且您可以很容易地在格式字符串中添加冒号(或其他)。{cd7>提供了链接的所有文档格式。在

我还把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()

相关问题 更多 >