Ширина метки метки Python GTK3

У меня есть набор меток в потоковом поле, проблема в том, что я бы хотел, чтобы эти ярлыки были не более 96 пикселей в ширину. Я установил label.set_ellipsize (True), но так как Flowbox предоставляет им столько места, сколько им нравится, они не получают эллипсис, хотя я задал размер запроса шириной 96 пикселей.

problem example

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

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

Вероятно, мне не хватает чего-то очевидного, но я уже несколько дней бил головой об этой проблеме.

Я сделал этот тестовый файл, который обнаруживает проблему, когда количество столбцов не делится на два:

from gi.repository import Gtk as gtk
from gi.repository import Pango as pango

class Widget(gtk.VBox):
    def __init__(self,label):
        gtk.VBox.__init__(self)

        image=gtk.Image.new_from_icon_name("image-missing",gtk.IconSize.DIALOG)
        image.set_size_request(96,96)
        self.add(image)

        lbl=gtk.Label(label)
        self.add(lbl)


class TestCase(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        lbl=gtk.Label("some text")
        scrollbox=gtk.ScrolledWindow()
        self.add(scrollbox)
        flowbox=gtk.FlowBox()
        scrollbox.add(flowbox)
        for i in range(50):
            w=Widget("longlabel"*5)
            flowbox.add(w)
            w=Widget("short")
            flowbox.add(w)

if __name__=="__main__":
    w=TestCase()
    w.connect("delete-event",gtk.main_quit)
    w.show_all()
    gtk.main()

Ответ 1

Итак, вот решение (еще не точная ширина пикселя). Вы можете использовать Gtk.Widget.set_halign, чтобы не форсировать горизонтальное расширение.

Вот часть кода:

    lbl=gtk.Label(label)
    lbl.set_max_width_chars(5)
    lbl.set_ellipsize(pango.EllipsizeMode.END)
    lbl.set_halign(gtk.Align.CENTER)
    self.add(lbl)

Это выглядит так: screeshot of the window

Надеюсь, на этот раз я ничего не пропустил.

Ответ 2

У вас есть другой вариант: используйте пользовательскую реализацию GtkContainer, которая ограничивает его дочерние элементы точными ширинами пикселей. По словам Эрика Переса Кастелланоса на irc.gimp.net/#gtk+, у GNOME Contacts есть один; здесь. Это в Вала, но не должно быть слишком сложно обернуть голову вокруг некоторого чтения семантики GtkWidget и GtkContainer (и GtkBin). К сожалению, я не знаю, как создавать новые GObjects в Python, извините.

Если вы используете подход в контактах GNOME, пользовательский контейнер (который извлекается из GtkBin, удобство для однопользовательских GtkContainers) будет содержать только ваш GtkLabel, и вы добавите его в элемент потокового кода GtkVBox.

Надеюсь, это поможет.