Вертикально центрировать текст внутри метки в Gtk, используя python - PullRequest
1 голос
/ 30 мая 2019

Я пытаюсь отцентрировать текст метки по вертикали внутри поля. Это код, который я пытаюсь сделать:

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

Как вы можете видеть, сама этикетка отлично отцентрирована внутри рамки, но текст внутри этикетки немного смещен к верхнему концу этикетки:

Picture showing the problem

Я не могу ничего найти по этому поводу. Высоко ценятся как программные, так и CSS-решения.

1 Ответ

1 голос
/ 03 июня 2019

Я считаю, что проблема в том, что вы и создатель шрифта по-разному понимаете, что означает «центрирование» в вертикальном смысле.Также подумайте, что произойдет с визуальным впечатлением, если у вас есть такие символы, как y и g .Это будет еще более запутанным, если вы добавите в микс международные символы, такие как Å или ... 1008 *.

В любом случае, этот ответ использует CSS для создания настраиваемого смещения (заполнение-топ), а также даст вам свободу менять шрифт.Значение 20 px, очевидно, является слишком большим, но даст четкое видимое доказательство того, что оно работает.

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 и другие свойства виджета.

...