python GTK3 限制标签宽度

python GTK3 limit label width

我在 flowbox 中有一组标签,问题是我希望这些标签的宽度最多为 96px。我已经设置了 label.set_ellipsize(True),但是由于 flowbox 给了他们尽可能多的空间,所以他们不会被椭圆化,即使我已经将他们的大小请求设置为 96px 宽。

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

我找到的唯一解决方法是使用 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()

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

这是它的样子:

希望这次没有错过任何东西

您还有另一种选择:使用自定义 GtkContainer 实现,将其子项限制为精确的像素宽度。根据 Erick Pérez Castellanos 在 irc.gimp.net/#gtk+ 上的说法,GNOME 联系人有一个; here it is。它在 Vala 中,但在阅读 GtkWidget 和 GtkContainer(和 GtkBin)语义的同时,不应该 难以理解。很遗憾,我不知道如何在 Python 中创建新的 GObject,抱歉。

如果您确实在 GNOME 联系人中使用该方法,自定义容器(派生自 GtkBin,为单子 GtkContainers 提供便利)将仅包含您的 GtkLabel,并将其添加到流框项目的 GtkVBox。

希望对您有所帮助。