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。在之后。如果你需要一个答案,“为什么我得到了<代码>命名空间< /代码>”和“我如何定期更新计时器”,那就值得问两个单独的问题。