collapseframe

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

  • name: name is optional. If not specified it is dynamically generated.
  • font: Font to use for label text
  • text: Specifies a text string to be displayed inside the 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

 Examples
package 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

 Comments

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
}