Интегрировать виджет сетки Tk в макет ноутбука - PullRequest
0 голосов
/ 19 апреля 2019

Я хочу быстро создать прототип GUI и подумал, что Tk может быть простым в изучении.Однако мне не удалось интегрировать образец сетки (фрейм) в одну из вкладок виджета блокнота.Команда pack размещает сетку на верхней части ноутбука, и я не смог найти правильный вариант.Или мой подход в любом случае неверен?

Вот код:

ttk::frame .c
ttk::frame .c.f -borderwidth 5 -relief sunken -width 200 -height 100
ttk::label .c.namelbl -text Name
ttk::entry .c.name
ttk::checkbutton .c.one -text One -variable one -onvalue 1; set one 1
ttk::checkbutton .c.two -text Two -variable two -onvalue 1; set two 0
ttk::checkbutton .c.three -text Three -variable three -onvalue 1; set three 1
ttk::button .c.ok -text Okay
ttk::button .c.cancel -text Cancel

grid .c -column 0 -row 0
grid .c.f -column 0 -row 0 -columnspan 3 -rowspan 2
grid .c.namelbl -column 3 -row 0 -columnspan 2
grid .c.name -column 3 -row 1 -columnspan 2
grid .c.one -column 0 -row 3
grid .c.two -column 1 -row 3
grid .c.three -column 2 -row 3
grid .c.ok -column 3 -row 3
grid .c.cancel -column 4 -row 3

# Notebook --> shall contain above grid in third tab
ttk::notebook .n  -width 600 -height 200
ttk::frame .n.f1; 
ttk::frame .n.f2; 
.n add .n.f1 -text "FirstTab"
.n add .n.f2 -text "SecondTab"
.n add .c -text "GridContent"
pack [label .n.f1.f1 -background red -foreground white -text "First"]
pack [label .n.f2.f2 -background red -foreground white -text "Second"]
pack .c 
pack .n 
ttk::notebook::enableTraversal .n

1 Ответ

1 голос
/ 19 апреля 2019

Виджеты содержимого ttk::notebook должны быть выше в порядке наложения, чем записная книжка, чтобы он работал правильно, и должен управляться самим ноутбуком, а неpack или grid (хотя их содержимым можно управлять любым способом);Записные книжки - это особый вид менеджера геометрии, а также виджет.(Tk имеет несколько других виджетов, которые делают это тоже.)

Чтобы исправить порядок наложения, либо создайте виджет .c после виджета .n, либо raise .c после создания .n.Обратите внимание, что дочерние элементы родительского виджета (за исключением toplevel s и menu s в некоторых случаях) всегда располагаются поверх родительского элемента и всегда ограничены / обрезаны их родителем.

Исправитьпроблема управления, просто не надо pack .c;достаточно добавить его в блокнот.Вы можете упаковать или упорядочить содержимое .c по своему усмотрению.


С этими двумя небольшими исправлениями ваш пользовательский интерфейс работает.

ttk::frame .c
ttk::frame .c.f -borderwidth 5 -relief sunken -width 200 -height 100
ttk::label .c.namelbl -text Name
ttk::entry .c.name
ttk::checkbutton .c.one -text One -variable one -onvalue 1; set one 1
ttk::checkbutton .c.two -text Two -variable two -onvalue 1; set two 0
ttk::checkbutton .c.three -text Three -variable three -onvalue 1; set three 1
ttk::button .c.ok -text Okay
ttk::button .c.cancel -text Cancel

grid .c -column 0 -row 0
grid .c.f -column 0 -row 0 -columnspan 3 -rowspan 2
grid .c.namelbl -column 3 -row 0 -columnspan 2
grid .c.name -column 3 -row 1 -columnspan 2
grid .c.one -column 0 -row 3
grid .c.two -column 1 -row 3
grid .c.three -column 2 -row 3
grid .c.ok -column 3 -row 3
grid .c.cancel -column 4 -row 3

# Notebook --> shall contain above grid in third tab
ttk::notebook .n  -width 600 -height 200
ttk::frame .n.f1; 
ttk::frame .n.f2; 
.n add .n.f1 -text "FirstTab"
.n add .n.f2 -text "SecondTab"
.n add .c -text "GridContent"
raise .c;   # <<<< YES! YOU DO WANT THIS! <<<< YES! <<<< YES! <<<< YES! <<<<
pack [label .n.f1.f1 -background red -foreground white -text "First"]
pack [label .n.f2.f2 -background red -foreground white -text "Second"]
# pack .c;  # <<<< NO! YOU DO NOT WANT THIS! <<<< NO! <<<< NO! <<<< NO! <<<<
pack .n 
ttk::notebook::enableTraversal .n
...