python GTK3限制标签宽度

python GTK3限制标签宽度,python,gtk,label,width,gtk3,Python,Gtk,Label,Width,Gtk3,我在一个流框中有一组标签,问题是我希望这些标签的宽度最多为96px。我已经设置了label.set_ellipsize(True),但是由于flowbox给了他们想要的空间,所以他们没有被省略,即使我已经将他们的尺寸要求设置为96px宽 我已经尝试了我能找到的每一个功能,这些功能在所有涉及的小部件上似乎都有切点关系,但似乎都不起作用 我找到的唯一解决方法是使用set_min_children_per_line(),但这需要根据流框宽度计算子流的数量,该宽度取决于每行的子流的数量,从而导致流框非

我在一个流框中有一组标签,问题是我希望这些标签的宽度最多为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实现,将其子级限制为精确的像素宽度。根据irc.gimp.net/#gtk+上的Erick Pérez Castellanos的说法,GNOME联系人有一个。这是在Vala中,但在阅读GtkWidget和GtkContainer(和GtkBin)语义的同时,也不难理解。很遗憾,我不知道如何在Python中创建新的gobject,抱歉

如果您在GNOME Contacts中使用了这种方法,那么定制容器(源自GtkBin,这是一种为单子GtkContainers提供的便利)将只保存您的GtkLabel,您可以将其添加到flowbox项的GtkVBox中


希望能有帮助。

你试过了吗?我试过了。它不会改变任何事情,也不是我想要的。我想以像素为单位设置宽度,使其与图标匹配。你能提供一些代码吗?可能还有其他一些属性(默认情况下或您在其他地方设置的属性)。。。玩GtkLabels总是很有趣的x.x不是你问题的实际答案,但是
set\u max\u width\u chars(n\u chars)
如果与
set\u line\u wrap(True)
set\u line\u wrap\u模式(pango.WrapMode.WORD\u CHAR)
或任何你想要的WrapMode一起使用,它都会起作用。一个具有精确像素宽度的解决方案可能还需要启用WrapMode。如果你已经阅读了评论,你会看到我已经尝试过了。a) 它不起作用,而且b)即使它起作用了,它也不能从两个方面满足我的要求。我要的是省略号而不是换行符。路线会贬值。我不想写一个功能被贬低的新程序。它仍然不是像素宽度,所以也不能完全解决我的问题。