LINUX.ORG.RU

[tcl/tk][непонять] listbox -listvariable


0

2

при вызове

proc qwe { } {

 ...

   set l [ list a b c d ]
   listbox .h -listvariable l
 ...

}

создаётся пустой список.

Данныя процедура вызывается в в другом файле и подключена через source

Если создавать listbox в вызываемом файле со списком, то всё работает.

В чём может быть проблема


В любом случае l хочет быть глобальной.

test.tcl:

package require Tk

proc qwe { } {
   global l
   set l [ list a b c d ]
   listbox .h -listvariable ::l
   pack .h
   unset l
}

qwe

test2.tcl:

package require Tk

source l.tcl
qwe

l.tcl:

proc qwe { } {
   global l
   set l [list a b c d]
   listbox .h -listvariable l
   pack .h
   unset l
}

Судя по отсутствию комментариев ТСа в «[tcl/tk] Окно логина (guilder)», анонимы недостойны никакой реакции, не говоря уже о элементарном «спасибо».

anonymous
()
Ответ на: комментарий от anonymous

вообщето я отреагировал тем что сразу поставил галку как решённую

но зачем делать переменную глобальной?

guilder
() автор топика
Ответ на: комментарий от anonymous
proc qwe { } {
   global l
   set l [list a b c d]
   listbox .h -listvariable l
   pack .h
   unset l
}

помогло, спасибо, в чём смысл глобализации листа

guilder
() автор топика
Ответ на: комментарий от guilder

>вообщето я отреагировал тем что сразу поставил галку как решённую

не знал, что эти галки значат, извини ...

там было два решения, какое предпочел?

в чём смысл глобализации листа

видимо, так написана listbox, тащит переменную либо из указанного нэймспейса (типа ::asdf::l), либо из глобального, listbox вешает на переменную (список) trace и автоматически меняет содержимое при изменении этой переменной (списка), а с локальными trace не работает (более продвинутые в тикле товарищи, возможно меня поправят).

Если нужно будет менять содержимое листбокса через объявленный список, то «unset l» в примерах, естественно, нужно убрать, и в процессе исполнения менять сам «l».

ИМХО, source лучше применять только для загрузки настроек приложения, для всего остального оформлять пакеты с нэймспейсами.

anonymous
()
Ответ на: комментарий от anonymous

в том топике я выбрал решение с withdraw

я пробую испольовать source чтобы не получить простыню.

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

guilder
() автор топика
Ответ на: комментарий от anonymous

Думаю, всё проще: отрисовка listbox происходит позже. Связь с переменной постоянная, lixtbox — глобальный объект. Естественно, он требует глобальной же переменной.

Смоляное Чучелко

fat-II
()
Ответ на: комментарий от guilder

Еще одно добавление/рекомендация/пожелание guilder'у. Тикль в связке с Тк — язык который во многих случаях позволяет короткой записью создавать много. При этом получиться не очень и большая «простыня».

Так в данном случае "-listvariable" имеет смысл только когда хочешь привязать листбокс к списку, который будет меняться в процессе исполнения (листбокс, соответственно, автоматически будет менять свое наполнение). Листбок с заранее заданными элементами короче создать так:

[listbox .h] insert 0 a b c d
Если элементы в заранее созданном списке то для тикля 8.5 и выше:
[listbox .h] insert 0 {*}$l
Для более старых версий через eval:
eval "[listbox .h] insert 0 $l"

Удачи.

anonymous
()
Ответ на: комментарий от anonymous

я список для листвокса получаю из базы

При этом получиться не очень и большая «простыня».

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

а так спасибо

guilder
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.