Полностью отключить полосы прокрутки на веб-сайте 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. Это не будет показывать полосу прокрутки вообще. Несколько минусов:
- Ваше главное окно не будет уменьшать размер за пределы минимальной ширины и высоты содержимого.
- если размер содержимого вашего представления изменится, и он изменится (если вы не ограничите каждую последнюю деталь того, как будет отображаться ваше представление), окно также будет соответствовать текущему размеру
- в виджете WebKit.WebView нет такого понятия, как Gtk.Widget.set_size_request, оно все равно будет следовать за его содержимым. Кстати, Gtk.Widget.set_default_size () не создает фиксированный размер для виджета, а только устанавливает его при первом показе.