В дочернем окне tcl / tk я не могу установить значение по умолчанию для моего виджета ввода - PullRequest
4 голосов
/ 25 июля 2011

Я полный новичок в мире tcl / tk, но я попытался исследовать этот вопрос самостоятельно и продолжаю выдавать пустые данные.

Я расширяю с помощью tcl / tkприложение, которое позволяет мне добавлять код для порождения дочернего окна и делать там, что мне нужно.Проблема в том, что когда я вызываю это окно и пытаюсь установить значение по умолчанию для моего виджета ввода, оно всегда отображается пустым.

С тех пор я создал ультра простое демонстрационное приложение, чтобы воспроизвести это:

#!/usr/local/bin/wish

set myvar1 "initial value 1"

entry .entry1 -textvariable myvar1
button .spawnchild -text "Spawn Child" -command "spawn_click"

pack .entry1 .spawnchild

proc spawn_click {} {
    set myvar2 "initial value 2"
    toplevel .lvl2
    entry .lvl2.entry2 -textvariable myvar2
    entry .lvl2.entry3 -textvariable myvar1
    pack .lvl2.entry2 .lvl2.entry3
}

Как видите, в первом окне содержится виджет ввода, который имеет значение по умолчанию «начальное значение 1» и отображается правильно.Когда я нажимаю кнопку «Spawn Child», создается дочернее окно.Как вы можете видеть, он содержит два сложенных виджета входа.Каждый из них имеет значение по умолчанию, причем один сверху использует значение по умолчанию, которое было создано в собственной области видимости, а запись внизу - значение по умолчанию в области действия основной программы.

Проблема заключается в том, чтоверхнее поле ввода по какой-то причине не показывает его значение по умолчанию, а нижнее - просто отлично.

Multiple Popup Windows

Может ли кто-нибудь дать объяснение этого поведения и как получитьверхний виджет для правильного отображения значения по умолчанию?

РЕДАКТИРОВАТЬ

Спасибо, Эндрю и Шленк, похоже, это был случай RTFM :) Я проверил ваши глобальные предложения иэто сработало, как и было обещано.Спасибо, что поправил меня!

Ответы [ 2 ]

4 голосов
/ 25 июля 2011

myvar2 необходимо определить на глобальном уровне.Определите spawn_click следующим образом:

proc spawn_click {} {
   global myvar2;  # myvar2 is a global variable

   set myvar2 "initial value 2"
   toplevel .lvl2
   entry .lvl2.entry2 -textvariable myvar2
   entry .lvl2.entry3 -textvariable myvar1
   pack .lvl2.entry2 .lvl2.entry3
}

и вам должно быть хорошо ...

enter image description here

4 голосов
/ 25 июля 2011

Прочитайте документацию опции -textvariable .Имя переменной должно быть глобальным (или полностью определенным пространством имен) именем переменной, но ваша переменная myvar2 является локальной переменной.Таким образом, вы устанавливаете переменную в вашем процессе, отличную от используемой переключателем textvariable.

Легким решением вашей проблемы было бы написать процесс следующим образом:

proc spawn_click {} {
    global myvar2
    set myvar2 "initial value 2"
    toplevel .lvl2
    entry .lvl2.entry2 -textvariable myvar2
    entry .lvl2.entry3 -textvariable myvar1
    pack .lvl2.entry2 .lvl2.entry3
}

Путем явного объявленияmyvar2 в качестве глобальной области видимости, вы бы использовали ту же переменную в привязке -textvariable.

...