Tcl/Tk:'moveto'位置不对?



这是Tcl/Tk-8.6.12+dfsg-1(在Debian/sid中打包(。

我试图在Tcl/Tk画布上定位一些元素。

传统上,有一个canvas move命令,它会相对于当前位置移动标记的项目。从Tcl/Tk-8.6开始,还有一个canvas moveto命令,应该将标记项目移动到一个绝对位置。

然而,无论出于何种原因,两者的行为都不一样。

考虑以下最小脚本(我已经将puts的输出放在注释中(:

#!/usr/bin/env wish
canvas .c -width 100 -height 100 -background white
pack .c
.c create line 0 0 0 0 -tags tag
puts [.c coord tag]
# 0.0 0.0 0.0 0.0
.c move tag 100 100
puts [.c coord tag]
# 100.0 100.0 100.0 100.0
.c move tag -100 -100
puts [.c coord tag]
# 0.0 0.0 0.0 0.0
.c moveto tag 100 100
puts [.c coord tag]
# 102.0 102.0 102.0 102.0

正如您所看到的,如果我将项目定位在+0+0,它的边界框将位于我期望的位置。如果我做一个相对移动到一个新的位置,例如+100+100,项目就在那里。我也可以做一个相对的向后移动,项目就会出现在原点。

但是,如果我执行绝对移动到位置+100+100,则该项目将真正显示在+102+102。对于我的用例来说,在每个维度上偏移2个像素是不可容忍的(因为项目将被精确定位为像素(

这是怎么回事?

如果moveto实际上没有将项目移动到请求的位置,那么它的用例是什么?

(旁注:Tcl/Tk问题的正确标签是什么?为什么tktkinter的别名,而tcltk是关于R模块的问题的别名?(

编辑:我只在line项目中观察到这种行为。如果我改为使用.c create rectangle 0 0 0 0 -tags tag,则坐标是正确的。。。

注释太长。Tcl Tk文件指出:

所有与画布相关的坐标都存储为浮点数字。坐标和距离是以屏幕为单位指定的,它们是浮点数,后面可选地跟几个浮点数中的一个字母。如果未提供字母,则距离以像素为单位。如果字母是m,那么屏幕上的距离是毫米;如果它是c,那么距离是厘米;i的意思是英寸,p表示打印机点(1/72英寸(。较大的y坐标指屏幕上较低的点;较大的x坐标指的是点再往右。坐标可以指定为偶数参数的数目,或者作为包含偶数的单个列表参数x和y坐标值的数目。

我对此不太确定,但你可以考虑一下。Tcl/Tk自己声明它是+-1像素精确的。我相信这是由于dpi缩放和结果作为整数是有威胁的,而它实际上是一个浮点值,有时会四舍五入。

最新更新