Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$menu-settings не работали. Приходится заворачивать ${menu-settings}. Вот и сейчас выдает ошибку.key "menuBar" not known in dictionary
while executing
"dict get ${user-settings} 0 "menuBar""
(procedure "assemble-my-menu" line 6)
invoked from within
"assemble-my-menu"
dict set nonUserSettings 0 title "myPrograms"
dict set nonUserSettings 0 minWidth 800
dict set nonUserSettings 0 minHeight 600
dict set nonUserSettings 0 resizableX 1
dict set nonUserSettings 0 resizableY 1
set nonUserSettings {
0 {
title "myPrograms"
minWidth 800
minHeight 600
resizableX 1
resizableY 1
}
}
dict set nonUserSettings 0 {
title "myPrograms"
minWidth 800
minHeight 600
resizableX 1
resizableY 1
}
0?#!/usr/bin/env wish
package require Tcl 8.5
package require Tk
set windowparams {
title myPrograms
minsize {800 600}
resizable {1 1}
}
set userconfig {
menubar yes
}
set menu {
Connection {
"Log in" {
-command login
}
"Log out" {
-command logout
}
Exit {
-command exit
}
}
Help {
About {
-command about
}
Help {
-command help
}
}
-name menu
}
proc setup-window {w params} {
wm title $w [dict get $params title]
wm resizable $w {*}[dict get $params resizable]
wm minsize $w {*}[dict get $params minsize]
}
proc build-menu {menu w args} {
set label ""
dict with args {
set options [dict filter $menu key -*]
if {[dict exists $options -command]} {
$w add command -command [dict get $options -command] -label $label
} else {
if {[dict exists $options -name]} {
set name [dict get $options -name]
}
set m [menu $w.$name]
foreach {k v} $menu {
if {![string match -* $k]} {
build-menu $v $m label $k name [incr i]
}
}
if {[llength $args]} {
$w add cascade -menu $m -label $label
} else {
$w configure -menu $m
}
return $m
}
}
}
setup-window . $windowparams
if {[dict get $userconfig menubar]} {
build-menu $menu .
}
.Xdefaults.{} читабельнее. Во-вторых, т.к. в Tcl нет типов, каждая строка может интерпретироваться в зависимости от контекста. В-третьих, создание внутреннего представления list или dict быстрое, причём, что занимательно, гораздо эффективнее это сделать сразу, чем так, как Вы написали. Почему — читайте исходники. Списки надо делать через [list] тогда, когда у нас есть неконстантные в них значения, т.к. [list] автомагически сделает им правильное строковое представление. Делать же словари через [dict create] нужно вообще только в исключительных случаях.[dict create] и бэкслешами — это вообще нечитаемый и как раз-таки запутанный ужас.
Использование словарей в tcl