python GTK3限制标签宽度

2024-09-28 23:38:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个流程框里有一组标签,问题是我希望这些标签最多有96px宽。我已经准备好了label.set_ellipsize(没错),但由于流箱给了他们想要的最大空间,所以他们没有被省略号,即使我已经将他们的大小请求设置为96px宽。在

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

Tags: fromimageselfaddgtkinitmain标签
2条回答

您还有另一个选择:使用自定义GtkContainer实现,该实现将其子级限制为精确的像素宽度。根据埃里克·佩雷斯·卡斯特拉诺斯irc.gimp.net/#gtk+,GNOME Contacts有一个;here it is。它在Vala中,但不应该太难理解GtkWidget和GtkContainer(和GtkBin)语义。很遗憾,我不知道如何在Python中创建新的gobject,对不起。在

如果在gnomecontacts中使用这种方法,那么定制容器(它派生自GtkBin,这对于单个子GtkContainers来说是一种方便)将只保存GtkLabel,并将其添加到flowbox项的GtkVBox中。在

希望有帮助。在

所以这里有一个解决方案(仍然不是精确的像素宽度)你可以使用Gtk.Widget.set-u-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

我希望这次我没有错过什么。在

相关问题 更多 >