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

1

Я работаю над проектом с использованием 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.

Что я могу сделать, чтобы окно было достаточно большим для изображения?

  • 0
    возможно, вам следует scrolled.set_size_request(image.size[0], image.size[1]) а затем window.resize(1, 1) чтобы получить минимально необходимый размер.
  • 0
    @ilius Это не работает: /. Это просто оставляет окно в минимально возможном размере.
Теги:
pygtk

1 ответ

5
Лучший ответ

Я понял это:).

Если вы поместите DrawingArea внутри ScrolledWindow, все будет работать не так, как должно. Вместо этого вы должны поместить DrawingArea в Viewport и Viewport в ScrolledWindow. gtk.ScrolledWindow предоставляет метод gtk.ScrolledWindow.add_with_viewport, который делает это автоматически, для удобства. Проблема заключается в том, что окно просмотра, сгенерированное этим методом, имеет границу по умолчанию, и эта граница изменяется по ширине в зависимости от системы. Кроме того, нет способа (который я знаю) получить доступ к сгенерированному Viewport (edit:), чтобы вы могли скролить границу. Решение прост: вам нужно вручную создать Viewport.

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() .
  • 0
    @ptomato: Ты прав. Я должен был подумать об этом: P.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню