Python GTK3 : how to use gtk_*_new_*() functions

标签 python gtk3

在 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/

相关文章:

python - 如何在 GTK3 中拖放和排序 GtkTreeView?

perl - 如何将 PDL 图像转换为 GdkPixbuf

widget - 在 gnome 调整工具中用作侧菜单的 Gtk+ 小部件的名称

python - 对两个列表的操作

python - 如何通过识别模式来替换具有不同名称的列的条目?

python - 从默认 ~/ntlk_data 更改 nltk.download() 路径目录

c - GTK3 中的可滚动布局

c++ - GTK3:使用拖放时鼠标消失

python - 最大限度地分散所有护士的调度

python - 使用 Python 计算并打印子文件夹中的文件数