Как сделать бесконечный цикл в GTK - PullRequest
0 голосов
/ 22 сентября 2019

Я хочу создать программу на C с интерфейсом GTK, которая будет периодически обновлять и отображать значение переменной (POS) после получения состояния некоторых кнопок переключения и паузы / сна в течение 1 секунды.

По существу, естьдве кнопки, ВВЕРХ и ВНИЗ, и когда нажата ВВЕРХ, то POS должен быть обновлен до POS = POS + 1, а когда нажата кнопка ВНИЗ, он должен быть обновлен до POS = POS - 1.

Если обе кнопки нажаты(они являются кнопками переключения), после перехода к +1 и -1 он должен вернуться к тому же значению.

После окончания цикла метка (LABEL) должна отображать значение POS и делать паузу в течение 1 секунды, прежде чемначиная снова.

Я сделал минимальный рабочий пример, но застрял в создании цикла.

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {

  GtkWidget *window;
  GtkWidget *fixed;

  GtkWidget *UP;
  GtkWidget *DOWN;


  GtkWidget *LABEL;
  float POS=0;
  gchar *text;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW(window), "GtkFixed");
  gtk_window_set_default_size(GTK_WINDOW(window), 300, 300);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

  fixed = gtk_fixed_new();
  gtk_container_add(GTK_CONTAINER(window), fixed);

  DOWN = gtk_toggle_button_new_with_label("DOWN");
  gtk_fixed_put(GTK_FIXED(fixed), DOWN, 100, 200);
  gtk_widget_set_size_request(DOWN, 80, 30);

  UP = gtk_toggle_button_new_with_label("UP");
  gtk_fixed_put(GTK_FIXED(fixed), UP, 200, 200);
  gtk_widget_set_size_request(UP, 80, 30);

  LABEL = gtk_label_new ("0");
  gtk_fixed_put(GTK_FIXED(fixed), LABEL, 150, 100);

/*This while loop should do but I don't know how to make it run


while TRUE {

if (gtk_toggle_button_get_mode(GTK_TOGGLE_BUTTON(UP))) {
POS = POS + 1.;}

if (gtk_toggle_button_get_mode(GTK_TOGGLE_BUTTON(DOWN))) {
POS = POS - 1.;}

text = g_strdup_printf (" %f ", POS);
gtk_label_set_label (GTK_LABEL(LABEL), text);

sleep(1);
}; */ 


  g_signal_connect(G_OBJECT(window), "destroy", 
  G_CALLBACK(gtk_main_quit), NULL);
  gtk_widget_show_all(window);
  gtk_main();
}

1 Ответ

0 голосов
/ 23 сентября 2019

Вызов gtk_main уже является циклом, он запускает цикл основного события.Затем вам нужно подумать о том, какое событие запускает нужный вам компортмент.Нажав на кнопку?Подключите к «нажатому» сигналу кнопки.Сроки?Используйте g_timer_add или g_timer_add_seconds, чтобы указать, сколько времени должен быть вызван ваш обратный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...