簡體   English   中英

Rust Gtk 使用 Glade 文件從 pixbuf 設置 GtkImage

[英]Rust Gtk set GtkImage from pixbuf using glade file

我正在嘗試使用 Rust 將圖像從縮放的 pixbuf 加載到 Glade 的現有 GtkImage 小部件。 我已經閱讀了關於這個主題的所有 Gtk-rs 文檔,它應該以此為基礎工作。 但是,嘗試從 pixbuf 加載時總是會出現問題。 這是我重現錯誤的代碼:

extern crate gtk;
extern crate gio;
extern crate gdk_pixbuf;

use gtk::prelude::*;
use gio::prelude::*;

use gtk::{Builder, MessageDialog, Window, ButtonsType, DialogFlags, MessageType, ResponseType, Image, ImageExt};
use gdk_pixbuf::{Pixbuf};

use std::env::args;

fn build_ui(application: &gtk::Application) {
    let glade_src = include_str!("test.glade");
    let builder = Builder::new_from_string(glade_src);

    let window: Window = builder.get_object("main").expect("Couldn't get main");
    let img2: Image = builder.get_object("img2").expect("Cangt get img2");
    window.set_application(Some(application));
    window.set_title("HLearn - 2020 - Tatyó");

    window.connect_delete_event(move |_, _| {
        println!("Hey");
        let window2: Window = builder.get_object("main").expect("Cant get 2nd");
        let dialog = MessageDialog::new(Some(&window2),
            DialogFlags::MODAL,
            MessageType::Question,
            ButtonsType::YesNo,
            "Are you sure to exit");
        dialog.set_title("Attention!");
        dialog.set_position(gtk::WindowPosition::__Unknown(0));
        let res = dialog.run();
        if res == ResponseType::Yes {
            println!("Yes");
            dialog.destroy();
            Inhibit(false)
        } else {
            println!("No");
            dialog.destroy();
            Inhibit(true)
        }
    });

    let builder2 = Builder::new_from_string(glade_src);
    let window3: Window = builder2.get_object("main").expect("Cant get 3rd");
    let (sx, sy) = window3.get_size();
    let pixbuf = Pixbuf::new_from_file_at_scale(
        "/home/daniel/RUST/test/src/test.gif",
        600,
        700,
        false);
    img2.set_from_pixbuf(Some(&pixbuf));

    window.show_all();
}

fn main() {
    let application = gtk::Application::new(
        Some("com.github.swanux.hlearn"),
        Default::default(),
    )
    .expect("Initialization failed...");

    application.connect_activate(|app| {
        build_ui(app);
    });

    application.run(&args().collect::<Vec<_>>());
}

這是空地文件 test.glade

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkWindow" id="main">
    <property name="can_focus">False</property>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkImage" id="img2">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="hexpand">True</property>
        <property name="vexpand">True</property>
        <property name="stock">gtk-missing-image</property>
      </object>
    </child>
  </object>
</interface>

當我嘗試從 pixbuf 加載圖像時,我總是收到此錯誤消息: expected struct gdk_pixbuf::Pixbuf , found enum std::result::Result 我正在使用安裝了最新 Rust 的 Linux。

這是解決方案。 改變這部分:

let pixbuf = Pixbuf::new_from_file_at_scale(
        "/home/daniel/RUST/test/src/test.gif",
        600,
        700,
        false); 

let pixbuf = Pixbuf::new_from_file_at_scale(
        "/home/daniel/RUST/test/src/test.gif",
        600,
        700,
        false).expect("Can't get pixbuf");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM