乌龟:计时器一直在闪烁



我有一些计时器的代码:

from turtle import Screen, Turtle, bgcolor
# --- functions ---
def delSec(string):
if len(string) == 1:
return "0" + string
else:
return string
def tick():
global milisecs, ticking

turtle.clear()
if milisecs < 0:
turtle.write("TIMER DONE", align='center', font=FONT)
ticking = False
return
else:
turtle.write(delSec(str(milisecs//(60*60*10)))+":"+delSec(str((milisecs%(60*60*10))//(60*10)))+":"+delSec(str((milisecs%(60*10))//10))+":"+str(milisecs%10), align='center', font=FONT)
##        turtle.write(delSec(str(milisecs//(60*60)))+":"+delSec(str((milisecs%(60*60))//(60)))+":"+delSec(str((milisecs%(60))//1)), align='center', font=FONT)
if not paused:
milisecs -= 1
screen.ontimer(tick, 100)
def reset():
global milisecs, ticking, key_reset, key_pause, key_both
#global paused
print("reset")
screen.onkey(None, key_reset)  # Disable event handler inside handler
screen.onkey(None, key_pause)  # Disable event handler inside handler
screen.onkey(None, key_both)
milisecs = sum(time*10)
if not ticking:
ticking = True
tick()
#paused = False
screen.onkey(reset, key_reset)  # Reenable event handler
screen.onkey(pause, key_pause)  # Reenable event handler
screen.onkey(both, key_both)
def both():
reset()
pause()
def pause():
global paused
print("pause/unpause")
paused = not paused
# --- main ---
bgcolor('darkblue')
FONT = ("Arial", 60, "normal")
strings = input("Please enter the time: ").strip().split(' ')
time = [60 ** (len(strings) - index - 1) * int(unit) for index, unit in enumerate(strings)]
milisecs = -1
ticking = False
paused = False
key_reset = "r"
key_pause = "p"
key_both = "b"
screen = Screen()
turtle = Turtle()
turtle.hideturtle()
turtle.color('white')
reset()
screen.listen()
screen.mainloop()

由于它每隔十分之一秒就会发生变化,所以它一直在闪烁。这有点烦人,因为如果我在使用这个计时器的时候试图做一些事情,那么它会变得非常烦人。有没有什么方法可以让它变得平滑,而不是目前一直在闪烁?谢谢(我目前已经将其设置为显示时间高达十分之一秒的位置,我希望保持这种状态(


EDIT:如果你想更改代码,可以随意更改,我只希望你能保持当前函数不变,所以不要让它变得其他东西不再工作。谢谢

我通过引入tracer()update()屏幕方法,对您的(实际上是我们的(代码进行了最低限度的更改,以消除闪烁。这告诉乌龟,我们最清楚何时(手动(更新屏幕并自动停止更新:

from turtle import Screen, Turtle
# --- constants ---
FONT = ("Arial", 60, "normal")
KEY_RESET = "r"
KEY_PAUSE = "p"
KEY_BOTH = "b"
# --- functions ---
def delSec(string):
if len(string) == 1:
return "0" + string
return string
def tick():
global milisecs, ticking
turtle.clear()
if milisecs < 0:
turtle.write("TIMER DONE", align='center', font=FONT)
screen.update()
ticking = False
return
turtle.write( 
delSec(str(milisecs // (60*60*10))) + ":" + 
delSec(str((milisecs % (60*60*10)) // (60*10))) + ":" + 
delSec(str((milisecs % (60*10)) // 10)) + "." + 
str(milisecs % 10), align='center', font=FONT)
screen.update()
if not paused:
milisecs -= 1
screen.ontimer(tick, 100)
def reset():
global milisecs, ticking
print("reset")
screen.onkey(None, KEY_RESET)  # Disable event handler inside handler
screen.onkey(None, KEY_PAUSE)  # Disable event handler inside handler
screen.onkey(None, KEY_BOTH)
milisecs = sum(time*10)
if not ticking:
ticking = True
tick()
screen.onkey(reset, KEY_RESET)  # Reenable event handler
screen.onkey(pause, KEY_PAUSE)  # Reenable event handler
screen.onkey(both, KEY_BOTH)
def both():
reset()
pause()
def pause():
global paused
print("pause/unpause")
paused = not paused
# --- main ---
strings = input("Please enter the time: ").strip().split(' ')
time = [60 ** (len(strings) - index - 1) * int(unit) for index, unit in enumerate(strings)]
milisecs = -1
ticking = False
paused = False
screen = Screen()
screen.bgcolor('darkblue')
screen.tracer(False)
turtle = Turtle()
turtle.hideturtle()
turtle.color('white')
reset()
screen.listen()
screen.mainloop()

我还对代码进行了一些小的调整,并将十分之一秒的表示从"45:7"更改为更标准化的"45.7"。按您认为合适的方式还原。

最新更新