gtk: 标签如何换行而不是水平扩展

0 投票
3 回答
4350 浏览
提问于 2025-04-16 02:59

我有一个 VBox,它的样子是这样的:

ImportantWidget
  HSeparator
    Label

我希望这个窗口的宽度只要和 ImportantWidget 一样宽就可以,不要更宽。不过,Label 有时候可能会变得很长。我想要这样的逻辑:如果 Label 的文本可以在不让 VBox 水平扩展的情况下全部显示出来(在它已经足够大以适应 ImportantWidget 的情况下),那么这些文本应该都在一行上。但如果文本太长,导致需要水平扩展,那么它就应该把文本分成多行显示。

有没有比 Label 更适合这个任务的组件?如果没有,我应该用什么呢?

3 个回答

1

编辑:

这是一个动态标签的例子,它可以根据窗口和文本的大小自动调整为多行显示:

import gtk

class DynamicLabel(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)

        self.set_title("Dynamic Label")
        self.set_size_request(1, 1)
        self.set_default_size(300,300) 
        self.set_position(gtk.WIN_POS_CENTER)

        l = gtk.Label("Painfully long text " * 30)
        l.set_line_wrap(True)
        l.connect("size-allocate", self.size_request)
        ImportantWidget  = gtk.Label("ImportantWidget")

        vbox = gtk.VBox(False, 2)
        HSeparator = gtk.HSeparator()
        vbox.pack_start(ImportantWidget, False, False, 0)
        vbox.pack_start(HSeparator, False, False, 0)
        vbox.pack_start(l, False, False, 0)


        self.add(vbox)
        self.connect("destroy", gtk.main_quit)
        self.show_all()

    def size_request(self, l, s ):
        l.set_size_request(s.width -1, -1)

DynamicLabel()
gtk.main()
1

哦,没错,这个链接展示了怎么做:

l = gtk.Label("Painfully long text" * 30)
l.set_line_wrap(True)
1

看起来你想要一个可以动态调整大小的标签,但GTK默认并不支持这个功能。其实在Meld的代码库里,有一个VMWare的WrapLabel小部件的Python版本,你可以去看看。具体可以在这个链接找到:Meld代码库。(这个信息来自于这个问题。)

撰写回答