首页 > 解决方案 > python/tkinter 屏幕停止显示画布更新

问题描述

我有一个更新程序(完整的图像重建,即旋转图像)然后更改 tkinter.canvas.image 然后调用 canvas.updatestats() 以强制更改屏幕。time.sleep(0.0001) 被调用并且过程重复自身。

它完美地工作,直到鼠标指针变为一个蓝色的小圆圈,并在蓝色圆圈周围有一个较轻的条。如果我移动鼠标指针,圆圈会相应移动。也许 30 秒后,圆圈返回到鼠标指针,屏幕立即变为运行 30 秒后的样子(此时屏幕对于 30 秒的操作是 100% 正确的)。然而,在蓝色圆圈出现期间,屏幕不再更新。我怀疑可能是垃圾收集已经开始并导致 tkinter 正常工作但屏幕更新被暂停。这需要一段时间才能开始,但随后经常发生。

我尝试导入 gc。然后执行 gc.disable() 但这没有帮助。

有谁知道为什么会这样?

有没有办法阻止这种情况发生?

我的程序能否确定正在停止屏幕更新,因此我可以暂停屏幕更新直到完成?

标签: pythontkintergarbage-collectiontkinter-canvasmouse-cursor

解决方案


这是发生问题时正在执行的循环。记住代码可以工作并产生正确的输出,除了当蓝色圆圈替换鼠标指针时,代码继续正确执行,只是在 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)

推荐阅读