Python3:我怎样才能找到我正在使用的GTK +版本?

时间:2012-09-22 06:25:20

标签: python-3.x ubuntu-12.04 gtk3

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

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

大多数情况下,这一切都“正常”,但我希望实现(在devhelp中)仅在GTK版本3.2中可用的内容。不用说,我的理由是Python无法在API中找到该方法。

所以,现在我想知道我能做些什么(如果有的话),但首先我需要找出我系统上的确切内容。

This question似乎指向了正确的方向,但它已经过时了四年。有没有人有最新的信息可以提供帮助?

编辑:感谢@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()

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

在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(),它在我的Python设置中也不适用于Gtk 3.4.2。这很奇怪,因为Python API是从C API自动生成的。如果您遇到这样的问题,那么首先要做的是仔细检查程序中是否存在不同的错误:

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

所以真的没有方法。有时候文档注释中的方法被标记为(skip),这意味着它们只是C语言,不应该出现在其他语言的绑定中;所以检查一下。 GTK源代码在线here;搜索get_child_at,您会看到没有(skip)注释。所以这也不是问题。

接下来要做的是检查PyGObject源代码以进行覆盖。有时某些方法被更多Pythonic的东西所取代;例如,grid[0, 0]将比grid.get_child_at(0, 0)更加Pythonic,如果PyGObject团队想到这一点,它会很棒。

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

没有这样的运气。所以看看PyGObject的GTK覆盖here并搜索get_child_atGrid等等。不提。

所以我能想到的唯一可能性就是一个错误。转到http://bugzilla.gnome.org并在Python绑定中报告此方法的缺失。如果你有野心,为什么不向他们建议grid[0, 0]符号?