• learning to use canvas

    From Mark Summerfield@m.n.summerfield@gmail.com to comp.lang.tcl on Mon Dec 1 11:49:18 2025
    From Newsgroup: comp.lang.tcl

    I have created a canvas with scrollbars.
    It also supports mouse zoom (from code I got from the wiki).
    But the scrollbars don't seem to work and also appear to be
    unaffected by zooming. Here is a cut-down (working) version
    of my code (using Tcl/Tk 9 on Linux):

    #!/usr/bin/env wish9
    ttk::frame .mf
    canvas .mf.canvas -width 400 -height 400 -scrollregion {0 0 400 400}
    grid .mf.canvas -row 0 -column 0 -sticky news
    ttk::scrollbar .mf.scrolly -orient vertical \
    -command {mf.canvas yview}
    grid .mf.scrolly -row 0 -column 1 -sticky ns
    ttk::scrollbar .mf.scrollx -orient horizontal \
    -command {.mf.canvas xview}
    grid .mf.scrollx -row 1 -column 0 -sticky we
    grid columnconfigure .mf 0 -weight 1
    grid rowconfigure .mf 0 -weight 1
    pack .mf -expand 1 -fill both
    bind .mf.canvas <MouseWheel> {on_zoom %D}
    bind . <Alt-equal> {zoom 1.1}
    bind . <Alt-minus> {zoom [expr {1.0/1.1}]}
    bind . <Escape> exit
    wm protocol . WM_DELETE_WINDOW exit
    proc on_zoom delta { zoom [expr {$delta > 0 ? 1.1 : (1.0/1.1)}] }
    proc zoom factor {
    set x [.mf.canvas canvasx [expr {[winfo pointerx .mf.canvas] - \
    [winfo rootx .mf.canvas]}]]
    set y [.mf.canvas canvasy [expr {[winfo pointery .mf.canvas] - \
    [winfo rooty .mf.canvas]}]]
    .mf.canvas scale all $x $y $factor $factor
    }
    .mf.canvas create rectangle {20 20 80 80} -fill #FF0000
    .mf.canvas create rectangle {100 100 190 210} -fill #FFFF00 \
    -outline #00FF00 -width 1
    .mf.canvas create oval {120 120 260 180} -fill #0000FF \
    -outline #FF00FF -width 5
    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Luis Alejandro Muzzachiodi@aleccp@yahoo.com to comp.lang.tcl on Mon Dec 1 22:28:45 2025
    From Newsgroup: comp.lang.tcl

    Hello Mark,

    what about this ...

    ttk::frame .mf
    # add set for scroll
    canvas .mf.canvas -width 400 -height 400 -scrollregion {0 0 400 400} -yscrollcommand ".mf.scrolly set" -xscrollcommand ".mf.scrollx set"
    grid .mf.canvas -row 0 -column 0 -sticky news
    # add a missing point
    ttk::scrollbar .mf.scrolly -orient vertical -command {.mf.canvas yview}
    grid .mf.scrolly -row 0 -column 1 -sticky ns
    ttk::scrollbar .mf.scrollx -orient horizontal -command {.mf.canvas xview} grid .mf.scrollx -row 1 -column 0 -sticky we
    grid columnconfigure .mf 0 -weight 1
    grid rowconfigure .mf 0 -weight 1
    pack .mf -expand 1 -fill both
    bind .mf.canvas <MouseWheel> {on_zoom %D}
    #change plus for equal ... it seems more "consistent"
    bind . <Alt-plus> {zoom 1.1}
    bind . <Alt-minus> {zoom [expr {1.0/1.1}]}
    bind . <Escape> exit
    wm protocol . WM_DELETE_WINDOW exit
    proc on_zoom delta { zoom [expr {$delta > 0 ? 1.1 : (1.0/1.1)}] }
    proc zoom factor {
    set x [.mf.canvas canvasx [expr {[winfo pointerx .mf.canvas] -
    [winfo rootx .mf.canvas]}]]
    set y [.mf.canvas canvasy [expr {[winfo pointery .mf.canvas] -
    [winfo rooty .mf.canvas]}]]
    # changing first parameters from 0 to factor
    .mf.canvas scale all $factor $factor $factor $factor
    # changing scrollregion too
    set list [.mf.canvas cget -scrollregion]
    set p1 [expr [lindex $list 2 ] * $factor ]
    set p2 [expr [lindex $list 3 ] * $factor ]
    .mf.canvas configure -scrollregion [list 0 0 $p1 $p2 ]
    }
    .mf.canvas create rectangle {20 20 80 80} -fill #FF0000
    .mf.canvas create rectangle {100 100 190 210} -fill #FFFF00 \
    -outline #00FF00 -width 1
    .mf.canvas create oval {120 120 260 180} -fill #0000FF \
    -outline #FF00FF -width 5


    I hope this help you.

    Saludos,

    Alejandro


    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Mark Summerfield@m.n.summerfield@gmail.com to comp.lang.tcl on Tue Dec 2 07:58:27 2025
    From Newsgroup: comp.lang.tcl

    On Mon, 1 Dec 2025 22:28:45 -0300, Luis Alejandro Muzzachiodi wrote:

    [snip]

    Thanks Alejandro, that did solve the problems.

    (The reason I used <Alt-equal> is that on my keyboard = and + are
    on the same key and to get plus you have to press Alt-Shift-+ so
    it is easier to just use Alt-=.)


    --- Synchronet 3.21a-Linux NewsLink 1.2
  • From Harald Oehlmann@wortkarg3@yahoo.com to comp.lang.tcl on Tue Dec 2 09:26:01 2025
    From Newsgroup: comp.lang.tcl

    Am 02.12.2025 um 08:58 schrieb Mark Summerfield:
    On Mon, 1 Dec 2025 22:28:45 -0300, Luis Alejandro Muzzachiodi wrote:

    [snip]

    Thanks Alejandro, that did solve the problems.

    (The reason I used <Alt-equal> is that on my keyboard = and + are
    on the same key and to get plus you have to press Alt-Shift-+ so
    it is easier to just use Alt-=.)



    Yes, gesture support is a long wanted feature ;-).
    I use it only on Androwish to zoom in/out...

    Thanks,
    Harald
    --- Synchronet 3.21a-Linux NewsLink 1.2