2016-07-01 2 views
1

В GTK3, как я могу использовать конструкторы gtk_*_new_*()?Python GTK3: как использовать gtk _ * _ новые функции _ *()

Например, рассмотрим:

GtkWidget * gtk_recent_chooser_menu_new_for_manager() 

Как я могу его использовать?

Я пытаюсь порта программу PyGTK2, и я могу обойти такие вещи, как gtk_text_view_new_with_buffer() путем вместо делать:

view = Gtk.TextView() 
view.set_buffer(buffer) 

Можно ли использовать такие функции, непосредственно?

ответ

1

TL; др: Используйте Python конструктор нормальную форму, чтобы установить строительные свойства вместо удобства C API.

Различные конструкторы _new в API C, включая базовые _new(), являются только обертки вокруг g_object_new(). Конструкторы, такие как type_new_with_foo(), являются просто удобными функциями для разработчиков C, чтобы обеспечить некоторую безопасность типов по вызову g_object_new() и настройке свойств; так, например, gtk_recent_chooser_menu_new() просто:

return g_object_new (GTK_TYPE_RECENT_CHOOSER_MENU, NULL); 

и gtk_recent_chooser_menu_new_for_manager() является:

return g_object_new (GTK_TYPE_RECENT_CHOOSER_MENU, 
        "recent-manager", manager, 
        NULL); 

т.е. таким образом, чтобы установить (конструктор-только) свойство "недавно-менеджер".

Связи Python не вызывают API C для построения объектов; конструктор Python нормальная форма, например .:

button = Gtk.Button() 

является эквивалентом вызова g_object_new(GTK_TYPE_BUTTON, NULL). Конструктор нормальная форма принимает аргументы, в виде словаря имен свойств и значений:

button = Gtk.Button(label='Hello, world') 

Это эквивалентно вызову gtk_button_new_with_label() в C. Python привязок слоя будет предоставлять всю необходимую безопасность типа во время выполнения ,

Это, как правило, рекомендуется использовать этот подход, и не вызова API C, потому что:

  • это больше вещий, как это следует условность языка
  • это более гибким, поскольку он позволяет вы установили больше свойств, не требуя дополнительных C API
+0

Это было превосходное описание конструкторов в привязках. Между тем, я открываю следующий связанный вопрос. Как вы думаете, вы можете помочь? http://stackoverflow.com/questions/38171196/python-gtk3-how-to-create-a-gtk-filechoosedialog –

1

Я выясняю это.

Видимо, вы можете просто использовать такие вещи, как:

view = Gtk.TextView.new_with_buffer(buffer) 

Интересно, Gtk.TextView.new() == Gtk.TextView()

+0

Я не знаю, требует ли Python эти функции. Конструктор ('* new()') должен выполнять дополнительную работу, но, возможно, все же привязки. C, C++ и т. Д.однако требуются эти функции, потому что вы создаете 'GtkWidget', а затем создаете его с помощью конструктора. С другой стороны, у вас есть безликие языки, такие как Perl, где вы используете функции для различения различных типов виджетов. – oldtechaa

+0

@oldtechaa В Python 'Gtk.Button()' такой же, как 'Gtk.Button.new()'. Если вы хотите использовать пользовательский 'new _ *()', вы должны ссылаться на него напрямую. [ссылка нужна - но я не помню, где я нашел это хе-хе] –

+0

Кажется, что привязка обрабатывает ее для вас. Тогда это довольно хорошая привязка. Это портит людям Python, но не нуждается в их конструкторах. :) Perl, с другой стороны, придерживается близко к стилю C, за исключением набора текста, но также является хорошим легким связыванием. – oldtechaa

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