A Tcl/Tk collapsable frame megawidget. https://github.com/ch32n/collapseframe
Instalation
package require collapseframe
Dependencies
collapseframe uses tksvg package.
Commands
Create megawidget
collapseW::create pathName
pathName add ?name? ?-text text? ?-font font? Creates entry in collapseframe widget
pathName getentrynames
returns entry names
pathName getentry entryname
returns entry object
pathName entryconfigure entryname ?-text text? ?-font font?
configure entry
pathName delete entryname
delete entry
Entry commands
entryObject cget option
entryObject configure
entryObject getframe
entryObject open
entryObject close
entryObject toggle
Examplespackage require collapseframe
proc createExampleEntry {path text args} {
set Frame [$path add {*}$args -text $text]
puts "Entry Frame: $Frame"
grid columnconfigure $Frame 0 -weight 10
ttk::label $Frame.l1 -text "Ex1 $text"
ttk::label $Frame.l2 -text "Ex2 $text"
grid $Frame.l1 -sticky nw
grid $Frame.l2 -sticky nw
return $Frame
}
font create LargerBold -family "Segoe UI" -size 10 -weight bold -slant italic
grid columnconfig . 0 -weight 10
grid rowconfig . 0 -weight 10
set CollapseFrame [collapseW::create .colFrame]
grid $CollapseFrame -row 0 -column 0 -sticky nesw
createExampleEntry $CollapseFrame Devices -font LargerBold
createExampleEntry $CollapseFrame Layout -font LargerBold
createExampleEntry $CollapseFrame Neighbors -font LargerBold
createExampleEntry $CollapseFrame Maps maps -font LargerBold
createExampleEntry $CollapseFrame Junk junk -font LargerBold
nico - 2025-07-21 Hi,
IMHO this is a great new widget :) (though I didn't tested it yet)
would it be possible to extend it to ttk::labelframe ?
Che2n - 2025-07-22 Hi,
Yes it's possible to use labelframe instead of normal frame.
There are 2 frames in CreateWidgets method of collapseW::entry class, widg(ContF) and widg(WFrame) you can change any of this frames to labelframe and it will work.
method CreateWidgets {Path} {
#Container Frame of megawidget
set widg(ContF) [ttk::frame $Path]
set widg(Label) [ttk::label $widg(ContF).l -style $ttkStyle(Label.Opened) -text [my cget -text] -font [my cget -font]]
#Frame that is returned
set widg(WFrame) [ttk::frame $widg(ContF).wf]
set widg(Sep) [ttk::separator $widg(ContF).sp]
rename $widg(ContF) ${widg(ContF)}_
return
}