我有一个 GtkFontButton ,用户可以选择字体。按钮设置为在选择后更改其字体样式(名称,重量和大小),并显示新的字体和大小。我想将这个“字体样式”复制到一个标签。没有复杂的代码可以做到这一点吗?我可以使用widget.get_font_name()
(返回字符串,如“Sans Bold Italic 11”)从GtkFontButton获取新的字体和大小。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class LabelWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Label Example")
hbox = Gtk.Box(spacing=10)
hbox.set_homogeneous(False)
label = Gtk.Label("This is a normal label")
hbox.pack_start(label, True, True, 0)
self.labeltochange = Gtk.Label()
self.labeltochange.set_text("This is a special label left-justified label.\nWith multiple lines.")
hbox.pack_start(self.labeltochange, True, True, 0)
label = Gtk.Label(
"This is another label.\nWith multiple lines.")
hbox.pack_start(label, True, True, 0)
fb = Gtk.FontButton()
fb.connect("font-set",self.test)
hbox.pack_start(fb, True, True, 0)
self.add(hbox)
def test(self, widget):
print(widget.get_font_name())
window = LabelWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
这会在终端上打印所选的字体和大小。我想做像 self.labeltochange.set_style(widget.get_font_name())这样的事情 每次用户通过单击按钮选择新字体时,为了更改 self.labeltochange 的字体和大小以匹配字体和大小。我认为,因为 get_font_name()返回一个字体和大小 set_font_name (对于返回的字符串)可以做到这一点,但这不是一个正确的想法。
答案 0 :(得分:0)
有点谷歌想出了这种使用CSS的方法(这是Gtk3推荐的方式):
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
class LabelWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Label Example", name = 'Window')
self.style_provider = Gtk.CssProvider()
css = """
#Label{
background-color: red;
border-radius: 10px;
outline:none;
font: Sans Bold 12;
}
"""
self.style_provider.load_from_data(bytes(css.encode()))
Gtk.StyleContext.add_provider_for_screen(
Gdk.Screen.get_default(), self.style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)
hbox = Gtk.Box(spacing=10)
hbox.set_homogeneous(False)
label = Gtk.Label("This is a normal label")
hbox.pack_start(label, True, True, 0)
self.labeltochange = Gtk.Label(name = 'Label')
self.labeltochange.set_text("This is a special label left-justified label.\nWith multiple lines.")
hbox.pack_start(self.labeltochange, True, True, 0)
label = Gtk.Label(
"This is another label.\nWith multiple lines.")
hbox.pack_start(label, True, True, 0)
fb = Gtk.FontButton()
fb.connect("font-set",self.test)
hbox.pack_start(fb, True, True, 0)
self.add(hbox)
def test(self, widget):
font = widget.get_font_name()
css = """
#Label{
font: %s;
}
""" % font
self.style_provider.load_from_data(bytes(css.encode()))
window = LabelWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
答案 1 :(得分:0)
愚蠢但几乎正常工作(愚蠢因为在标签的样式提供程序中添加了样式的音调,几乎因为它可能有副作用,例如向子对象添加样式):< / p>
def on_buttonforselectfont_clicked(self, widget, *args):
font = widget.get_font_name()
self.set_object_general_style(self.thelabelforsampleobject, 'font',font)
def set_object_general_style(self, theobject, var, val):
css = '''*{''' + var + ''':''' + val + ''';}'''
style_provider = Gtk.CssProvider()
style_provider.load_from_data(css.encode('utf-8'))
context = theobject.get_style_context()
context.add_provider(style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)