You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用piston_window打印文本异常:仅显示‘1’而非‘10’求助

问题:piston_window输出字符串"10"仅显示"1"

我在使用piston_window库打印文本时遇到问题,尝试输出字符串‘10’,但界面仅显示‘1’。以下是相关代码:

use piston_window::types::Color;
use piston_window::{text, Context, G2d, Glyphs, Transformed};

pub const TEXT_COLOR: Color = [1.0, 1.0, 1.0, 1.0];

pub fn main() {
    let assets = find_folder::Search::ParentsThenKids(3, 3)
        .for_folder("assets")
        .unwrap();

    let ref font = assets.join("retro-gaming.ttf");
    let factory = window.factory.clone();
    let mut glyphs = Glyphs::new(
        font,
        TextureContext {
            factory,
            encoder: window.factory.create_command_buffer().into(),
        },
        TextureSettings::new(),
    )
    .unwrap();

    let mut window: PistonWindow = WindowSettings::new("test", [30, 30])
        .resizable(false)
        .exit_on_esc(true)
        .build()
        .unwrap_or_else(|e| panic!("Failed to build Window: {}", e));

    while let Some(event) = window.next() {
        window.draw_2d(&event, |ctx, g, _| {
            text::Text::new_color(TEXT_COLOR, 20)
                .draw(
                    "10",
                    &mut glyphs,
                    &ctx.draw_state,
                    ctx.transform.trans(0.0, 20.0),
                    g,
                )
                .unwrap();
        });
    }
}

问题分析

  1. 窗口尺寸不足:你设置的窗口大小为[30, 30],但字体大小设为20,字符串"10"的整体宽度超过了窗口的30像素限制,导致第二个字符被窗口边界裁剪,只显示出第一个字符。
  2. 代码顺序错误:你在创建glyphs时提前引用了window.factory,但window是在这之后才初始化的,这会直接导致编译失败,必须调整创建顺序。

修正后的代码

use piston_window::types::Color;
use piston_window::{text, Context, G2d, Glyphs, PistonWindow, TextureContext, TextureSettings, WindowSettings};

pub const TEXT_COLOR: Color = [1.0, 1.0, 1.0, 1.0];

pub fn main() {
    let assets = find_folder::Search::ParentsThenKids(3, 3)
        .for_folder("assets")
        .unwrap();

    let ref font = assets.join("retro-gaming.ttf");

    // 先创建窗口,确保factory可被正确引用
    let mut window: PistonWindow = WindowSettings::new("test", [100, 50]) // 增大窗口尺寸以容纳文本
        .resizable(false)
        .exit_on_esc(true)
        .build()
        .unwrap_or_else(|e| panic!("Failed to build Window: {}", e));

    // 基于已创建的窗口初始化glyphs
    let factory = window.factory.clone();
    let mut glyphs = Glyphs::new(
        font,
        TextureContext {
            factory,
            encoder: window.factory.create_command_buffer().into(),
        },
        TextureSettings::new(),
    )
    .unwrap();

    while let Some(event) = window.next() {
        window.draw_2d(&event, |ctx, g, _| {
            text::Text::new_color(TEXT_COLOR, 20)
                .draw(
                    "10",
                    &mut glyphs,
                    &ctx.draw_state,
                    ctx.transform.trans(10.0, 30.0), // 微调位置避免文本贴边
                    g,
                )
                .unwrap();
        });
    }
}

修改说明

  • 增大窗口尺寸至[100, 50],确保足够显示完整的"10"字符串
  • 调整代码顺序,先创建窗口再初始化glyphs,解决编译错误
  • 微调文本绘制的偏移量,避免字符紧贴窗口边缘

内容的提问来源于stack exchange,提问作者DeFan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:53:12