使用 python 在 Gtk 中将标签内的文本垂直居中

Vertically center text inside label in Gtk using python

我正在尝试将框内标签的文本垂直居中。这是我正在尝试的代码:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

win = Gtk.Window()
win.set_default_size(200, 100)

box = Gtk.Box()
win.add(box)
lbl = Gtk.Label("FOO")
lbl.set_vexpand(True)
lbl.set_valign(Gtk.Align.CENTER)
# Set the background to make the problem visible
lbl.override_background_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(red=1, green=0, blue=0))
box.add(lbl)

win.show_all()
win.connect('destroy', Gtk.main_quit)
Gtk.main()

如您所见,标签本身在框内完全居中,但标签内的文本稍微向标签的顶端移动:

我找不到任何相关信息。高度赞赏程序化以及基于 CSS 的解决方案。

我认为问题在于您和字体创建者对垂直意义上的 "centered" 的含义有不同的看法。还要考虑一下,如果您有 yg 这样的字符,视觉印象会发生什么变化。如果您将国际字符添加到组合中,如 ÅÖ.

,这将变得更加混乱

无论如何,此答案使用 CSS 创建可配置的偏移量 (padding-top),并且还可以让您自由更改字体。 20 像素的值显然太多了,但会提供清晰可见的证据表明它有效。

style.css:

#custom_label {
    padding-top: 20px;
    background-color: red;
    font: Vera 20px;
}

test.py:

import gi

gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

win = Gtk.Window()
win.set_default_size(200, 100)

box = Gtk.Box()
win.add(box)
lbl = Gtk.Label(u'FOO')
lbl.set_name('custom_label')
box.add(lbl)

style_provider = Gtk.CssProvider()
Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
with open("style.css") as f:
    style_provider.load_from_data(f.read())

win.show_all()
win.connect('destroy', Gtk.main_quit)
Gtk.main()

作为奖励,如果您以以下方式开始您的计划:

GTK_DEBUG=interactive python test.py

(假设 Linux,不确定如何在 Windows 中执行此操作),您将有一种交互方式来更改 CSS 和其他小部件属性。