【问题标题】:How to make tkinter postpone canvas updates?如何让 tkinter 推迟画布更新?
【发布时间】:2019-12-21 09:46:46
【问题描述】:

使用我的测试,我发现在画布上绘制每个形状后,它都会重新计算并绘制像素。

c = Canvas(root)
c.pack()

c.create_line(10, 10, 50, 50)
# Draws line on canvas immediately.

c.create_line(20, 20, 60, 60)
# Draws second line on canvas.

这似乎非常低效,因为我试图每帧创建几十个形状(就像在每次模拟更新中一样)。最好等到我将所有绘制命令排入队列,然后告诉画布一次性重绘帧。

到目前为止,我尝试使用交互式外壳创建画布,而不在根上调用 mainloop 甚至 update,但是在每个绘制函数之后它都会重新绘制画布!

这样的事情会很理想:

c = Canvas(root)
c.pack()

c.queue_create_line(10, 10, 50, 50)
# Don't draw line yet.

c.queue_create_line(20, 20, 60, 60)
# Also don't draw yet.

c.draw_queue()
# Finally draw both lines at once.

如果有办法解决这个问题,请告诉我。

【问题讨论】:

  • tk.Canvas 不像你想象的那样工作:它不是pygame 表面,或者其他一些 GUI 工具包画布。它的项目是单独绘制、移动、修改的;没有帧或 FPS 的真正概念。画布维护一个脏边界框,并且只重绘被改变的部分。

标签: python canvas tkinter


【解决方案1】:

使用我的测试,我发现在画布上绘制每个形状后,它都会重新计算并绘制像素。

您看到的行为只是因为您是从 python shell 运行的。在正常操作中,画布不会立即更新显示。只有当您调用update() 或您的函数退出并将控制权交还给事件循环时,才会更新显示。因为您是从 pythons shell 运行的,所以在处理完每个命令后都会更新显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2023-02-16
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多