1

我需要找出我正在使用的 GTK+ 版本。问题是似乎涉及很多不同的版本号,我不确定哪些是最相关的。

我的系统是 Ubuntu 12.04,标配有 libgtk2.0-0,但是当我安装 Python 3.2 开发环境时,我还安装了许多其他包来绑定到 GTK3。

大多数时候,这一切都“正常工作”,但我想实现一些(在 devhelp 中)仅在 GTK 3.2 版中可用的东西。不用说,我问的原因是Python在API中找不到方法。

所以,现在我想知道我能做些什么(如果有的话),但首先我需要弄清楚我的系统上有什么。

这个问题似乎指向了正确的方向,但它已经过时了四年。有没有人有任何可以帮助的最新信息?

编辑:感谢@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 shell 中,我得到以下信息

>>> 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]比 Pythonic 多得多grid.get_child_at(0, 0),如果 PyGObject 团队想到这一点,那就太棒了。

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

打开您喜欢的 shell 并使用当前安装的 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 回答