LINUX.ORG.RU

ScrolledWindow в gtk.Layout()

 ,


0

2

Добрых суток.

Разбираюсь с pygtk и столкнулся с такой проблемой. Если ScrolledWindow размещён в VBox, а VBox в окне, то всё нормально работает и список с прокруткой отображается. Однако если вместо VBox использовать Layout и его помещать в окно, то отображается пустое окно.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gtk, gobject

COLUMN_STRING = 1

data = [
    [ 'first row' ],
    [ 'second row' ],
    ]

select = []

def list_selections(self, param, d=None):
    i = list(param)[0]
    select.append(data[i])

def selection_cb(selection):
    global select
    select = []
    selection.selected_foreach(list_selections)
    for e in select:
      print e

def main():
    win = gtk.Window()
    win.set_title("Main Window")
    win.connect("destroy", lambda win: gtk.main_quit())

    vbox = gtk.VBox()
    layout = gtk.Layout()
    win.add(vbox)
    #win.add(layout)

    sw = gtk.ScrolledWindow(None, None)
    sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
    vbox.pack_start(sw)
    #layout.put(sw, 0, 0)

    ls = gtk.ListStore(gobject.TYPE_UINT, gobject.TYPE_STRING)
    for item in data:
        iter = ls.append()
        ls.set(iter, COLUMN_STRING, item[0])
    tv = gtk.TreeView(ls)
    sw.add(tv)

    selection = tv.get_selection()
    selection.set_mode(gtk.SELECTION_MULTIPLE)
    selection.connect("changed", selection_cb)

    renderer = gtk.CellRendererText()
    col = gtk.TreeViewColumn('String', renderer, text=COLUMN_STRING)
    tv.append_column(col)
    
    win.set_default_size (200,300)
    win.show_all()
    gtk.main()
    
if __name__ == '__main__':
    main()

Это такая особенность ScrolledWindow или это можно как-то исправить?

Заранее спасибо

★★★★★
Ответ на: комментарий от hippi90

Заменил ScrolledWindow на layout (мне нужна отдельная прокручиваемая область), его поместил в ещё один layout, который привязан к окну. Ничего не отображается.

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

Не разбирал подробно код, но ты хочешь положить ScrolledWindow в Layout?

Да, мне это нужно, что бы можно было менять положение ScrolledWindow, используя vbox задать положение нельзя.

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

Такое вроде бы GtkFixed умеет. Или я неправильно понимаю то, что требуется в результате получить?

Мне нужно в окне создать список, в заданной области, который я могу поместить и задать размер как мне нужно.

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

Такое, вроде бы, стандартными контейнерами не реализовать, нужно писать свой. Буквально недавно решал похожую задачу. Чуть попозже покажу пример.

PS: если я ошибаюсь и такое реализуемо с использованием стандартных контейнеров, прошу поправить.

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

То есть задача стоит следующим образом: необходимо в определенной области размещать ScrolledWindow с требуемым смещением от top-left угла и с заданным размером?

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

Для того, что на картинке, должен замечательно подойти Gtk.Grid.

Как-то так: http://pastebin.com/bicDAT7h

Не догнал сходу, как двум последним кнопкам, если их поместить в грид, запретить растягиваться, поэтому закинул их в Box. В общем, почитай спеки по Grid.

Или нужно поведение или размещение посложнее?

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

Вот такое как на картинке можно сделать из HBox-а и двух VBox-ов.

Если только тебе в силу каких-то кособоких причин не надо размещать элементы совсем как попало, то gtk.Table тоже подойдёт.

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

Просто сегодня мне нужно две четыре кнопки, завтра ещё какой нибудь элемент нужно будет поставить.

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

И что? Добавишь кнопок в VBox или строк/столбцов в таблицу и пихнёшь свои новые кнопки на нужные места.

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

А в gtk нет модуля подобного Grid?

В gtk2 есть похожий GtkTable.

А вообще, выше frob дело говорит, вот вариант на трех Box'ах для gtk2, он будет покорректней: http://pastebin.com/t31qYz0P

Вот тут неплохой сборничек примеров layout management'а

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

Все эти vbox'ы, table имеют симметричный размер (не знаю как конкретнее выразиться) ячеек. Т.е. нельзя сделать каждый ряд своей высоты. Или можно?

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

Именно строку/столбец — можно. Конкретную ячейку — нет. Может получиться так, что то что ты хочешь надо распихать используя для какого-то элемента больше строк/столбцов.

Например для картинки вроде твоей сделать шесть строк и два столбца. В левый столбец пихнуть две кнопки в первую и вторую строки, потом в четыре ячейки пихнуть дерево и оставить пустую строку. Во втором столбце две строки пропустить, а потом напихать кнопок.

Если тебе действительно надо напихать что-то разного размера в произвольные места, то Layout или бацать своё из DrawingArea. Правда представить зачем было бы надо создавать на экране кашу не получается. Ну разве что игрушку какую-то ваять.

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

Емнип, в Grid(и наверняка Table) каждый ряд может иметь свою высоту, в зависимости от размера содержимого его ячеек и способности этого содержимого расширяться при появлении дополнительного пространства. Аналогично и для столбцов.

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

В самом крайнем случае, можно написать собственный контейнер и управлять размещением элементов полностью вручную: http://pastebin.com/XJYRTYyu
Однако так стоит делать только тогда, когда что-то невозможно реализовать, используя стандартные контейнеры.

kravich ★★★★
()

Спасибо, вроде получилось как надо.

cyclon ★★★★★
() автор топика
Последнее исправление: cyclon (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.