在 GTK3 中,如何使用 gtk_*_new_*()
构造函数?
例如,考虑:
GtkWidget * gtk_recent_chooser_menu_new_for_manager ()
我该如何使用它?
我正在尝试移植 PyGTK2 程序,我可以通过执行以下操作来解决诸如 gtk_text_view_new_with_buffer()
之类的问题:
view = Gtk.TextView()
view.set_buffer(buffer)
是否可以直接使用这些函数?
最佳答案
tl;dr:使用 Python 构造函数范式来设置构造属性,而不是方便的 C API。
C API 中的各种 _new
构造函数(包括基本的 _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);
即一种设置(仅限构造函数)“recent-manager”属性的方法。
Python 绑定(bind)不调用 C API 来构造对象; Python 构造函数范式,例如:
button = Gtk.Button()
相当于调用g_object_new(GTK_TYPE_BUTTON, NULL)
。构造函数范式接受参数,以属性名称和值的字典的形式:
button = Gtk.Button(label='Hello, world')
这相当于在 C 中调用 gtk_button_new_with_label()
。Python 绑定(bind)层将在运行时提供所有必要的类型安全性。
通常建议使用此方法,并且不要调用 C API,因为:
- 它更Pythonic,因为它遵循语言的约定
- 它更加灵活,因为它允许您设置更多属性,而无需额外的 C API
关于Python GTK3 : how to use gtk_*_new_*() functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38154458/