2016-07-01 4 views
1

GTK3では、どのようにしてgtk_*_new_*()コンストラクタを使用できますか?例えばPython 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) 

それが直接、このような機能を使用することは可能ですか?

答えて

1

TLを、DR:代わりに便利なCのAPIの建設プロパティを設定するには、Pythonのコンストラクタ通常の形式を使用します。

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); 

(コンストラクタのみ) "最近マネージャ" プロパティを設定するために、すなわち、方法。

Pythonバインディングは、オブジェクトを構築するためにC APIを呼び出しません。 Pythonのコンストラクタ正規形、例えば:

button = Gtk.Button() 

g_object_new(GTK_TYPE_BUTTON, NULL)を呼び出すのと等価です。

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

これは、実行時に必要なすべての型の安全性を提供しますC.ザ・Pythonバインディング層でgtk_button_new_with_label()を呼び出すのと同等です:コンストラクタ正規形は、プロパティ名と値の辞書の形で、引数を受け付け。

通常、この方法を使用することをお勧めします、とないはので、CのAPIを呼び出す:それは言語の規則を次のように、それは、よりPython的にだ

  • ことができますように、それは、より柔軟です追加の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 _ *()'を使用したい場合は、直接参照する必要があります。 [参照が必要 - しかし、私はこのheheを見つけた覚えていない] –

+0

バインディングのような音があなたのためにそれを処理します。それは結構良い結束です。彼らはコンストラクタを必要としないが、Pythonの人々を台無しにする。 :) Perlは、一方で、タイピングを除いてCスタイルに近づきますが、簡単にバインドすることもできます。 – oldtechaa

関連する問題