【tcltk - tk】proc makemenu

tcl.8.6.10,tk.8.6.10。

看用例点我

proc makemenu {root args} {
    set me makemenu
    set mu $root
    if {![winfo exists $root]} {menu $root}
    foreach {ty la ex} $args {
        switch -- $ty {
        c {
            if {$ex eq {.}} {set ex {}}
            if {[string is digit -strict [lindex $ex 0]]} {
                lappend ex -underline [lindex $ex 0]
                set ex [lrange $ex 1 end]
            }
            $mu add command -label $la {*}$ex
        }
        / {
            set w $mu.$la
            set cnf [list -label $la]
            while {1} {
                if {[regexp {\A\.\S+\Z} [lindex $ex 0]]} {
                    set w $mu[lindex $ex 0]
                    set ex [lrange $ex 1 end]
                    continue}
                if {[string is digit -strict [lindex $ex 0]]} {
                    lappend cnf -underline [lindex $ex 0]
                    set ex [lrange $ex 1 end]
                    continue}
                if {[regexp {\A\-[a-z]+\Z} [lindex $ex 0]]} {
                    lappend cnf [lindex $ex 0] [lindex $ex 1]
                    set ex [lrange $ex 2 end]
                    continue}
                break
            }
            $mu add cascade -menu [menu $w] {*}$cnf
            $me $w {*}$ex
        }
        n {
            if {$ex eq {.}} {set ex {}}
            $mu add checkbutton -label $la {*}$ex
        }
        r {
            if {$ex eq {.}} {set ex {}}
            $mu add radiobutton -label $la {*}$ex
        }
        . {return}
        - {$mu add separator}
        default {return}
        };#switch;
    }
    return
};list proc makemenu;

用例:

# 构建菜单 .menu,并构建命令菜单项 hello 和 world。
makemenu .menu c hello . c world .
# 上例升级,带有命令项配置的 hello 菜单项。命令配置:{wm title . hello}。
makemenu .menu c hello {-command {wm title . hello}} c world .
# 上例继续升级,分别为 hello 和 world 单项添加 -underline 配置。
makemenu .menu c hello {0 -command {wm title . hello}} c world 0
# 配置 checkbutton 菜单项
makemenu .menu n red . n green . n blue .
# 带配置项的 checkbutton 菜单项
makemenu .menu n red {-onvalue r -variable c} n green {-onvalue g -variable c} n blue {-onvalue b -variable c}
# 配置 radiobutton 菜单项
makemenu .menu r red . r green . r blue .
# 配置子菜单项
makemenu .menu / file . / edit . / help .
# 配置子菜单项的子菜单项
makemenu .menu {*}{
/ file .
/ edit {
c cut .
c copy .
c paste .
c {select all} .}
/ help .
}
# 子菜单项的命令名
makemenu .menu / file . ;# .menu.file
# 为子菜单项配置 pathName
makemenu .menu / file {.wenjian} ;# .menu.wenjian
# tip
makemenu .menu / file {0 .wegjian c cmd1 . c cmd2 .} ;# ok
makemenu .menu / file {.wenjian 0 c cmd1 . c cmd2 .} ;# ok 吐

 done.

你可能感兴趣的:(【tcltk - tk】proc makemenu)