1

我正在使用 Python 和 pyGTK 开发一个项目。我有一个窗口,其唯一目的是显示图像。除非图像太大而无法适应屏幕,否则默认情况下窗口不应显示滚动条。
所以我做的是这样的:

window = gtk.Window()
window.resize(image.size[0], image.size[1])

scrolled = gtk.ScrolledWindow()
scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scrolled.set_shadow_type(gtk.SHADOW_NONE)

area = gtk.DrawingArea()
area.set_size_request(image.size[0], image.size[1])

window.add(scrolled)
scrolled.add_with_viewport(area)
area.show()
scrolled.show()
window.show()

但这并不完全奏效。结果窗口有点太小,因此会出现滚动条。
为了使它起作用,我必须将第二行改为:

window.resize(image.size[0] + 2, image.size[1] + 2)

但这很丑陋,并且不适用于所有系统。在我的 Windows 框中,我必须使用 + 3。

我该怎么做才能确保窗口足够大以容纳图像?

4

1 回答 1

5

我想到了 :)。

如果将 DrawingArea 放在 ScrolledWindow 中,事情就不会按应有的方式工作。相反,您必须将 DrawingArea 放在 Viewport 中,并将 Viewport 放在 ScrolledWindow 中。为了方便起见,gtk.ScrolledWindow 提供了一个方法 gtk.ScrolledWindow.add_with_viewport,它会自动执行此操作。问题是该方法生成的视口默认具有边框,并且该边框的宽度因系统而异。此外,没有办法(据我所知)访问生成的视口(编辑:您可以使用 scrolled.get_child())来摆脱边框。解决方案很简单:您必须手动创建视口。

window = gtk.Window()
window.resize(image.size[0], image.size[1])

scrolled = gtk.ScrolledWindow()
scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scrolled.set_shadow_type(gtk.SHADOW_NONE)

viewport = gtk.Viewport()
viewport.set_shadow_type(gtk.SHADOW_NONE)  // Get rid of the border.

area = gtk.DrawingArea()
area.set_size_request(image.size[0], image.size[1])

window.add(scrolled)
scrolled.add(viewport)
viewport.add(area)
viewport.show()
area.show()
scrolled.show()
window.show()

它在 Arch (GNOME 3)、Windows XP、Windows 7 和 Ubuntu (Unity) 上就像一个魅力。

于 2011-06-13T00:31:16.787 回答