python - python/tkinter 屏幕停止显示画布更新
问题描述
我有一个更新程序(完整的图像重建,即旋转图像)然后更改 tkinter.canvas.image 然后调用 canvas.updatestats() 以强制更改屏幕。time.sleep(0.0001) 被调用并且过程重复自身。
它完美地工作,直到鼠标指针变为一个蓝色的小圆圈,并在蓝色圆圈周围有一个较轻的条。如果我移动鼠标指针,圆圈会相应移动。也许 30 秒后,圆圈返回到鼠标指针,屏幕立即变为运行 30 秒后的样子(此时屏幕对于 30 秒的操作是 100% 正确的)。然而,在蓝色圆圈出现期间,屏幕不再更新。我怀疑可能是垃圾收集已经开始并导致 tkinter 正常工作但屏幕更新被暂停。这需要一段时间才能开始,但随后经常发生。
我尝试导入 gc。然后执行 gc.disable() 但这没有帮助。
有谁知道为什么会这样?
有没有办法阻止这种情况发生?
我的程序能否确定正在停止屏幕更新,因此我可以暂停屏幕更新直到完成?
解决方案
这是发生问题时正在执行的循环。记住代码可以工作并产生正确的输出,除了当蓝色圆圈替换鼠标指针时,代码继续正确执行,只是在 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)
推荐阅读
- android - MoPub 在使用测试广告单元 ID 时未找到任何广告
- python - overrideredirect 如何影响 winfo_height/width?
- oracle - Oracle 过程从表中选择数据,从 all_tab_columns 传递列
- c++ - 重载 >> 运算符时的非法指令
- python - 递归地打乱列表
- php - PHP通过带有stdObjects的多维数组进行多次循环
- python - 具有复杂标准的python pandas重复数据删除
- c++ - 无法累积编译时间常数
- selenium - Selenium 无法加载元素,尽管有 EC、等待和滚动尝试
- html - 我可以在 html 页面的 div 内容中添加代码吗?