Различия между Gtk.Table и Gtk.Grid
Althought Gtk.table устарела, я получаю лучшие результаты с ним, вместо рекомендованного Gtk.Grid.
Вероятно, это моя ошибка, но я не смог найти проблему.
Моя цель - создать окно Gtk с блокнотом вверху и двумя кнопками внизу. Эти кнопки должны быть выровнены по горизонтали.
Мой код с таблицей работает как положено:
uses Gtk
class TestWindow : Window
init
// General characteristics of the window
title = "Gtk Containers"
default_height = 250
default_width = 250
window_position = WindowPosition.CENTER
destroy.connect(Gtk.main_quit)
// Now building the notebook
var notebook = new Gtk.Notebook()
var label1 = new Gtk.Label("Page one")
var label2 = new Gtk.Label("Page two")
var child1 = new Gtk.Label("Go to page 2 for the answer")
var child2 = new Gtk.Label("Go to page 1 for the answer")
notebook.append_page(child1, label1)
notebook.append_page(child2, label2)
// Now building the table
var table = new Table(2,2,true)
var button1 = new Gtk.Button.with_mnemonic("Button_1")
var button2 = new Button.with_mnemonic("Button_2")
// Attaching all elements into the table
table.attach_defaults(notebook, 0,2,0,1)
table.attach_defaults(button1, 0,1,1,2)
table.attach_defaults(button2, 1,2,1,2)
add(table)
init
Gtk.init (ref args)
var test = new TestWindow ()
test.show_all ()
Gtk.main ()
Однако тот же код с рекомендованным Gtk.Grid дает мне две кнопки без ноутбука:
uses Gtk
class TestWindow : Window
init
// General characteristics of the window
title = "Gtk Containers"
default_height = 250
default_width = 250
window_position = WindowPosition.CENTER
destroy.connect(Gtk.main_quit)
// Now building the notebook
var notebook = new Gtk.Notebook()
var label1 = new Gtk.Label("Page one")
var label2 = new Gtk.Label("Page two")
var child1 = new Gtk.Label("Go to page 2 for the answer")
var child2 = new Gtk.Label("Go to page 1 for the answer")
notebook.append_page(child1, label1)
notebook.append_page(child2, label2)
// Now building the grid
var grid = new Grid()
var button1 = new Gtk.Button.with_mnemonic("Button_1")
var button2 = new Button.with_mnemonic("Button_2")
// Attaching all elements into the grid
grid.attach(notebook, 0,2,0,1)
grid.attach(button1, 0,1,1,2)
grid.attach(button2, 1,2,1,2)
init
Gtk.init (ref args)
var test = new TestWindow ()
test.show_all ()
Gtk.main ()
Как достичь цели, используя Grid вместо таблиц? Не спрашивая код, просто указатель.
2 ответа
gtk_table_attach_defaults()
а также gtk_grid_attach()
действовать по-другому. Официальная документация на C указывает на это.
Дано
thing.attach(widget, a,b,c,d)
Для GtkTable четыре числа a
, b
, c
, а также d
являются фактическими номерами столбцов и строк, которые должен занимать заданный край виджета. a
это левый край, b
это правый край, c
это верхний край, и d
это нижний край.
Для GtkGrid, a
это столбец и b
строка, которую должен занимать верхний левый угол виджета, c
количество столбцов в ширине виджета, и d
это количество строк высотой виджета.
Или, другими словами,
table.attach_defaults(widget, left, right, top, bottom)
такой же как
grid.attach(widget, left, top,
right - left + 1, bottom - top + 1)
Надеюсь, какая-то часть этого объяснения прояснит ситуацию.
Быстрое решение для вашего кода будет
grid.attach(notebook, 0,0,2,1)
grid.attach(button1, 0,1,1,1)
grid.attach(button2, 1,1,1,1)
Для Gtk.Grid:
attach(child, left, top, width, height)
Параметры:
- child (Gtk.Widget) - виджет, который нужно добавить
- left (int) - номер столбца для прикрепления левой части дочернего элемента к
- top (int) - номер строки для прикрепления верхней стороны дочернего элемента к
- width (int) - количество столбцов, которые будет охватывать дочерний элемент
- height (int) - количество строк, которые будет охватывать дочерний элемент
Для Gtk.Table:
attach(child, left_attach, right_attach, top_attach, bottom_attach, xoptions, yoptions, xpadding, ypadding)
Параметры:
- child (Gtk.Widget) - виджет, который нужно добавить.
- left_attach (int) - номер столбца, к которому будет прикреплена левая часть дочернего виджета.
- right_attach (int) - номер столбца, к которому будет прикреплена правая часть дочернего виджета.
- top_attach (int) - номер строки, к которой будет прикреплен верх дочернего виджета.
- bottom_attach (int) - номер строки, к которой нужно прикрепить нижнюю часть дочернего виджета.
- xoptions (Gtk.AttachOptions) - Используется для указания свойств дочернего виджета при изменении размера таблицы.
- yoptions (Gtk.AttachOptions) - То же, что и xoptions, за исключением того, что это поле определяет поведение вертикального изменения размера.
- xpadding (int) - целое число, определяющее заполнение слева и справа от виджета, добавляемого в таблицу.
- ypadding (int) - количество отступов над и под дочерним виджетом.
Примечание: столбцы и строки индексируются с нуля.
andlabs верно, хотя его преобразование, добавляющее 1 к grid.attach справа и снизу, мне не помогло. Поскольку мне пришлось преобразовать многие из этих значений, я подготовил скрипт на python для упрощения этого процесса, HTH:
import sys
if len(sys.argv) < 2: raise Exception('Argument not provided')
args = ''.join([str(x) for x in sys.argv[1:]]).split(',')
if len(args) != 4: raise Exception('Please provide 4 attach arguments')
left, right, top, bottom = map(lambda a: int(a), args)
print("{}, {}, {}, {}".format(left, top, right - left, bottom - top))