#python #pygtk #scrolledwindow
#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()
Но это не совсем работает. Результирующее окно немного слишком мало, и, следовательно, отображаются полосы прокрутки.
Чтобы это сработало, я должен заменить вторую строку на эту:
window.resize(image.size[0] 2, image.size[1] 2)
Но это некрасиво, и это работает не во всех системах. В моем окне Windows я должен использовать 3.
Что я могу сделать, чтобы убедиться, что окно достаточно большое для изображения?
Комментарии:
1. возможно, вам следует
scrolled.set_size_request(image.size[0], image.size[1])
и затемwindow.resize(1, 1)
получить минимально необходимый размер.2. @ilius Это не работает :/. Это просто оставляет окно минимально возможного размера.
Ответ №1:
Я понял это :).
Если вы поместите область рисования внутри ScrolledWindow, все просто не будет работать так, как должно. Вместо этого вы должны поместить область рисования во видовой экран, а видовой экран в 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) это сработало как по волшебству.
Комментарии:
1. Вы можете получить доступ к области просмотра с помощью
scrolled.get_child()
.