1

使用している GTK+ のバージョンを確認する必要があります。問題は、非常に多くの異なるバージョン番号が関係しているように見えることです。どれが最も関連性があるかわかりません。

私のシステムは Ubuntu 12.04 であり、libgtk2.0-0 が標準で付属していますが、Python 3.2 開発環境をインストールしたときに、GTK3 にバインドする他の多くのパッケージもインストールしました。

ほとんどの場合、これはすべて「うまくいく」のですが、GTK のバージョン 3.2 でのみ (devhelp で) 利用できるものを実装したいと考えています。言うまでもなく、私が質問した理由は、Python が API でメソッドを見つけられないからです。

それで、今、私はそれについて何ができるか(もしあれば)疑問に思っていますが、最初に自分のシステムに何があるのか​​ を正確に知る必要があります.

この質問は正しい方向を指しているように見えますが、4 年も前のものです。誰かが役立つ最新の情報を持っていますか?

編集: @ptomato と @Pablo の有益な回答に感謝します。私の問題は、出てくるさまざまな象形文字をどのように理解するかです。dpkg の出力は (特に) 次のようになります。

bob@bobStudio:~$ dpkg -l libgtk* | grep ^i
ii  libgtk-3-0                             3.4.2-0ubuntu0.4                        GTK+     graphical user interface library
ii  libgtk-3-bin                           3.4.2-0ubuntu0.4                           programs for the GTK+ graphical user interface library
ii  libgtk-3-common                        3.4.2-0ubuntu0.4                        common files for the GTK+ graphical user interface library
ii  libgtk-3-dev                           3.4.2-0ubuntu0.4                        development files for the GTK+ library
ii  libgtk-3-doc                           3.4.2-0ubuntu0.4                        documentation for the GTK+ graphical user interface library
[etc....]

Python3シェルでは、次のようになります

>>> from gi.repository import Gtk
>>> Gtk.MAJOR_VERSION, Gtk.MINOR_VERSION, Gtk.MICRO_VERSION
(3, 4, 2)

これを正しく読んだ場合 (よくわかりません)、これは GTK+ バージョン 3.4.2 を使用していることを意味しますが、ライブラリの番号、つまりlibgtk-3-0. また、3.4.2 を使用している場合、3.2 で使用可能であるとラベル付けされたメソッドが存在しないのはなぜですか?

誰かが異なる数字の意味を説明できますか?

EDIT2:より具体的には、私が調査している方法はGtk.Grid().get_child_at(). DevHelp GTK+ マニュアルから、

gtk_grid_get_child_at ()

GtkWidget *         gtk_grid_get_child_at               (GtkGrid *grid,
                                                         gint left,
                                                         gint top);
Gets the child of grid whose area covers the grid cell whose upper left corner is at left, top.

grid :    a GtkGrid
left :    the left edge of the cell
top :     the top edge of the cell
Returns : the child at the given position, or NULL
Since 3.2

現在のプロジェクトでこの方法を使用しようとしましたが、スタック トレースに次のメッセージが表示されます。

    neighbour = self.parent.grid.get_child_at(x, y)
AttributeError: 'Grid' object has no attribute 'get_child_at'

しかし、私が Gtk 3.4.2 を使用していて、メソッドが「3.2 以降」で利用可能だった場合、あまり意味がないように思われます。多分私は他の場所で間違いを犯しましたか?

エラーを説明する短いテスト プログラムを次に示します (<-------- とマークされた行を参照)。

from gi.repository import Gtk

window = Gtk.Window()
grid = Gtk.Grid()
window.add(grid)

# the callout method
def on_button_clicked(widget):
    origin = grid.get_child_at(0, 0) #<-------------
    if widget == origin:
        print('You clicked (0,0)')
    else:
        print('You clicked (1,0)')

# add a couple of widgets
button00 = Gtk.Button()
button10 = Gtk.Button()
button00.set_label('(0,0)')
button10.set_label('(1,0)')
grid.attach(button00, 0, 0, 1, 1)
grid.attach(button10, 1, 0, 1, 1)

# attach the callouts
button00.connect("clicked", on_button_clicked)
button10.connect("clicked", on_button_clicked)

# display the window
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
4

2 に答える 2

3

Python プロンプトで次のように入力するか、スクリプトで同等の操作を行います。

>>> from gi.repository import Gtk
>>> Gtk.MAJOR_VERSION, Gtk.MINOR_VERSION, Gtk.MICRO_VERSION
(3, 4, 3)

この番号は、使用している GTK の実際のバージョン番号です。パッケージは、そのlibgtk-3-0パッケージが 3.0 シリーズ用であることを示しており、メジャー バージョン番号が 3 の後続のすべてのバージョンと互換性があります。パッケージの名前が 3.2 などに変更された場合、それをアップグレードすることはできず、他のすべてのパッケージが破損します。

に関してはGtk.Grid.get_child_at()、Gtk 3.4.2 を使用した私の Python セットアップでも利用できません。Python API は C API から自動的に生成されるため、これは奇妙です。このような問題に直面している場合、最初にすべきことは、プログラムに別のエラーがないことを再確認することです。

>>> from gi.repository import Gtk
>>> grid = Gtk.Grid()
>>> 'get_child_at' in dir(grid)
False

したがって、実際には方法はありません。メソッドは、ドキュメントのコメントのようにマークされている場合があります。これは、メソッドが(skip)C のみであり、他の言語のバインディングに表示されるべきではないことを意味します。それもチェックしてください。GTK のソース コードはオンラインでここにあります。を検索すると、注釈get_child_atがないことがわかります。(skip)だから、それも問題ではありません。

次に行うことは、PyGObject ソース コードのオーバーライドを確認することです。特定のメソッドが、より Pythonic なものに取って代わられることがあります。たとえば、grid[0, 0]PyGObjectgrid.get_child_at(0, 0)チームがそれを考えていたら、それは素晴らしいことです。

>>> grid[0, 0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Grid' object has no attribute '__getitem__'

そのような幸運はありません。ここで PyGObject の GTK オーバーライドを見てget_child_at、 、 などを検索してくださいGrid。言及はありません。

したがって、私が考えることができる唯一の可能性はバグです。http://bugzilla.gnome.orgにアクセスして、Python バインディングにこのメソッドがないことを報告してください。あなたが野心的だと感じているなら、grid[0, 0]彼らにも記譜法を提案してみませんか?

于 2012-09-22T16:09:44.820 に答える
2

好みのシェルを開き、現在インストールされている gtk 名を使用します

 rpm -q gtk2
 rpm -ql --info gtk2-2.8.20-1 |less

またはこのページをよく見てください。 http://forums.fedoraforum.org/showthread.php?t=119358

これはdebianで機能するはずです

 dpkg -l | grep libgtk

詳細情報はこちらにありますhttp://manpages.ubuntu.com/manpages/lucid/man1/dpkg.1.html

于 2012-09-22T06:30:57.293 に答える