Запретить отображение полос прокрутки при размещении области рисования внутри прокручиваемого окна

#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() .