Python Tkinter GUI秒表/计时器

Python Tkinter GUI秒表/计时器,python,canvas,tkinter,timer,Python,Canvas,Tkinter,Timer,如何使计时器在画布中更新 在create.text(position,**options)中,默认位置可以被anchor=tk.CENTER覆盖,但我得到一个: NameError:未定义名称“tk” 如果我尝试添加锚定选项 import time from Tkinter import * run = True; s=0; m=0; h=0 def Run(): global run, s, m, h while run == True: time.slee

如何使计时器在
画布中更新

create.text(position,**options)
中,默认位置可以被
anchor=tk.CENTER
覆盖,但我得到一个:

NameError:未定义名称“tk”

如果我尝试添加
锚定
选项

import time
from Tkinter import *

run = True; s=0; m=0; h=0

def Run():
    global run, s, m, h
    while run == True:
        time.sleep(1)
        s+=1
        if s == 59:
            m+=1; s=-1
        elif m == 59:
            h+=1; m=-1

master = Tk()
w = Canvas(master, width=1500, height=800)
w.pack()

x.create_text(
    [750, 400], anchor=tk.CENTER, text="%s:%s:%s" % (s, m, h), font=("Consolas", 400)
    )

mainloop()

Run()
如果我将
Run()
放在
mainloop()之前,画布不会启动。在
mainloop()
Run()之后,
不会启动

mainloop(Run())
Run()
Canvas

这一行之前启动:

from Tkinter import *
将Tkinter库中的所有名称放入全局名称空间。因此,您可以直接访问它们:

x.create_text(
    ..., anchor=CENTER, ...
    )
如果导入Tkinter,您只会执行
tk.CENTER
,如:

import Tkinter as tk
我必须说这是一个更好的方法。通过从…执行
,使全局名称空间混乱是一种不好的做法。。。导入*
。记住:


关于问题的第二部分,您不能在Tkinter事件循环运行的同一线程中使用
而True:
time.sleep
。执行上述任一操作都将阻止Tkinter循环并导致程序冻结

相反,您可以使用在后台执行
Run

from Tkinter import *

run = True
s = 0
m = 0
h = 0


def Run():
    global run, s, m, h

    # Delete old text
    w.delete('all')
    # Add new text
    w.create_text(
        [750, 400], anchor=CENTER, text="%s:%s:%s" % (s, m, h), font=("Consolas", 400)
        )

    s += 1
    if s == 59:
        m += 1
        s -= 1
    elif m == 59:
        h += 1
        m -= 1

    # After 1 second, call Run again (start an infinite recursive loop)
    master.after(1000, Run)


master = Tk()
w = Canvas(master, width=1500, height=800)
w.pack()

master.after(1, Run)  # after 1 millisecond, start Run
mainloop()

此外,我还将调用移动到了
画布。在
运行
函数中创建文本
,以便每次调用
运行
时都会对其进行更新。还要注意的是,您需要调用
画布。在添加新文本之前删除
,以便删除任何旧文本。

无限
,而
循环会使Tkinter锁定。考虑使用<代码> TK。在之后。如果你需要一个答案,“为什么我得到了<代码>命名空间< /代码>”和“我如何定期更新计时器”,那就值得问两个单独的问题。