boonC Ответов: 3

Перевод того, значение е на этикетке ГТК'


я делаю сумму двух чисел, когда показываю окончательный ответ printf в терминале в порядке. но я хочу показать окончательный ответ в (этикетке gtk), у меня есть много проблем. я пытался сослаться на сайт или форум других людей. большинство из них слишком сложны и все еще ошибочны при компиляции. может ли кто-то помочь или дать решение или исправление этих кодов, которые я показываю? пожалуйста, не добавляйте функцию кнопки в gtk. в конце концов, я хотел попробовать перенести значение датчика printf в gtk.

как получить просто дисплей "total = 23" в gtk?
если кто-то не понимает, можно попробовать запустить 2 кода выше.

..................................................................................................................................................................

// примерное добавление 2-го числа

#include <stdio.h>

int main()
{
  int a, b, c;

  a=3;
  b=20;
  c = a + b;
   
  printf("Sum of numbers = %d\n", c);

return 0;

}


.................................................................................
.................................................................................

// образец gtk
#include <gtk/gtk.h>

void main(int argc, char *argv[])
{
   gtk_init (&argc, &argv);
   GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL);

   gtk_window_set_default_size(GTK_WINDOW(win), 250, 150);

   GtkWidget *lbl = gtk_label_new ("100 C");
   gtk_container_add (GTK_CONTAINER (win), lbl);

   gtk_widget_show_all (win);

   gtk_main();

}




..................................................................................................................................................................

проблема при попытке заменить метку gtk на значение printF

#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>


int main(int argc, char *argv[])
{
  
   int a, b, c;

   a = 3;
   b = 20;
   c = a + b;
   
   gchar* Sumvalue;
   Sumvalue = g_strdup_printf ("total = %d", c);
   
   


   gtk_init (&argc, &argv);
   GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL);

   gtk_window_set_default_size(GTK_WINDOW(win), 250, 150);
 


   GtkWidget *lbl = gtk_label_set_text(GTK_LABEL(*Sumvalue));



   gtk_container_add (GTK_CONTAINER (win), lbl);

   gtk_widget_show_all (win);

   gtk_main();
   

}


Что я уже пробовал:

приведенный выше код-это моя последняя попытка или модификация, но я все еще не могу получить результат. возникли проблемы при его компиляции.


error massage, error, GTK_LABEL undrclared

OriginalGriff

"Ошибка компиляции" не говорит нам многого - и если у нас нет Pi под рукой плюс все библиотеки, которые он использует, мы даже не можем начать догадываться, что такое ошибка компиляции на самом деле.

Поэтому отредактируйте свой вопрос, покажите нам, что такое сообщение об ошибке компилятора, и покажите нам, на какую строку оно ссылается.

Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

3 Ответов

Рейтинг:
2

markkuk

Вам нужно создать метку с помощью gtk_label_new() прежде чем вы сможете изменить его содержимое с помощью gtk_label_set_text()

Вот минимальный пример программы, которая помещает текущее время в метку:

#include <time.h>
#include <gtk/gtk.h>

static const size_t BUFSIZE=30;

void end_program(GtkWidget *wid, gpointer ptr) {
	gtk_main_quit();
}


gboolean timer_func(gpointer ptr) {
	char buffer[BUFSIZE];	
	time_t now = time(NULL);
	strftime(buffer, BUFSIZE, "%H:%M:%S", localtime(&now));
	gtk_label_set_text(GTK_LABEL(ptr), buffer);
	return TRUE;
}

int main(int argc, char **argv)
{
	gtk_init(&argc, &argv);
	GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	g_signal_connect(win, "delete_event", G_CALLBACK(end_program), NULL);
	GtkWidget *lbl = gtk_label_new("My label");
	gtk_container_add(GTK_CONTAINER(win), lbl);
	g_timeout_add_seconds(1, timer_func, lbl);
	gtk_widget_show_all(win);
	gtk_main();
	
	return 0;
}


Компилировать с помощью: gcc `pkg-config --cflags --libs gtk+-2.0` -O2 -Wall -o clock_sample clock_sample.c Это работает на Raspberry Pi3+ под управлением Raspbian Buster.

Вы должны скачать бесплатную электронную книгу "Введение в Программирование C & GUI[^] и пройдите упражнения по порядку с самого начала.


Рейтинг:
12

John R. Shaw

Я не знаю GTK, но C предоставляет функцию 'fprintf'. Если я правильно помню, он будет копировать данные sting в строковый буфер, который вы предоставляете, вместо того, чтобы копировать его на консоль. Как только у вас есть строка, просто передайте ее тому, кто должен напечатать ее на экране.

Проведите свое исследование. Существует далеко, чтобы определить объем памяти, необходимый для буфера для "fprintf", но я не говорю.


Stefan_Lang

Вы, наверное, имеете в виду sprintf. fprintf печатает в файл, а не в буфер.

John R. Shaw

Вы правы :)
Но если бы я не делал таких ошибок, как бы они учились?

Stefan_Lang

Я почти уверен, что они сами способны на такие ошибки :o)

John R. Shaw

Ржунимагу! Спасибо, это лучший смех за последние недели.

Я все еще пытаюсь остановиться и терплю неудачу!

Рейтинг:
0

Richard MacCutchan

Послание совершенно ясное. Вы пытаетесь использовать макрос (я предполагаю), который не существует. Проверка документации на GtkLabel: справочное руководство GTK+ 3[^] для правильного синтаксиса.