【问题标题】:Gtk.CssProvider in GenieGenie 中的 Gtk.CssProvider
【发布时间】:2017-02-02 23:50:07
【问题描述】:

我在 Genie 中使用 Gtk.CssProvider 为按钮和窗口添加样式。

我不知道如何指定样式表属性仅适用于按钮,而另一个属性仅适用于窗口。我想它看起来像这样:

var css = "" "
Gtk.Button {background: # FFFF00; }
Gtk.ApplicationWindow {background: green; }
"" "

我尝试了几个类似的东西,但没有一个对我有用。也许用 set_name?

目前我只找到了这个解决方案(错误的代码,但它有效):

// compila con valac --pkg gtk+-3.0 nombre_archivo.gs
uses Gtk

init
    new MyApplication( "test.application",
        ApplicationFlags.FLAGS_NONE
        ).run( args )

class MyApplication:Gtk.Application

    construct( application_id:string, flags:ApplicationFlags )
        if !id_is_valid( application_id )
            error( "application id %s is not valid", application_id )
        this.application_id = application_id
        this.flags = flags

    def override activate ()

        var window = new Gtk.ApplicationWindow( this )      
        window.window_position = WindowPosition.CENTER
        window.set_border_width(10)

        var grid = new Gtk.Grid()       

        var boton1 = new Gtk.Button ()      
        boton1.label = "Boton 1"
        boton1.margin = 10

        var boton2 = new Gtk.Button ()      
        boton2.label = "Boton 2"
        boton2.margin = 10      

        var css_b = "* { background: #FFFF00; }"
        var css_w = "* { background: green; }"

        var provider_b = new Gtk.CssProvider()
        var provider_w = new Gtk.CssProvider()

        try
            provider_b.load_from_data(css_b, css_b.length)
            provider_w.load_from_data(css_w, css_w.length)
        except e: GLib.Error
            stderr.printf ("Hoja de estilo no cargada: %s\n", e.message)        

        boton1.get_style_context().add_provider (provider_b, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
        window.get_style_context().add_provider (provider_w, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

        grid.attach(boton1, 0, 0, 2, 1)
        grid.attach_next_to (boton2, boton1, Gtk.PositionType.RIGHT, 2, 1)

        window.add(grid)
        window.show_all()   

编辑:

问题在于这行得通:

var css = """       
* {background: #FFFF00; }       
"""
var provider = new Gtk.CssProvider()
try
    provider.load_from_data(css, css.length)
except e: GLib.Error
    stderr.printf ("Hoja de estilo no cargada: %s\n", e.message)        

Gtk.StyleContext.add_provider_for_screen (
    Gdk.Screen.get_default(),
    provider,
    Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)    

但这不起作用:

var css = """       
GtkButton {background: #FFFF00; }       
"""
var provider = new Gtk.CssProvider()
try
    provider.load_from_data(css, css.length)
except e: GLib.Error
    stderr.printf ("Hoja de estilo no cargada: %s\n", e.message)        

Gtk.StyleContext.add_provider_for_screen (
    Gdk.Screen.get_default(),
    provider,
    Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)    

【问题讨论】:

    标签: gtk gtk3 genie


    【解决方案1】:

    已解决

    错误是缺少 Gtk.Widget.get_style_context().add_class("string"):

    // compila con valac --pkg gtk+-3.0 nombre_archivo.gs
    uses Gtk
    
    init
        new MyApplication( "test.application",
            ApplicationFlags.FLAGS_NONE
            ).run( args )
    
    class MyApplication:Gtk.Application
    
        construct( application_id:string, flags:ApplicationFlags )
            if !id_is_valid( application_id )
                error( "application id %s is not valid", application_id )
            this.application_id = application_id
            this.flags = flags
    
        def override activate ()
    
            var window = new Gtk.ApplicationWindow( this )      
            window.window_position = WindowPosition.CENTER
            window.set_border_width(10)
            window.get_style_context().add_class("mi_ventana")
    
            var grid = new Gtk.Grid()       
    
            var boton1 = new Gtk.Button ()      
            boton1.label = "Boton 1"
            boton1.margin = 10
            boton1.get_style_context().add_class("boton1") 
    
            var boton2 = new Gtk.Button ()      
            boton2.label = "Boton 2"
            boton2.margin = 10      
            boton2.get_style_context().add_class("boton2")
    
            var css = """
            .mi_ventana { background: green; }
            .boton1 { background: #FFFF00; }
            .boton2 { background: red; }
            """
    
            var provider = new Gtk.CssProvider()
    
            try
                provider.load_from_data(css, css.length)
            except e: GLib.Error
                stderr.printf ("Hoja de estilo no cargada: %s\n", e.message)        
    
            Gtk.StyleContext.add_provider_for_screen(
                Gdk.Screen.get_default(),
                provider,
                Gtk.STYLE_PROVIDER_PRIORITY_USER)   
    
            grid.attach(boton1, 0, 0, 2, 1)
            grid.attach_next_to (boton2, boton1, Gtk.PositionType.RIGHT, 2, 1)
    
            window.add(grid)
            window.show_all()
    

    【讨论】:

      【解决方案2】:

      Gtk.Button 不是正确的选择器名称。

      对于 3.20 之前的 GTK+ 版本,我相信它是 GtkButton

      从 3.20 开始,您将在 C 文档 https://developer.gnome.org/gtk3/stable/ 的 CSS 节点下看到正确的类名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多