Tcl/TK:如何防止屏幕撕裂?

问题描述 投票:0回答:1

我在 TK 中摆弄画布,并有一个跟随光标的黑色矩形的小示例:

package require Tk
package require Thread
ttk::frame .c
canvas .c.card
.c.card create rectangle 0 0 1000 1000 -fill green
.c.card create rectangle 0 0 100 200 -fill black -tags card
pack .c .c.card -fill both -expand 1
proc moveCard {x y} { .c.card moveto card $x $y  }
set mouseDown 0
bind . <ButtonPress> { set mouseDown 1 }
bind . <ButtonRelease> { set mouseDown 0 }
bind . <Motion> { if { $mouseDown }  {  moveCard %x %y; } }

但是,当我快速移动矩形时,它会“撕裂” - 看起来矩形的位置正在从绘图中间从上到下更新,因此顶部和底部位于不同的位置!据我了解,这是屏幕撕裂,这是由于事件重绘与屏幕刷新率不同步而发生的。但是,我找不到如何启用垂直同步/以其他方式防止这种情况发生。我是否准确诊断了问题?如果是,我该如何解决?

tcl tk-toolkit
1个回答
0
投票

Tk 已经在内部为所有小部件(菜单除外)进行了双缓冲,但不知道何时对缓冲区进行位块传输以避免撕裂;它依赖于处理所有这些的较低级别系统(例如 Xserver)。

听起来这还可以改进。我不确定会涉及哪种通知(如果有的话),但它们通常不会暴露给脚本,因为它们实际上是绘图引擎的领域。

© www.soinside.com 2019 - 2024. All rights reserved.