버튼 생성 자동화

GKT에서 계산기 앱을 쓰고 있습니다.


거의 다 됐는데 소수점 뒤에 한자리 이상 추가가 안됩니다. 그것을 해결하려고합니다. 무엇이든. 오늘은 분수가 아니라 알고리즘에 대해 이야기합시다. 이것이 9개의 동일한 버튼을 만드는 방법입니다. 전송되는 이름과 정보만 다릅니다.

let mut button_value = 1.0;
for iterator in 1..=9 {
    let button = gtk::Button::with_label(&iterator.to_string());
    let mut column = 0;
    let mut raw = 1;

    button.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong  previous_operation, @strong entry,
        @strong dot_counter, @strong value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1,           &value_2, button_value);
            entry.insert_text(&iterator.to_string(), &mut -1);
        }));

    if iterator % 3 == 1 {
        column = 0;
    } else if iterator % 3 == 2 {
        column = 1;
    } else if iterator % 3 == 0 {
        column = 2;
    }
    if iterator > 3 && iterator < 7 { raw = 2 }
    else if iterator >= 7 && iterator <= 9 { raw = 3 }

    grid.attach(&button, column, raw, 1, 1);

    button_value += 1.0;
}


아름답고 간결합니다. 나는 그것이 개선 될 수 있다고 확신하지만.
따라서 동일한 버튼을 아홉 개 만들지 않아야 합니다.

    let button_1 = gtk::Button::with_label("1");
    let button_2 = gtk::Button::with_label("2");
    let button_3 = gtk::Button::with_label("3");
    let button_4 = gtk::Button::with_label("4");
    let button_5 = gtk::Button::with_label("5");
    let button_6 = gtk::Button::with_label("6");
    let button_7 = gtk::Button::with_label("7");
    let button_8 = gtk::Button::with_label("8");
    let button_9 = gtk::Button::with_label("9");
    let button_0 = gtk::Button::with_label("0");

    button_1.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 1.0);
            entry.insert_text("1", &mut -1);
        }));

    button_2.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 2.0);
            entry.insert_text("2", &mut -1);
        }));
    button_3.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 3.0);
            entry.insert_text("3", &mut -1);
        }));
    button_4.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 4.0);
            entry.insert_text("4", &mut -1);
        }));
    button_5.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 5.0);
            entry.insert_text("5", &mut -1);
        }));
    button_6.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 6.0);
            entry.insert_text("6", &mut -1);
        }));
    button_7.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 7.0);
            entry.insert_text("7", &mut -1);
        }));
    button_8.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 8.0);
            entry.insert_text("8", &mut -1);
        }));
    button_9.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 9.0);
            entry.insert_text("9", &mut -1);
        }));
    button_0.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 0.0);
            entry.insert_text("0", &mut -1);
        }));

    grid.attach(&button_1, 0, 1, 1, 1);
    grid.attach(&button_2, 1, 1, 1, 1);
    grid.attach(&button_3, 2, 1, 1, 1);
    grid.attach(&button_4, 0, 2, 1, 1);
    grid.attach(&button_5, 1, 2, 1, 1);
    grid.attach(&button_6, 2, 2, 1, 1);
    grid.attach(&button_7, 0, 3, 1, 1);
    grid.attach(&button_8, 1, 3, 1, 1);
    grid.attach(&button_9, 2, 3, 1, 1);
    grid.attach(&button_0, 1, 4, 1, 1);


오, 그래, 그게 바로 내가 한 일이야!
부끄러워!
팁을 주신 Alaksandr Petrosyan에게 감사드립니다.

Btw: 이것은 처음에 쉼표 뒤에 숫자를 추가하는 문제가 어떻게 생겼는지입니다.



GTK + 계산은 식은 죽 먹기가 아닙니다.

좋은 웹페이지 즐겨찾기