да спасибо я по ссылке ходил и это мне очень сильно помогло так как мне теперь достаточно вычислить размер всего одного единственного элемента - vbox
в gtk Layout изначально не имеет скроллбара но я нашел способ его туда прикрутить и перенаправлять scroll_event на скроллбар , только заквоздка в том что если не задать размер gtk.Layout явно , при помощи set_size() то скроллинг отваливаеться
import gtk
# вывожу изменения размера
def ff(w , a):
print 'width : ' , a.width , ' height : ' , a.height
# проброс событий из эвентбокса к скроллбару
def scr(w , e):
scroll.do_scroll_event(scroll , e)
win = gtk.Window()
win.set_size_request(500 , 500)
win.show()
win.connect("delete_event" , gtk.main_quit)
txt = gtk.TextView()
txt.set_size_request(400 , -1)
txt.set_wrap_mode(gtk.WRAP_WORD)
txt.show()
button1 = gtk.Button("button1")
button1.show()
button2 = gtk.Button("button2")
button2.show()
box = gtk.VBox(False, 0)
box.show()
box.pack_start(txt)
box.pack_start(button1)
box.pack_start(button2)
box.connect("size-request" , ff)
lay = gtk.Layout()
lay.set_size(400 , 1000) # высота лайоута больше чем высота окна но самое основное что она задана явно !
lay.show()
lay.put(box, 50, 50)
# запиливаю контейнер который служит для проброса событий
evbox = gtk.EventBox()
evbox.show()
evbox.set_events(gtk.gdk.SCROLL_MASK)
evbox.connect("scroll_event" , scr)
evbox.add(lay)
# создание скроллбара привязанного к текстовому виджету
scroll = gtk.VScrollbar(lay.get_vadjustment())
scroll.show()
# не скроллящийся элемент для выдачи какой-либо инфы юзверю
info = gtk.Label('trololo')
info.show()
info.set_size_request(200 , 20)
# при помощи этой таблицы втыкаю все добро в окно
table = gtk.Table(2, 2, False)
table.attach(evbox, 0, 1, 0, 1, gtk.FILL | gtk.EXPAND, gtk.FILL | gtk.EXPAND)
table.attach(scroll, 1, 2, 0, 1, gtk.FILL | gtk.SHRINK, gtk.FILL | gtk.SHRINK)
table.attach(info, 0, 1, 1, 2, gtk.FILL | gtk.SHRINK, gtk.FILL | gtk.SHRINK)
table.set_size_request(500 , 500)
table.show()
win.add(table)
buf = txt.get_buffer()
long_text = "rbir rb rtb rtb rtb tr b rt hgrthg rthg \n\n\n\n\n\n\n\n brtrtigirbtntr \
ibrtnritnitrb rtbrthb rthg tr4hgrt\n\n\n\n ergierbgiueb te \n eigbreigeigun \n\n\n\n\n \
tebnpblorb tronhgitrnoihgntr gtriohnjjoirt btroihjgoitrh ntrhjitr"
buf.set_text(long_text)
gtk.main()
вот образец того что я сделал , так если заменить
на
то скроллинг отваливаеться , да и виджеты не показываються
ps: -1 -1 служат для того что-бы компоновщик автоматически определил величину
вывод прост - vbox упрощает задачу тем что теперь надо определить конечный размер только одного виджета а не так как планировалось ранее (все TextView) но проблема остаеться в том что я не знаю какое по счету событие “size-request” являеться последним , ибо только на последнем этом событии vbox приобретает конечный размер о чем четко сообщает функция ff() , вот ее вывод :
width : 400 height : 260
width : 400 height : 260
width : 400 height : 335
задача после получения конечного значения height запилить
lay.set_size(400 , height)
и вот над реализацией этой задачи я и ковыряюсь но пока ничего здравого в голову не приходит , надеюсь придет кому-то из юзеров форума , всем спс