Запретить отображение полос прокрутки при размещении области рисования внутри прокручиваемого окна - PullRequest
1 голос
/ 10 июня 2011

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

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

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

...