Я пытаюсь вертикально центрировать текст метки внутри поля. Это код, который я пытаюсь:
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 высоко ценятся.
К сожалению, это ничего не меняет.
Пожалуйста, создайте минимальную исполняемую программу, чтобы вам было легче помочь. Если вы говорите о совершенстве пикселей, то боюсь, что ваш результат будет зависеть от шрифта.
Спасибо @bohrax, я завершил пример кода. Вполне может быть, что я говорю о совершенстве пикселей. Было бы плохой практикой вручную устанавливать шрифт меток GTK?
CSS имеет много преимуществ, но вам потребуется заранее пометить визуальные элементы, если вы хотите плавного «тематического» опыта. Для приложения, где важен внешний вид, я определенно рекомендую его. Обратите внимание, что будут некоторые пробы и ошибки, поскольку поддержка CSS не полностью стабилизировалась (последний раз, когда я проверял), а некоторое поведение не полностью задокументировано или просто содержит ошибки. Я написал ответ, который, надеюсь, поможет вам в пути.
Я считаю, что проблема в том, что у вас и у создателя шрифта разные мнения о том, что означает «по центру» в вертикальном смысле. Также подумайте, что произойдет с визуальным впечатлением, если у вас есть символы типа у и грамм. Это станет еще более запутанным, если вы добавите в смесь международные символы, такие как Å или О.
В любом случае, этот ответ использует 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 и другие свойства виджета.
Большое спасибо за обходной путь! Можете ли вы также сказать мне, как это будет вести себя на разных разрешениях или настройках DPI?
@robfuscator Я не уверен, рассматривает ли Gtk px
как физический пиксель или может использовать несколько физических пикселей на экране с высоким разрешением. Пока размер шрифта указан в тех же единицах, я думаю, он все равно будет работать, но я действительно не уверен.
Хорошо, это имело бы смысл. Я постараюсь получить в руки какой-нибудь большой экран, чтобы протестировать его, а затем обновить ветку. Спасибо еще раз.
Установите valign и vexpand коробки.