GTK3 在按钮标签中换行
Posted
技术标签:
【中文标题】GTK3 在按钮标签中换行【英文标题】:GTK3 wrap text in button label 【发布时间】:2021-11-19 12:12:29 【问题描述】:作为this question 的后续/简化,我正在尝试使 GTK3 按钮对象内的文本自动环绕。
所以;
btn = gtk_button_new();
gtk_button_set_label (GTK_BUTTON(btn), "A very long label that should wrap");
不换行 - 按钮只是伸展到适合(此处是不需要的行为)。
但是:
label = gtk_button_get_label(GTK_BUTTON(dbp->btn));
if (GTK_IS_LABEL (label))
g_message("Is label");
gtk_label_set_ellipsize(GTK_LABEL(label),PANGO_ELLIPSIZE_END);
gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
gtk_label_set_max_width_chars(GTK_LABEL(label), 14);
这会在第一行引发编译错误,鉴于 gtk_button_get_label 返回的是 gchar 字符串而不是实际的标签小部件,您可能会期望出现这种错误。
warning: assignment to ‘GtkWidget *’ aka ‘struct _GtkWidget *’ from incompatible pointer type ‘const gchar *’ aka ‘const char *’ [-Wincompatible-pointer-types]
label = gtk_button_get_label(GTK_BUTTON(btn));
所以,看起来我们可以很好地将标签小部件包裹在其他任何地方,但不能包裹按钮标签。任何人都可以填补这块缺失的部分吗?
【问题讨论】:
GtkButton
是一个容器小部件。您是否尝试过使用gtk_bin_get_child
来获取它的标签小部件?
使用嵌套容器可能会更加复杂。最好递归子小部件并使用 GTK_TYPE_IS_LABEL 宏访问 GtkLabel
【参考方案1】:
是python,不过翻译成C也不难。
正如我前面提到的,GtkLabel
是一个GtkBin
,它创建了一些子小部件:容器、图像、标签。你必须递归它的孩子并找到一个标签,然后你才能设置它的 ellipsize 参数。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GdkPixbuf
from gi.repository import GObject as g
from gi.repository import Pango
def find_label(widget):
# check if we've found a label
# there are convinient macros in C:
# is_label = GTK_IS_LABEL(widget) in this case
if g.type_is_a(widget, Gtk.Label):
return widget
# if a container (or it's subclass)
if g.type_is_a(widget, Gtk.Container):
children = widget.get_children()
for i in children:
r = find_label(i)
if r is not None:
return r
def set_text_and_ellipsize(button, text):
button.set_label(text)
b = find_label(button)
# In case we fail...
if b is None:
return
# setting ellipsize
b.set_ellipsize(Pango.EllipsizeMode.END)
# called on entry's text changed event
def text_changed(*args):
text = entry.get_text()
print(text)
# initiates recreation of child GtkLabel widget
set_text_and_ellipsize(button1, text)
set_text_and_ellipsize(button2, text)
set_text_and_ellipsize(button3, text)
win = Gtk.Window.new(Gtk.WindowType.TOPLEVEL)
grid = Gtk.Grid.new()
button1 = Gtk.Button.new()
button2 = Gtk.Button.new()
button3 = Gtk.Button.new()
entry = Gtk.Entry.new()
win.add(grid)
grid.add(button1)
grid.add(button2)
grid.add(button3)
grid.add(entry)
entry.connect("changed", text_changed)
win.show_all()
Gtk.main()
【讨论】:
感谢您的建议 - 时间压力让我受益匪浅,我在信息亭模式下的 html / 浏览器中重新实现了令人遗憾的事情,我至少可以更好地控制外观,所以我不能(现在)说这是否可行。不幸的是,目标是一个工作演示,没有人关心幕后是什么(还)。以上是关于GTK3 在按钮标签中换行的主要内容,如果未能解决你的问题,请参考以下文章