Как я могу сделать так, чтобы значки в IconView распределялись равномерно?

#python #resize #gtk #window #pygtk

#python #изменение размера #gtk #окно #pygtk

Вопрос:

У меня есть gtk.IconView с несколькими значками в нем. Иногда я изменяю размер окна, чтобы увидеть больше значков. Когда я делаю это, генерируемое дополнительное пространство распределяется неравномерно между всеми столбцами. Вместо этого все это помещается справа, пока не останется достаточно места для нового столбца.

Я не вижу в документации ничего, что позволило бы мне сделать это автоматически. Нужно ли мне проверять сигналы изменения размера, а затем вручную устанавливать интервалы между столбцами и строками? Если да, то какой сигнал изменения размера я использую.

Вот картинка того, что я имею в виду. Я выделил дополнительное пространство красным цветом.

введите описание изображения здесь

Это то, что я хотел бы видеть (конечно, с фактически равномерно распределенными пробелами, в отличие от моей плохой работы с MS Paint).

введите описание изображения здесь

Комментарии:

1. Вы, случайно, не нашли какое-нибудь решение?

2. @rafalcieslak Нет, это был низкий приоритет. Возможно, это даже невозможно, поскольку установка интервала между строками вручную может на самом деле не решить проблему. Извините, я вообще не изучал это.

Ответ №1:

Мы столкнулись с этой проблемой в Ubuntu Achievements Viewer, и поскольку нам удалось ее решить, я представлю наше решение.

Хитрость заключается в том, чтобы поместить GtkIconView в GtkScrolledWindow и установить для его hscrollbar_policy значение «всегда». Затем необходимо использовать сигнал проверки изменения размера, чтобы реагировать, когда пользователь изменяет размер окна (обратите внимание, что его необходимо проверить, изменился ли размер, поскольку сигнал выдается также, когда, например, окно перетаскивается). При изменении размера модель, используемая GtkIconView, должна быть очищена и воссоздана заново, так как это запускает GtkIconView, который правильно перераспределяет вновь полученное пространство (или сжимается). Кроме того, в результате горизонтальная полоса прокрутки никогда не будет видна, поскольку GtkIconView использует ровно столько места, сколько использует GtkScrolledWindow .

Ответ №2:

Да, после очень жирного взгляда кажется, что вам нужно будет сделать это самостоятельно. И что касается сигнала, я бы проверил наличие GtkContainer::check-resize.

Ответ №3:

Используйте событие size_allocate .

Я определил свой класс :

 class toto(Gtk.IconView):
    def __init__(self):
        super(toto,self).__init__()
        self.connect("size_allocate",self.resize)
        self.set_columns(4)
 

Затем я изменяю количество рабочих столбцов

 def resize(self,_iv,_rect):
    print("X",rect.x)
    print("Y",rect.y)
    print("W",rect.width)
    print("H",rect.height)
    # calculate number of columns, let's say 3
    _cols=3
    self.set_columns(_cols)
 

Кажется, это работает для меня