2015-02-16 4 views
11

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

problem example

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

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

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

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

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.Label.set_max_width_chars (n_chars)'] (https://lazka.github.io/pgi-docs/Gtk-3.0/classes/Label.html#Gtk.Label.set_max_width_chars)? – elya5

+0

Я пробовал это. это ничего не меняет, и это не то, что я хочу в любом случае. Я хочу установить ширину в пикселях, чтобы она соответствовала значкам. – doxin

+1

Можете ли вы предоставить код? Возможно, есть еще кое-что свойство, мешающее (по умолчанию или заданное вами в другом месте) ... игра с GtkLabels всегда забавная xx – andlabs

ответ

5

Так вот это решение (еще не точная ширина пикселя) Вы можете использовать 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

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

+0

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

+1

обновлено до Gtk.Widget.set_halign – elya5

3

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

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

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

Смежные вопросы