Ширина метки метки 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.
Надеюсь, это поможет.