Ger*_*set 1 python pygtk scrolledwindow
我正在使用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()
Run Code Online (Sandbox Code Playgroud)
但它不太有效.生成的窗口有点太小,因此滚动条显示出来.
为了工作,我必须将第二行改为:
window.resize(image.size[0] + 2, image.size[1] + 2)
Run Code Online (Sandbox Code Playgroud)
但这很丑陋,并不适用于所有系统.在我的Windows框中,我必须使用+ 3.
我该怎么做才能确保窗口足够大以容纳图像?
我想到了 :).
如果你把一个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()
Run Code Online (Sandbox Code Playgroud)
它就像Arch(GNOME 3),Windows XP,Windows 7和Ubuntu(Unity)上的魅力一样.