基于 iced 实现一个简易时钟

本文将详细介绍基于 iced 实现一个时钟的完整示例。

知识点

  • iced 的 subscription
  • 窗口图标
  • 程序图标
  • 自定义字体
  • 打包优化
  • 在 release 版本中,防止在 Windows 上出现额外的控制台窗口

预览

UI

优化后的文件大小

开发环境

  • 系统:Windows 11 专业版
  • 编辑器:Visual Studio Code
  • cargo:1.85.1 (d73d2caf9 2024-12-31)
  • 编译工具链:stable-x86_64-pc-windows-msvc (active, default)

代码

Cargo.toml

toml 复制代码
[package]
name = "clock"
version = "0.0.1"
edition = "2024"
build = "build.rs"

[dependencies]
chrono = "0.4.41" # 时间格式化
iced = { version = "0.13.1", features = ["image", "tokio"] } # image 特性是为了导入窗口图标。tokio 是为了启用 iced::time 定时器

[build-dependencies]
winres = "0.1.12" # 为可执行文件添加元信息和图标

[profile.release]
strip = true
lto = true
opt-level = "z"

build.rs

rs 复制代码
extern crate winres;

fn main() {
  if cfg!(target_os = "windows") {
    let mut res = winres::WindowsResource::new();
    res.set_icon("res/icon.ico");
    res.compile().unwrap();
  }
}

main.rs

rs 复制代码
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

use std::time::Duration;

use chrono::Local;
use iced::{
    Element, Font, Length, Size, Subscription,
    widget::{column, container, text},
    window::{Icon, Settings, icon},
};

#[derive(Default)]
struct ClockApp {
    current_time: String,
}

#[derive(Debug, Clone, Copy)]
pub enum Message {
    Tick,
}

impl ClockApp {
    pub fn view(&self) -> Element<Message> {
        container(column![text(&self.current_time).size(26),])
            .center(Length::Fill)
            .into()
    }

    pub fn update(&mut self, message: Message) {
        match message {
            Message::Tick => {
                let now = Local::now();
                self.current_time =
                    format!("{} {}", now.format("%Y-%m-%d"), now.format("%H:%M:%S"));
            }
        }
    }

    fn subscription(&self) -> Subscription<Message> {
        iced::time::every(Duration::from_millis(1000)).map(|_| Message::Tick)
    }
}

fn main() -> iced::Result {
    iced::application("Clock", ClockApp::update, ClockApp::view)
        .font(include_bytes!("../res/MapleMono-Regular.ttf"))
        .default_font(Font::with_name("Maple Mono"))
        .window(Settings {
            icon: Some(Icon::from(
                icon::from_file_data(include_bytes!("../res/icon.ico"), None).unwrap(),
            )),
            size: Size::new(400.0, 200.0),
            ..Default::default()
        })
        .subscription(ClockApp::subscription)
        .run()
}

注: icon.ico 宽高是 256px * 256px

Maple Mono font

参考

zhuanlan.zhihu.com/p/167852399...

crates.io/crates/winr...

crates.io/crates/chro...

docs.rs/iced/latest...

font.subf.dev/zh-cn/downl...

相关推荐
gopher95113 小时前
RUST:序列化与反序列化 serde + derive 详解
开发语言·后端·rust
遇码14 小时前
流式调用中途断连别直接报错:瞬态故障识别、退避重试与中文根因诊断的搭建方法
大数据·人工智能·ai·rust·数据分析·大模型·agent
DongQiShanRen14 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
alwaysrun1 天前
Web之wasm-pack详解
前端·rust·web·wasm
DongQiShanRen1 天前
六根硬件映射(下):物理闭环五步法,抽一条已实装的看
大数据·jvm·人工智能·算法·rust·哈希算法·集成学习
Zenova EdgeOS1 天前
Rust TUI 实战:用 ratatui 构建工业边缘终端界面
开发语言·后端·rust·工业网关
遇码1 天前
不用转场引擎做幻灯片转场:相机滑动、黑场淡入与真全屏的完整做法
人工智能·数码相机·ai·rust·大模型·agent
lpfasd1232 天前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
Flynt2 天前
我把真实的 ES 查询怼到 7059 星的 Rust 搜索引擎上:1366/1369 的兼容承诺,裂了 3 个缝
elasticsearch·搜索引擎·rust
小杍随笔2 天前
egui 0.37 升级实录:卡顿修复与5倍性能回退
windows·rust·egui