Rust + GTK4 + Relm4 ile Linux'a Uygulama Geliştirme - Pardus Gönüllüleri

8 Beğeni

Selamunaleyküm
hocam makale için çok teşekkür ederim. Rust ve gtk başlangıcı için faydalı bir kaynak olmuş.
Acaba Rust ve gtk üzerinde grafik çizdirme imkânınız var mıydı? Yani x,y ekseninde noktalar çizip doğru çizme gibi
Egui var ama onun kaynağı yok denecek kadar az ve versiyonlar arasında sıkıntı çırtabiliyor
Acaba ne tavsiye edersiniz

@Arastirmaci tabi tam da serbest grafik çizim işleri için Gtk.DrawingArea var.

Ayrıca GTK3 için yazılmış crateler de buldum bir aramayla: https://crates.io/search?q=cairo%20graph

DrawingArea içine Cairo ile çizim yapılıyor. Cairo ile çizim yapan şeyler çalışacaktır yüksek ihtimalle.

Bir sürü plotter de buldum: plotters - Rust

Relm4 ile DrawingArea kullanımı için: https://github.com/Relm4/Relm4/blob/main/examples/drawing.rs

2 Beğeni

hocam yardımlarınız için teşekkür ederim

plotterı gtk için cairo ile kullanabiliyormuşuz (veya ben öyle anladım)


belki başkası kullanmak isterse

Cargo.toml üzerinde biraz değişiklik yapılması gerekiyor

[dependencies]

gtk = { package = “gtk4”, version = “0.7.3” }

plotters =“*”

plotters-cairo=“*”

#[dependencies.plotters]

#git = “GitHub - plotters-rs/plotters: A rust drawing library for high quality data plotting for both WASM and native, statically and realtimely 🦀 📈🚀

#default_features = true

#features = [“surface_series”]

#[dependencies.plotters-cairo]

#git = “GitHub - plotters-rs/plotters-cairo: Plotters's cairo backend

Bir de istediğimiz plot grafik türünü çizdirmek için src/gaussian_plot/imp.rs içinde 80. satırdan (plot_pdf fonksiyonundan deiştirerek yapabiliyor muşuz)

impl GaussianPlot {
fn gaussian_pdf(&self, x: f64, y: f64) → f64 {
let x_diff = (x - self.mean_x.get()) / self.std_x.get();
let y_diff = (y - self.mean_y.get()) / self.std_y.get();
let exponent = -(x_diff * x_diff + y_diff * y_diff) / 2.0;
let denom = (2.0 * std::f64::consts::PI / self.std_x.get() / self.std_y.get()).sqrt();
let gaussian_pdf = 1.0 / denom;
gaussian_pdf * exponent.exp()
}

fn plot_pdf<'a, DB: DrawingBackend + 'a>(
    &self,
    backend: DB,
) -> Result<(), Box<dyn Error + 'a>> {
    let root = backend.into_drawing_area();

    root.fill(&WHITE)?;

    let root = root.margin(10, 10, 10, 10);
// After this point, we should be able to construct a chart context
let mut chart = ChartBuilder::on(&root)
    // Set the caption of the chart
    .caption("This is our first plot", ("sans-serif", 40).into_font())
    // Set the size of the label region
    .x_label_area_size(20)
    .y_label_area_size(40)
    // Finally attach a coordinate on the drawing area and make a chart context
    .build_cartesian_2d(0f32..10f32, 0f32..10f32)?;

// Then we can draw a mesh
chart
    .configure_mesh()
    // We can customize the maximum number of labels allowed for each axis
    .x_labels(5)
    .y_labels(5)
    // We can also change the format of the label text
    .y_label_formatter(&|x| format!("{:.3}", x))
    .draw()?;

// And we can draw something in the drawing area
chart.draw_series(LineSeries::new(
    vec![(0.0, 0.0), (5.0, 5.0), (self.mean_x.get() as f32, 7.0)],
    &RED,
))?;
// Similarly, we can draw point series
chart.draw_series(PointSeries::of_element(
    vec![(0.0, 0.0), (5.0, 5.0), (self.mean_x.get() as f32, 7.0)],
    5,
    &RED,
    &|c, s, st| {
        return EmptyElement::at(c)    // We want to construct a composed element on-the-fly
        + Circle::new((0,0),s,st.filled()) // At this point, the new pixel coordinate is established
        + Text::new(format!("{:?}", c), (10, 0), ("sans-serif", 10).into_font());
    },
))?;
root.present()?;
Ok(())
}

}

tek anlamadığım ui.xml diye bir şey var glade de benziyor ama tam da değil ona da bakmam lazım
tekrardan teşekkürler

@Arastirmaci ui.xml dosyası Glade veya el ile yazılmış arayüzün XML formatında tanımlanmış hali.

Direkt olarak .xml, .ui ve .glade gibi formatlarda da görebilirsiniz. Hepsinin içi aynı fark etmiyor.

Gtk4 artık Glade tarafında destekli değil dolayısıyla elle yazmak lazım.

Bu konuda blueprint gibi elle yazması daha temiz bir formata geçilecek mi diye sormuştum: Gtk4 - Blueprint as default .ui format? - Core - GNOME Discourse

Belki GTK5 için olur kim bilir. Blueprint’i derleyicisiyle şimdilik gtk builder’in anladığı XML formatına dönüştürebiliyorsunuz. Bu şekilde Blueprint’ten derlenmiş xml dosyasını kullanan uygulamalar çok var.

Gnome geliştiricileri ilginç ya. “Ben xml yazıyorum gayet iyi sıkıntı yok” diye düşündükleri için hala el ile neredeyse 30 yıl önce çıkmış formatda yazıyoruz :slight_smile:

Bu konu son yanıttan 30 gün sonra otomatik olarak kapatıldı. Yeni yanıt girilmesine izin verilmiyor.