时间变化时更新 Gtk.Label dynamicall

Posted

技术标签:

【中文标题】时间变化时更新 Gtk.Label dynamicall【英文标题】:Update Gtk.Label dynamicall when time changes 【发布时间】:2021-09-26 06:58:37 【问题描述】:

我正在使用此代码将当前时间写入应用中的 Gtk.Label。

public bool update_time () 
        var now = new GLib.DateTime.now_local ();
        var settings = new GLib.Settings ("org.gnome.desktop.interface");
        var time_format = Granite.DateTime.get_default_time_format (settings.get_enum ("clock-format") == 1, false);

        time1_label = new Gtk.Label (now.format (time_format)) 
            halign = Gtk.Align.CENTER,
            valign = Gtk.Align.CENTER,
            margin_top = 5
        ;
        time1_label.get_style_context ().add_class (Granite.STYLE_CLASS_H3_LABEL);
        time1_label.tooltip_text = time_format;
        time1_label.xalign = 0;

        return true;
    
    

时间显示正确,但我希望标签在更改时更新为最新时间。我该怎么做?

也许以某种方式使用Timeout,但我不知道如何。

【问题讨论】:

【参考方案1】:

您必须创建一个超时,并在其回调中更改time1_label 的文本。 (使用Gdk.threads_add_timeout() 添加超时回调,以防任何依赖项可能使用已弃用的 GTK 锁定机制。)

【讨论】:

【参考方案2】:

您可以像本例中那样使用超时:

public class RefreshLabel : Gtk.Application 
        
    private uint[] timeout_id;
    
    private Gtk.Label label;
    
    public RefreshLabel () 
        Object (
            application_id: "refreh.my.label",
            flags: ApplicationFlags.FLAGS_NONE
        );
    

    protected override void activate () 
        Gtk.ApplicationWindow window = new Gtk.ApplicationWindow (this);
        window.set_default_size (100, 50);
        window.window_position = Gtk.WindowPosition.CENTER;
        window.set_border_width(10);        
        
        // create the timeout with your callback that update the label every 1 second
        timeout_id += Timeout.add_seconds_full (GLib.Priority.DEFAULT, 1, update_time);
        
        label = new Gtk.Label ("");
        var now = new GLib.DateTime.now_local ();
        label.set_markup ("<big>" + now.format ("%x %X") + "</big>");
        
        Gtk.Box vbox = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
        vbox.pack_start (label, false, false, 0);

        window.add (vbox);
        window.show_all ();
    

    protected override void shutdown () 
        // On close all instance of the timeout must be closed
        foreach (var id in timeout_id)
            GLib.Source.remove (id);
        base.shutdown ();
    
    
    public bool update_time () 
        var now = new GLib.DateTime.now_local ();
        label.set_markup ("<big>" + now.format ("%x %X") + "</big>");
        return true;
    

    public static int main (string[] args) 
        RefreshLabel app = new RefreshLabel ();
        return app.run (args);
    

【讨论】:

以上是关于时间变化时更新 Gtk.Label dynamicall的主要内容,如果未能解决你的问题,请参考以下文章

gtk编程中标签控件设置了gtk_label_set_line_wrap(GTK_LABEL(label),TRUE);为啥也不能自动换行呢?

前端动态效果 - dynamic

GTK3 在按钮标签中换行

flink笔记14 动态表(Dynamic Tables)

flink笔记14 动态表(Dynamic Tables)

flink笔记14 动态表(Dynamic Tables)