Posted to tcl by emiliano at Sun Apr 23 23:59:25 GMT 2023view raw

  1. package require Tk
  2.  
  3. proc insertAt0 {t args} {
  4. if {[$t index @0,0] eq "1.0"} {
  5. $t mark set beginning 1.0
  6. set offset [lindex [$t bbox 1.0] 1]
  7. set bd [$t cget -borderwidth]
  8. set py [$t cget -pady]
  9. }
  10. $t insert 1.0 {*}$args
  11. if {"beginning" in [$t mark names]} {
  12. $t yview beginning
  13. $t mark unset beginning
  14. $t yview scroll [expr {$bd + $py - $offset}] pixels
  15. }
  16. }
  17.  
  18. # test
  19. pack [scrollbar .sy -command [list .t yview]] -side right -fill y
  20. pack [text .t -yscrollcommand [list .sy set]] -side right -expand 1 -fill both
  21.  
  22. # insert some text
  23. .t insert end {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam elit nibh, pulvinar eu nulla a, ultricies semper metus. Sed tristique arcu risus, eget ultricies nisi luctus ac. Proin vel orci suscipit, bibendum orci a, volutpat mi. Fusce tincidunt convallis pellentesque. Proin sit amet suscipit dui. Etiam feugiat rhoncus dui. Quisque feugiat at orci sit amet convallis. Suspendisse vehicula lectus sit amet ornare tincidunt. Quisque congue, tortor vel suscipit efficitur, elit nunc mollis eros, quis imperdiet justo purus vitae purus.
  24.  
  25. Sed et metus mollis, ultrices diam sit amet, tincidunt nunc. Maecenas vitae mattis nisl, quis rutrum velit. Vestibulum eget felis at risus posuere ornare non eget turpis. Vestibulum in nisi congue, finibus ipsum vel, volutpat nibh. Suspendisse tristique vel mauris vehicula molestie. Cras pharetra, arcu sit amet ullamcorper viverra, diam lorem tincidunt ante, vel porttitor lectus metus id ante. Cras molestie magna condimentum, faucibus lectus vel, hendrerit mi. Morbi mauris nibh, luctus at erat ut, consequat tincidunt dolor. Aenean consectetur eget nisl nec gravida. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut non purus eu ex pretium egestas vitae eu lectus. Donec semper malesuada nibh. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus ut elit a odio blandit hendrerit.
  26.  
  27. Donec vitae malesuada quam, at congue sapien. Phasellus vulputate enim nisi. Etiam volutpat nec sem vel consequat. In vitae scelerisque quam. Integer semper eleifend tellus nec dignissim. Phasellus nec metus sem. Aenean id vestibulum nibh. Donec feugiat sit amet augue ac lacinia. Praesent congue convallis metus, nec pulvinar nisi placerat sed. Aenean ut tortor malesuada, gravida ipsum ac, imperdiet purus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at quam a dui malesuada luctus vitae sit amet metus.
  28.  
  29. Sed vel condimentum tellus. Integer bibendum imperdiet arcu non viverra. Quisque elementum semper diam nec dapibus. Pellentesque id euismod libero. Sed ornare aliquam nunc, et sollicitudin odio porta vel. Praesent a lorem nec turpis mollis pharetra ut id nunc. Quisque sodales vehicula fermentum.}
  30.  
  31. # show only a part of the first line
  32. .t yview scroll 7 pixels
  33. after 3000 [list insertAt0 .t line1\n {} line2\n {} line3\n]
  34.  

Comments

Posted by emiliano at Mon Apr 24 12:56:47 GMT 2023 [text] [code]

# A better version (forgot to count the highlight thickness) package require Tk proc insertAt0 {t args} { if {[$t index @0,0] eq "1.0"} { $t mark set beginning 1.0 set offset [expr { -[lindex [$t bbox 1.0] 1] + [$t cget -borderwidth] + [$t cget -pady] + [$t cget -highlightthickness] }] } $t insert 1.0 {*}$args if {"beginning" in [$t mark names]} { $t yview beginning $t mark unset beginning $t yview scroll $offset pixels } } # test pack [scrollbar .sy -command [list .t yview]] -side right -fill y pack [text .t -yscrollcommand [list .sy set]] -side right -expand 1 -fill both # insert some text .t insert end {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam elit nibh, pulvinar eu nulla a, ultricies semper metus. Sed tristique arcu risus, eget ultricies nisi luctus ac. Proin vel orci suscipit, bibendum orci a, volutpat mi. Fusce tincidunt convallis pellentesque. Proin sit amet suscipit dui. Etiam feugiat rhoncus dui. Quisque feugiat at orci sit amet convallis. Suspendisse vehicula lectus sit amet ornare tincidunt. Quisque congue, tortor vel suscipit efficitur, elit nunc mollis eros, quis imperdiet justo purus vitae purus. Sed et metus mollis, ultrices diam sit amet, tincidunt nunc. Maecenas vitae mattis nisl, quis rutrum velit. Vestibulum eget felis at risus posuere ornare non eget turpis. Vestibulum in nisi congue, finibus ipsum vel, volutpat nibh. Suspendisse tristique vel mauris vehicula molestie. Cras pharetra, arcu sit amet ullamcorper viverra, diam lorem tincidunt ante, vel porttitor lectus metus id ante. Cras molestie magna condimentum, faucibus lectus vel, hendrerit mi. Morbi mauris nibh, luctus at erat ut, consequat tincidunt dolor. Aenean consectetur eget nisl nec gravida. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut non purus eu ex pretium egestas vitae eu lectus. Donec semper malesuada nibh. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus ut elit a odio blandit hendrerit. Donec vitae malesuada quam, at congue sapien. Phasellus vulputate enim nisi. Etiam volutpat nec sem vel consequat. In vitae scelerisque quam. Integer semper eleifend tellus nec dignissim. Phasellus nec metus sem. Aenean id vestibulum nibh. Donec feugiat sit amet augue ac lacinia. Praesent congue convallis metus, nec pulvinar nisi placerat sed. Aenean ut tortor malesuada, gravida ipsum ac, imperdiet purus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus at quam a dui malesuada luctus vitae sit amet metus. Sed vel condimentum tellus. Integer bibendum imperdiet arcu non viverra. Quisque elementum semper diam nec dapibus. Pellentesque id euismod libero. Sed ornare aliquam nunc, et sollicitudin odio porta vel. Praesent a lorem nec turpis mollis pharetra ut id nunc. Quisque sodales vehicula fermentum.} # show only a part of the first line .t yview scroll 7 pixels after 3000 [list insertAt0 .t line1\n {} line2\n {} line3\n]