我需要找出我正在使用的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()
答案 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_at
,Grid
等等。不提。
所以我能想到的唯一可能性就是一个错误。转到http://bugzilla.gnome.org并在Python绑定中报告此方法的缺失。如果你有野心,为什么不向他们建议grid[0, 0]
符号?