2016-01-01 4 views
1

Хотя gtk.table устарел, я получаю лучшие результаты с ним, а не с рекомендованным Gtk.Grid.Отличия btw 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() действуют по-разному. Об этом указывает official documentation in 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) 
0

andlabs «s объяснение правильно, хотя его преобразование добавления 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)) 

 Смежные вопросы

  • Нет связанных вопросов^_^