Tcl / Tk: «неверное имя пути к окну», когда оно не является путем к окну

#tcl #tk

#tcl #tk

Вопрос:

У меня есть скрипты, которые использовались без Tk. Когда я добавил Tk, одна строка обрабатывается как путь к окну, и я не понимаю, почему.

Информация об ошибке выглядит так: bad window path name "* Log directory: D:/tests/log/2016_10_13_17_30_29"

Это происходит, когда выполняется эта строка:

 message "* Log directory: ${dirname}"
 

dirname разрешается как путь к каталогу, например:

 D:/tests/log/2016_10_13_17_30_29
 

message это простая процедура для входа в файл:

 proc message {text} {
    global test_log_filename
    puts -nonewline $test_log_filename "[timestamp]         "
    puts $test_log_filename $text
}
 

Когда я не использую Tk, он работает правильно. Насколько я понимаю, он принимает message аргумент процедуры как путь к окну Tk, но я не знаю почему. Конечно, такого окна не существует.

Я также попытался вызвать что-то вроде message test , чтобы подтвердить, что это проблема аргумента. Выдает ошибку bad window path name "test"

Не могли бы вы помочь с этим?

Ответ №1:

Tk также определяет вызываемую команду message (это виджет, похожий на a label , но с несколько другим алгоритмом переноса слов; это не рекомендуется для нового кода), и по какой-то причине это выигрывает. Хотя вы, вероятно, могли бы заставить использовать свой вместо этого, напрямую source вводя свой код после package require Tk , это вряд ли будет хорошей идеей, поскольку из-за этого вы можете обнаружить некоторые другие нарушения кода. (Я не могу вспомнить, используется ли оно в настоящее время в стандартных диалоговых окнах, но это то, что может пойти не так.)

Проще всего изменить имя вашей процедуры ведения журнала. Возможно, к Message (с заглавной буквы). Это не должно занять много времени, поскольку фактически это не намного больше, чем глобальный поиск и замена.