LINUX.ORG.RU

Диалог на Tcl/Tk

 ,


0

1

Хочу реализовать ппостенький диалог настроек для своего поделия. Конфигурация состоит из 8 булевых значений, т.е. в диалоге должно быть только 8 чекбоксов. Сначала я хотел реализовать получение состояний всех чекбоксов по нажатию кнопки «Применить», но не нашел ни у checkbutton, ни у ttk::checkbutton возможности получить их текущее значение, им можно только указать переменную, куда писать. Это жутко неудобно. Посоветуйте, как правильно такое реализовывать.

★★★★

Правильно - указывать переменную куда писать. Заведи namespace для настроек и указывай переменные в нём. Например:

namespace ::settings {
    variable option1 false
    variable option2 true
    ...
}

ttk::checkbutton .opt1 -variable settings::option1

А получить текущее состояние вроде бы можно .opt1 state.

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

Спасибо, учту. Сейчас глянул, и правда,

.opt1 state
возвращает selected когда галочка установлена. Почему-то не обратил на это внимание раньше.

WRG ★★★★
() автор топика

Для checkbutton автоматом создается переменная по имени контрола

checkbutton .ck1
pack .ck1
puts $ck1
frame .fr1
pack .fr1
checkbutton .fr1.f1ck1
pack .fr1.f1ck1   

puts $f1ck1
futurama ★★★★★
()

Нет никаких неудобств с переменными

#!/usr/bin/wish

array set settings {}
set bits 8

for {set i 0} {$i < $bits} {incr i} {
    checkbutton .ck$i -text "bit $i"  -variable settings($i)
    pack .ck$i
}

button .bt1 -text {Show bits state} -command {
    for {set i 0} {$i < $bits} {incr i} {
        puts "Bit $i = $settings($i)"
    }
}
pack .bt1

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

О, спасибо за примеры, с массивом вообще годно. А вот с переменной я не очень понял. В каком просторанстве имен оно создается? У меня одна функция рисует окошко диалога, обработчик кнопки «Применить» это отдельная функция. Переменные, которые будут созданы для checkbutton'ов будут локальные для функции, которая создает окно. Как обращаться к ним находясь в другой функции? Думаю, что upvar тут не поможет, т.к. вызов обработчика происходит не из фукнции, которая рисует окно.

WRG ★★★★
() автор топика
Последнее исправление: WRG (всего исправлений: 2)
Ответ на: комментарий от futurama

Похоже, что нет.

#!/usr/bin/wish

proc show_gui {} {
    pack [ttk::checkbutton .cb -text "Param"]
}

show_gui
puts $cb

UPD: а вот так работает

#!/usr/bin/wish

proc show_gui {} {
    pack [checkbutton .cb -text "Param"]
}

show_gui
puts $cb

ttk::checkbutton в пролёте.

WRG ★★★★
() автор топика
Последнее исправление: WRG (всего исправлений: 1)
Ответ на: комментарий от WRG

ttk виджеты понимают имя виджета дослово, т. е. в Вашем примере переменная должна начинаться с точки:

puts $.cb
Обычные виджеты связываются с переменной без первой точки. Это, конечно, странно, но так уже сделано.

А чтобы не было проблем при работе с глобальной переменной, лучше явно указывать её полное имя, с разделителями прсотранств имён:

puts ${::.cb}
Также следует заметить, что виджет не требует, чтобы связанная с ним переменная существовала в момент его инициализации. Поэтому в Вашем примере puts всё равно будет вызывать ошибку; переменной-то ещё просто нет. Эта переменная будет создана при первом изменении состояния виджета, ну либо кто-то создаст эту переменную с каким-то значением, и виджет ореагирует на это изменением своего состояния.

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

Спасибо, разобрался.

WRG ★★★★
() автор топика
26 июля 2017 г.
Ответ на: tcl/tk от vip513

а ты быстрый, всего за год справился

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