Python GTK3 限制标签宽度。

12

我有一组标签在一个流式盒子中,问题是我希望这些标签最多只占用96像素的宽度。我已经设置了label.set_ellipsize(True),但由于流式盒子会给它们尽可能多的空间,它们不会被省略,即使我已将它们的大小请求设置为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.Label.set_max_width_chars(n_chars)吗? - elya5
我已经尝试过了,但它没有改变任何东西,而且无论如何也不是我想要的。我想以像素为单位设置宽度,以便与图标匹配。 - doxin
1
你能提供一些代码吗?也许有其他属性在干扰(默认或者是你在其他地方设置的)……玩GtkLabels总是很有趣的 x.x - andlabs
虽然并不是针对你的问题的解答,但是如果你将 set_max_width_chars(n_chars)set_line_wrap(True) 结合使用,并设置好 set_line_wrap_mode(pango.WrapMode.WORD_CHAR) 或者任何你想要的 WrapMode,那么它就可以工作了。如果想要实现精确像素宽度的解决方案,可能也需要启用 WrapMode。 - elya5
如果你读了评论,你就会发现我已经尝试过那个方法。a) 它不起作用,b) 即使它起作用,也不能以我想要的方式实现。我想要省略号而不是换行。 - doxin
2个回答

7

所以这里有一个解决方案(虽然不是精确的像素宽度)。您可以使用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)

这是它的外观: 窗口截图 我希望这次没有漏掉什么。

对齐已经过时了。我宁愿不使用过时的功能编写新程序。而且它仍然不是像素宽度,所以也不能完全解决我的问题。 - doxin

3
你还有另一种选择:使用自定义的GtkContainer实现,限制其子元素的像素宽度。根据Erick Pérez Castellanos在irc.gimp.net/#gtk+上的说法,GNOME Contacts有一个这样的实现;在这里。它是用Vala编写的,但是通过阅读GtkWidget和GtkContainer(以及GtkBin)语义,应该不会太难理解。不幸的是,我不知道如何在Python中创建新的GObjects,抱歉。
如果你确实使用了GNOME Contacts中的方法,自定义容器(它派生自GtkBin,这是一个为单个子级GtkContainers提供便利的类)将仅包含你的GtkLabel,然后将其添加到flowbox项的GtkVBox中。
希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接