Tk Source Code

View Ticket
Bounty program for improvements to Tcl and certain Tcl packages.
Ticket UUID: 1bb2f1d7abab69d31e49a159465e213944c92f3
Title: ttk::treeview doesn't delete tags
Type: Bug Version: 8.7a4
Submitter: emiliano Created on: 2020-05-03 23:13:56
Subsystem: 88. Themed Tk Assigned To: fvogel
Priority: 5 Medium Severity: Severe
Status: Closed Last Modified: 2020-05-24 08:48:16
Resolution: Fixed Closed By: fvogel
    Closed on: 2020-05-24 08:48:16
ttk::treeview never releases or deletes tags, leading to a memory leak

Trigger script

package require Tk
ttk::treeview .t
set id 0
foreach n {100 1000 10000 1000 100} {
    for {set i 0} {$i < $n} {incr i} {
        set item [format {Item#%05d} [incr id]]
        .t insert {} end -text $item -tags $item
    puts "Items: $n\nNumber of tags: [llength [.t tag names]]"
    foreach tag [.t tag names] {
        .t tag remove $tag

"Items" and "Number of tags" should be equal but the last number is always increasing
User Comments: fvogel added on 2020-05-24 08:48:16:
TIP #574 now accepted, and implementation is merged into trunk.
Good job! Thanks Emiliano!

fvogel added on 2020-05-08 15:46:47:

Thank you!

I have written the required TIP, see TIP #574

Also, I have committed your code and patch to branch tip-574.

emiliano added on 2020-05-04 21:39:08:
Attach a patch with a simple test

emiliano added on 2020-05-04 00:55:23:
The solution is to bring the tag facility in line with the one in the [text] widget, which provides [tag remove] and [tag delete] subcommands.
The first one allows removing the tag from a given range of characters (including all characters in the widget, using [$text tag remove $tag 1.0 end]). This, however, doesn't delete the tag information, and it still shows in the [tag names] subcommand. This is exactly the same functionality of the  [tag remove] in the treeview widget.
The [tag delete] subcommand performs a complete deletion of the tag information, including the removal of the tag from the widget and the tag configuration. It will not show in the [tag names] subcommand anymore.

Attached patch implements the [tag delete] subcommand for the ttk::treeview widget.