我有一个程序进行更新(完成完整的图像重新生成,即旋转图像),然后更改tkinter.canvas.image,然后调用canvas.updatestats()强制将更改显示到屏幕上。 time.sleep(0.0001)被调用,过程重复进行。
它可以完美地工作,直到鼠标指针变为一个细小的蓝色圆圈,并且带有一个淡色的圆圈环绕着蓝色圆圈。如果我移动鼠标指针,则圆会相应移动。也许在30秒后,圆圈返回到鼠标指针,并且屏幕在操作30秒后立即变为其外观(此时屏幕对于30秒操作是100%正确的)。但是,在蓝色圆圈出现期间,屏幕不再更新。我怀疑这是因为可能的垃圾收集已启动并导致tkinter正常工作,但屏幕更新已暂停。这需要一段时间才能开始,但随后经常发生。
我尝试导入gc。然后执行gc.disable(),但这没有帮助。
有人知道为什么会这样吗?
有什么方法可以阻止这种情况发生吗?
我的程序可以确定正在停止屏幕更新吗,所以我可以暂停屏幕更新直到完成为止?
答案 0 :(得分:0)
这是发生问题时正在执行的循环。请记住,代码可以正常工作并产生正确的输出,但是当蓝色圆圈替换鼠标指针时,代码会继续正确执行,只是在30秒的延迟期间屏幕没有更新,并且蓝色圆圈最终消失了显示执行30秒的最终结果。在我的代码中,我不能更改鼠标指针。
这是Windows 10计算机和python 3.6。
while (fx != tx or fy != ty):
if fx == tx:
dx = 0
elif fx > tx:
dx = -2 if fx != tx+1 else -1
else:
dx = 2 if fx != tx-1 else 1
if fy == ty:
dy = 0
elif fy > ty:
dy = -2 if fy != ty+1 else -1
else:
dy = 2 if fy != ty-1 else 1
steps += 1
if steps > 0:
if sAngle != eAngle:
if eAngle < sAngle: sAngle -= 2
else: sAngle += 2
im = Image.new("RGBA",(int(tileHeight+tileWidth/2),int(tileHeight+tileWidth/2)))
if til.direction == North or til.direction == South:
im.paste(til.dom.raw[til.direction],(int((tileHeight+tileWidth/2-tileWidth)/2),int(tileWidth/4)))
else:
im.paste(til.dom.raw[til.direction],(int(tileWidth/4),int((tileHeight+tileWidth/2-tileWidth)/2)))
im = im.rotate(sAngle)
imm = ImageTk.PhotoImage(im)
CANVAS.delete(til.canvasID)
tags.remove(til.canvasID)
til.canvasID = CANVAS.create_image(fx,fy,anchor=tk.CENTER,image=imm)
tags.append(til.canvasID)
CANVAS.move(til.canvasID,dx,dy)
fx += dx
fy += dy
CANVAS.update_idletasks()
time.sleep(0.0000001)