在python3 gtk3中将样式从一个窗口小部件复制到另一个窗口小部件

时间:2018-02-05 20:01:46

标签: python-3.x fonts widget gtk3

我有一个 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 (对于返回的字符串)可以做到这一点,但这不是一个正确的想法。

2 个答案:

答案 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)