在滚动窗口内放置绘图区域时防止出现滚动条
我正在做一个项目,使用的是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。
我该怎么做才能确保窗口足够大,能显示这张图片呢?
1 个回答
5
我搞定了!:)
如果你把一个绘图区域放在一个滚动窗口里,事情就不会按预期工作。正确的做法是把绘图区域放在一个视口里,然后把这个视口放进滚动窗口。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)上都很好用。