我正在使用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。
我该怎么做才能确保窗口足够大以容纳图像?
我想明白了:)。
如果你把DrawingArea放在ScrolledWindow中,事情就不会正常工作。相反,您必须将DrawingArea放在Viewport中,将Viewport放在ScrolledWindow中。gtk。ScrolledWindow提供了一个方法gtk。ScrolledWindow.add_with_viewport,为了方便起见,它会自动执行此操作。问题是,默认情况下,该方法生成的视口有一个边界,并且该边界的宽度因系统而异。此外,(据我所知)无法访问生成的Viewport(edit:您可以使用scrolled.get_child())来去除边框。解决方案很简单:您必须手动创建Viewport。
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(GNOME3)、WindowsXP、Windows7和Ubuntu(Unity)上运行得很有魅力。