LINUX.ORG.RU

[PyGTK] Как заставить gtk.Image показывать большие картинки без скроллбаров

 


0

0

Решил тут написать себе просмотровщик картинок с барышнями и квейком.

В начале было все просто, засунул gtk.Image в gtk.ScrolledWindow с помощью метода add_with_viewport(). Все работало, но меня не устраивало очевидное появление скроллбаров на больших картинках. Ну думаю не проблема, установлю политику для скроллбаров ScrolledWindow'а в gtk.POLICY_NEVER и тут то меня поджидало самое большое разочарование — окно стало принимать размеры просматриваемого изображения, в ряде случаев выезжая за границы экрана.

Соответсвенно вопрос к знатокам GTK+ как можно просматривать большие картинки со скроллингом но без скроллбаров? В частности это как то реализовано в GQview и гимпе, но копаться в тоннах С-шного кода этих программ пока выше моих способностей.

З.Ы. Про gtk.ImageView знаю, но хочу обойтись без лишних сущностей.

★★★★★

политика не нужна

gtk_scrolled_window_get_hscrollbar(), gtk_scrolled_window_get_vscrollbar()

получаешь эти виджеты, и делаешь им gtk_widget_hide()

ananas ★★★★★
()
Ответ на: комментарий от ananas

Не работает. Если интересно вот код

import sys
import os
import gtk
import gobject


class SimpleImageViewer:
    def __init__(self):
        self.main_window = gtk.Window()
        self.main_window.set_title("Simple Image Viewer")
        self.main_window.set_default_size(640, 480)
        vbox = gtk.VBox()
        self.main_window.add(vbox)
        vbox.show()
        
        imagesw = gtk.ScrolledWindow()
        #imagesw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
        #imagesw.set_shadow_type(gtk.SHADOW_IN)
        hscroll = imagesw.get_hscrollbar()
        vscroll = imagesw.get_vscrollbar()
        imagesw.set_border_width(1)
        self.image = gtk.Image()
        imagesw.add_with_viewport(self.image)
        
        self.statusbar = gtk.Statusbar()
        
        vbox.pack_start(imagesw)
        vbox.pack_end(self.statusbar, False)
        imagesw.show()
        self.image.show()
        self.statusbar.show()
        
        self.main_window.connect("delete_event", self.on_main_window_delete_event)
        
        if len(sys.argv) > 1:
            self.image.set_from_file(sys.argv[1])
        
        self.main_window.show()
        # Hide scrollbars in scrolled window
        print hscroll, vscroll
        hscroll.hide()
        vscroll.hide()
        print hscroll.get_property("visible"), vscroll.get_property("visible")
    
    def on_main_window_delete_event(self, widget, data=None):
        gtk.main_quit()
    
    def main(self):
        gtk.main()

if __name__ == '__main__':
    siv = SimpleImageViewer()
    siv.main()

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

понятно. можно использовать gtk.Layout, вместо ScrolledWindow, вешать свои обработчики на события мыши и из них дергать gtk.Layout.move()

ananas ★★★★★
()
Ответ на: комментарий от ananas

тоже не то. похоже, самый оптимальный метод будет загружать файл в gdk.Pixbuf, а при скроллинге выдергивать нужный кусок при помощи gdk.Pixbuf.subpixbuf() и вызывать gtk.Image.set_from_pixbuf() с нужным сабом

ananas ★★★★★
()
Ответ на: комментарий от ananas

Мдаа…

Судя по всему проще не париться и воспользоваться ScrolledWindow.

fat_angel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.