我正在使用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。
如何确保窗口足够大以容纳图像?
答案 0 :(得分: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)上的魅力一样。