在滚动窗口内放置绘图区域时防止出现滚动条

1 投票
1 回答
1130 浏览
提问于 2025-04-16 19:17

我正在做一个项目,使用的是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)上都很好用。

撰写回答