Различия между 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))
Другие вопросы по тегам