Python 乌龟:计时器一直在闪烁

Python 乌龟:计时器一直在闪烁,python,turtle-graphics,Python,Turtle Graphics,我有一些定时器代码: 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() i

我有一些定时器代码:

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()
从海龟导入屏幕,海龟,bgcolor
#---功能---
def delSec(字符串):
如果len(字符串)==1:
返回“0”+字符串
其他:
返回字符串
def tick():
全球毫秒,滴答声
乌龟
如果毫秒小于0:
write(“计时器完成”,align='center',font=font)
滴答声=假
返回
其他:
海龟.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)
如果未暂停:
毫秒-=1
屏幕显示时间(勾选100)
def reset():
全局毫秒、滴答声、按键重置、按键暂停、按键同时按下
#全局暂停
打印(“重置”)
screen.onkey(无,键重置)#禁用处理程序内的事件处理程序
screen.onkey(None,key_pause)#在处理程序中禁用事件处理程序
screen.onkey(无、两个键)
毫秒=总和(时间*10)
如果没有滴答声:
滴答声=真
勾选()
#暂停=错误
screen.onkey(reset,key#u reset)#可重入事件处理程序
screen.onkey(pause,key_pause)#可重入事件处理程序
screen.onkey(两个键,两个键)
定义两者():
重置()
暂停()
def pause():
全局暂停
打印(“暂停/取消暂停”)
暂停=未暂停
#---梅因---
bgcolor('darkblue')
字体=(“Arial”,60,“普通”)
字符串=输入(“请输入时间:”).strip().split(“”)
时间=[60**(长度(字符串)-索引-1)*索引的整数(单位),枚举(字符串)中的单位]
毫秒=-1
滴答声=假
暂停=错误
按键_reset=“r”
按键_pause=“p”
key_both=“b”
screen=screen()
海龟
乌龟
海龟。颜色(“白色”)
重置()
screen.listen()
screen.mainloop()
因为它每10秒钟改变一次,所以它一直在闪烁。这有点烦人,因为如果我在使用这个定时器时试图做一些事情,那么它会变得非常烦人。有没有办法让这个过程变得平滑,而不是一直闪烁?谢谢(我目前已将其设置为显示时间的位置,最多为十分之一秒,我希望保持这种状态)


编辑:如果你想修改代码,请随意修改,我只希望你能保持当前函数不变,所以不要修改,这样其他东西就不起作用了。谢谢

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

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()
从海龟导入屏幕,海龟
#---常数---
字体=(“Arial”,60,“普通”)
按键_RESET=“r”
按键_PAUSE=“p”
KEY_BOTH=“b”
#---功能---
def delSec(字符串):
如果len(字符串)==1:
返回“0”+字符串
返回字符串
def tick():
全球毫秒,滴答声
乌龟
如果毫秒小于0:
write(“计时器完成”,align='center',font=font)
screen.update()
滴答声=假
返回
乌龟。写(\
delSec(str(milisecs/(60*60*10))+“:”+\
delSec(str((毫秒%(60*60*10))/(60*10)))+“:”+\
delSec(str((毫秒)(60*10))//10))+“+\
str(毫秒%10),align='center',font=font)
screen.update()
如果未暂停:
毫秒-=1
屏幕显示时间(勾选100)
def reset():
全球毫秒,滴答声
打印(“重置”)
screen.onkey(无,键重置)#禁用处理程序内的事件处理程序
screen.onkey(None,KEY_PAUSE)#在处理程序中禁用事件处理程序
screen.onkey(无、两个键)
毫秒=总和(时间*10)
如果没有滴答声:
滴答声=真
勾选()
screen.onkey(reset,KEY#u reset)#可重入事件处理程序
screen.onkey(pause,KEY_pause)#可重入事件处理程序
screen.onkey(两个键,两个键)
定义两者():
重置()
暂停()
def pause():
全局暂停
打印(“暂停/取消暂停”)
暂停=未暂停
#---梅因---
字符串=输入(“请输入时间:”).strip().split(“”)
时间=[60**(长度(字符串)-索引-1)*索引的整数(单位),枚举(字符串)中的单位]
毫秒=-1
滴答声=假
暂停=错误
screen=screen()
screen.bgcolor('darkblue')
屏幕跟踪(假)
海龟
乌龟
海龟。颜色(“白色”)
重置()
screen.listen()
screen.mainloop()

我还做了一些小的代码调整,并将十分之一秒的演示文稿从
“45:7”
更改为更标准化的
“45.7”
。根据需要进行恢复。

海龟。速度(0)
可能会阻止在清除屏幕和重新绘制更新的计时器之间更新显示。闪烁仍在发生。我想有些计算可能会占用一些时间。我对如何编写代码持开放态度……你真的打算在你的程序中使用海龟的图形功能吗?改变屏幕上现有的东西并不能很好地适应海龟图形范式。如果你愿意换一种不同的方法,有很多选择可以做这种琐碎的事情。(举例来说,
turtle
所基于的
tkinter
库)。我不介意使用什么方法,但我在选择解决问题的方法方面非常缺乏经验。只要最终结果是一样的,或者在这种情况下更好,因为我目前的结果不是我想要的,我很高兴。我唯一的限制是我想使用Python。