Полностью отключить полосы прокрутки на веб-сайте GTK webkit?

Мне нужно простое веб-представление, основанное на веб-наборе, с фиксированным размером (например, 200x200) и без каких-либо полос прокрутки. Я использую X без оконного менеджера.

Я попробовал следующий код Python:

import gtk 
import webkit 

view = webkit.WebView() 

sw = gtk.ScrolledWindow()
sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
sw.add(view)

win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.add(sw) 
win.set_default_size(200, 200) 
win.show_all()

view.open("http://www.blackle.com") 

gtk.main()

Полосы прокрутки все еще показывают, хотя они не должны.

Я также попытался пойти по другому пути и полностью удалить полосы прокрутки на GTK, используя ~/.gtkrc-2.0:

style "custom-scrollbar-style"
{
  GtkScrollbar::slider_width = 0
  GtkScrollbar::min-slider-length = 0
  GtkScrollbar::activate_slider = 0
  GtkScrollbar::trough_border = 0
  GtkScrollbar::has-forward-stepper = 0
  GtkScrollbar::has-backward-stepper = 0
  GtkScrollbar::stepper_size = 0
  GtkScrollbar::stepper_spacing = 0
  GtkScrollbar::trough-side-details = 0
  GtkScrollbar::default_border = { 0, 0, 0, 0 }
  GtkScrollbar::default_outside_border = { 0, 0, 0, 0 }
}
widget_class "*Scrollbar" style "custom-scrollbar-style"

Даже при этом на обеих сторонах окна, где находятся полосы прокрутки, отображаются тонкие белые линии.

Есть идеи?

3 ответа

Решение

Я пытался поиграться с обработчиком сигнала, но это не сработало.

Просматривая документацию GTK, я увидел 2 свойства стиля ScrolledWindow, которые я не включил в предыдущий стиль (scrollbar-spacing а также scrollbar-within-bevel). Итак, окончательный код (без написания ~/.gtkrc-2.0) сейчас:

import gtk
import webkit

gtk.rc_parse_string("""style "hide-scrollbar-style"
{
  GtkScrollbar::slider_width = 0
  GtkScrollbar::min-slider-length = 0
  GtkScrollbar::activate_slider = 0
  GtkScrollbar::trough_border = 0
  GtkScrollbar::has-forward-stepper = 0
  GtkScrollbar::has-backward-stepper = 0
  GtkScrollbar::stepper_size = 0
  GtkScrollbar::stepper_spacing = 0
  GtkScrollbar::trough-side-details = 0
  GtkScrollbar::default_border = { 0, 0, 0, 0 }
  GtkScrollbar::default_outside_border = { 0, 0, 0, 0 }
  GtkScrolledWindow::scrollbar-spacing = 0
  GtkScrolledWindow::scrollbar-within-bevel = False
}
widget_class "*Scrollbar" style "hide-scrollbar-style"
widget_class "*ScrolledWindow" style "hide-scrollbar-style"
""")

view = webkit.WebView()
sw = gtk.ScrolledWindow()
sw.add(view)
sw.set_policy(gtk.POLICY_ALWAYS, gtk.POLICY_ALWAYS)

win = gtk.Window(gtk.WINDOW_TOPLEVEL)
win.add(sw)
win.set_default_size(200, 200)
win.show_all()

view.open("http://www.blackle.com/")

gtk.main()

Хотя это и не элегантно, это работает для меня, так как меня не интересуют полосы прокрутки на протяжении сеанса X.

Следующее работает для меня

class PREview(object):
    def __init__(self, project_directory):
        # Make the HTML viewable area
        self.wv = webkit.WebView()
        self.wf = self.wv.get_main_frame()
        self.wf.connect("scrollbars-policy-changed", self.on_webkit_webframe_scrollbars_policy_changed)

def on_webkit_webframe_scrollbars_policy_changed(self, widget):
    return True # to stop propagation

а потом в основной программе...

self.out_scroll = gtk.ScrolledWindow()
self.out_scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
self.PV = PREview(self)
self.out_scroll.add(self.PV.wv)

Хорошо, вот в чем дело. Вам не нужна полоса прокрутки, но вы создаете Gtk.ScrolledWindow в качестве контейнера WebKit.WebView. Если вам не нужна полоса прокрутки, просто поместите внутрь контейнера, который не реализует Gtk.Scrollable, скажем Gtk.Grid. Это не будет показывать полосу прокрутки вообще. Несколько минусов:

  1. Ваше главное окно не будет уменьшать размер за пределы минимальной ширины и высоты содержимого.
  2. если размер содержимого вашего представления изменится, и он изменится (если вы не ограничите каждую последнюю деталь того, как будет отображаться ваше представление), окно также будет соответствовать текущему размеру
  3. в виджете WebKit.WebView нет такого понятия, как Gtk.Widget.set_size_request, оно все равно будет следовать за его содержимым. Кстати, Gtk.Widget.set_default_size () не создает фиксированный размер для виджета, а только устанавливает его при первом показе.
Другие вопросы по тегам