首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tcl/Tk将画布行的一个点附加到另一个小部件(或标记)上。

Tcl/Tk将画布行的一个点附加到另一个小部件(或标记)上。
EN

Stack Overflow用户
提问于 2022-09-26 07:59:44
回答 1查看 42关注 0票数 0

考虑一下,我有一个Tcl/Tk画布,有几个简单的形状:由两点线连接的椭圆。就像这样:

是这样创建的:

代码语言:javascript
复制
canvas .c -width 400 -height 200
pack .c

proc create_shape {cnv tag x y} {
    $cnv create oval \
        [expr $x - 10] [expr $y - 10] \
        [expr $x + 10] [expr $y + 10] \
        -tags [list $tag shape]
    $cnv create text $x [expr $y - 15] -text ${tag} -tags [list $tag text]
    $cnv create rectangle $x $y $x $y -tags [list $tag center] -outline {}
}
proc connect {cnv src dst} {
    foreach {x0 y0} [$cnv coords "${src}&&center"] {break}
    foreach {x1 y1} [$cnv coords "${dst}&&center"] {break}
    $cnv create line $x0 $y0 $x1 $y1 -tags [list "src:$src" "dst:$dst" connection]
}

create_shape .c A 100 100
create_shape .c B 200 120
create_shape .c C 300 100

connect .c A B
connect .c B C

现在,我希望能够移动我的形状(如.c move B 0 20),并使连接线自动跟随。

我想出了这个:

代码语言:javascript
复制
proc move {cnv tag dx dy} {
    # move the object
    $cnv move  "${tag}&&!line" $dx $dy

    # adjust the connections
    foreach {x y} [$cnv coords "${tag}&&center"] {break}
    # find all connections coming from $cnv (and adjust their start-point)
    foreach id [$cnv find withtag "connection&&src:${tag}" ] {
        foreach {_ _ x1 y1} [$cnv coords $id] {$cnv coords $id $x $y $x1 $y1}
    }
    # find all connections going to $cnv (and adjust their end-point)
    foreach id [$cnv find withtag "connection&&dst:${tag}" ] {
        foreach {x0 y0 _ _} [$cnv coords $id] {$cnv coords $id $x0 $y0 $x $y}
    }
}

这似乎可行,但我想知道是否有一个更优雅的解决方案.

而且,它需要我自己的包装程序move。是否有可能在某些虚拟事件中实现同样的目标?这样我就可以发出$cnv move $tag 10 20,甚至$cnv moveto $tag 123 456,并且连接被“通知”并自动更新?

EN

回答 1

Stack Overflow用户

发布于 2022-09-26 08:36:45

没有内置的机制来做这个。画布根本不知道一个项目的控制点与另一个项目的控制点之间的关系。(要改变这一点,需要在坐标处理系统中添加一个求解器才能正确执行,这将是一项很大的工作,因此不太可能发生。)

但是你可以在合适的东西上添加变量跟踪,这样当你用你真正使用的实体的逻辑坐标更新变量时,显示该实体的项目的坐标都会自动更新;信息流的方向和应用程序的特殊性使得它非常直接。所述变量可能是对象的数组或成员字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73851131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档