python GTK3限制标签宽度

时间:2015-02-16 23:12:02

标签: python gtk label width gtk3

我在流水箱中有一组标签,问题是我希望这些标签最多只能96px。我已经设置了label.set_ellipsize(True),但由于流量盒为他们提供了尽可能多的空间,所以即使我已将其大小请求设置为96px宽,也不会进行椭圆化处理。 / p>

problem example

我已经尝试了我能找到的所有功能,这些功能似乎与所涉及的所有小部件相关,但似乎没有任何效果。

我找到的唯一解决方法是使用set_min_children_per_line(),但这需要从流量宽度计算子节点的数量,这取决于每行的子节点数,从而导致流量变得非常快。

我可能遗漏了一些显而易见的事情,但我已经在这几天抨击这个问题了。

我已经制作了这个测试用例,当列数不能被2整除时,会出现问题:

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()

2 个答案:

答案 0 :(得分: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

我希望这次我没有错过。

答案 1 :(得分:3)

您还有另一种选择:使用自定义GtkContainer实现,将其子项限制为精确的像素宽度。根据irc.gimp.net/#gtk+上的ErickPérezCastellanos,GNOME Con​​tacts有一个; here it is。这是在Vala中,但它不应该难以与你的GtkWidget和GtkContainer(以及GtkBin)语义的阅读相提并论。不幸的是,我不知道如何在Python中创建新的GObject,抱歉。

如果你确实在GNOME Con​​tacts中使用这种方法,那么自定义容器(派生自GtkBin,便于单子GtkContainers)只能保存你的GtkLabel,你可以将它添加到流程图项目的GtkVBox。

希望这有帮助。