LINUX.ORG.RU

Как лучше сделать динамическое обновление label (widget) на gtk4 linux?

 , , ,


0

1

Вот программа:

#include <gtk/gtk.h>
#include "2.h"
#include <glib.h>
// writing a text file
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

string GetStdoutFromCommand(string cmd) {
  string data;
  FILE * stream;
  const int max_buffer = 256;
  char buffer[max_buffer];
  cmd.append(" 2>&1");

  stream = popen(cmd.c_str(), "r");
  if (stream) {
    while (!feof(stream))
      if (fgets(buffer, max_buffer, stream) != NULL) data.append(buffer);
    pclose(stream);
  }
  return data;
}

static void
  app_activate (GApplication *app, gpointer user_data) {
  GtkWidget *win;
  GtkWidget *box;
  GtkWidget *label;
  GtkWidget *grid;
  GtkWidget *textview = gtk_text_view_new();


  // app is new
 win = gtk_application_window_new (GTK_APPLICATION (app));
  gtk_window_set_title (GTK_WINDOW (win), "win");
   gtk_window_set_default_size (GTK_WINDOW (win), 700, 300);

// setup box1
  box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
  gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
  gtk_widget_set_halign (box, GTK_ALIGN_START);
  gtk_widget_set_valign (box, GTK_ALIGN_START);
  gtk_window_set_child (GTK_WINDOW (win), box);

// setup labels
	label = gtk_label_new(GetStdoutFromCommand("netstat -tuwapn").c_str());
	//GetStdoutFromCommand("netstat -tuwapn").c_str()

 
// grid
	grid = gtk_grid_new ();
	gtk_grid_set_row_spacing (GTK_GRID (grid), 1);
    gtk_window_set_child (GTK_WINDOW (win), grid);
	gtk_grid_attach (GTK_GRID (grid), label,200, 3, 50, 50);

	  
// show window
   gtk_widget_show (win);
}
 int main (int argc, char **argv) {
  GtkApplication *app;
 int stat;

 app = gtk_application_new ("gtk.org", G_APPLICATION_FLAGS_NONE);
 g_signal_connect (app, "activate", G_CALLBACK (app_activate), NULL);
 stat =g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);
  return stat;
}

https://ibb.co/5Fb7Thd - это монитор интернет-соединений. Компилируется эта программа, следующей командой: g++ -o test test.cpp $(pkg-config --cflags --libs gtk4) Но он статический. Как на c++ linux делается динамическое обновление этого widget’a label (текстовое поле), чтобы текст в нем менялся, каждые 5 секунд? через сигналы как на qt? через дополнительной демон на c++ в linux по cron’у? Как лучше сделать динамическое обновление label (widget) на gtk4 linux?



Последнее исправление: wersto8top (всего исправлений: 1)

Так создай гтк_таймер, привяжи reload к обработчику.

x86-
()

Как тебе не стыдно, дурень? Тебе сколько лет вообще, такие вопросы задавать?

anonymous
()
Ответ на: комментарий от anonymous

Не вижу ничего стыдного. Я здесь, не потому, что «работаю в ит», а просто как «хобби» у меня. Более, того я «на гражданке» «почти в деревне» и «это рф» - здес постоянно, почти несколько раз в сутки сбрасывается память моего сознания мировым правительством - это обычное явление для жителей рф.

wersto8top
() автор топика
Ответ на: комментарий от wersto8top

«это рф» - здес постоянно, почти несколько раз в сутки сбрасывается память моего сознания мировым правительством

Записал)

IIIypuk ★★★
()
Ответ на: комментарий от IIIypuk

Имею функцию:

static void click1_cb (GtkButton *btn1, gpointer user_data) {
    const gchar *s;
    gtk_label_set_markup(GTK_LABEL(label), "Heldsfdflo.");
}

и код, кнопки, при нажатии на которую вызывается эта функция:

label = gtk_label_new("dfgdf");
gtk_label_set_markup(GTK_LABEL(label), "Hello.");

btn1 = gtk_button_new_with_label ("Reload.");
g_signal_connect (btn1, "clicked", G_CALLBACK (click1_cb()),

Но label из функции click1_cb не доступна. В языке php можно использовать GLOBAL - глобальный доступ к переменной из функции. В c++, здесь я пробовал extern не работает.

Как мне изменять значение label из функции click1_cb по нажатию на btn1 кнопку?

wersto8top
() автор топика
Ответ на: комментарий от wersto8top

https://docs.gtk.org/gtk4/method.Label.set_label.html

Я за тебя уже пол руководства прочитал.

По клике на кнопку запускаешь функцию, которая снова получает выхлоп top и присваивает это значение label

gtk_label_set_markup не правильная функция, тебе нужна

void
gtk_label_set_label (
  GtkLabel* self,
  const char* str
)

Sets the text of the label.

IIIypuk ★★★
()
Последнее исправление: IIIypuk (всего исправлений: 1)

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

Надеюсь у тебя получится

IIIypuk ★★★
()
Ответ на: комментарий от IIIypuk

Это понял я, что нужно использовать эту функцию gtk_label_set_label. Но, мне нужно внутри функции

static void click1_cb (GtkButton *btn1, gpointer user_data) { const gchar *s; 
gtk_label_set_markup(GTK_LABEL(label), «Heldsfdflo.»); 
}

получить доступ к чтению/записи переменной label, хранящейся в основном коде программы

label = gtk_label_new(«dfgdf»); 
g_signal_connect (btn1, «clicked», G_CALLBACK (click1_cb());

p.s: вы меня, похоже можете не понимать, т.к. возможно, я вне вашей системы гос.управления людьми..(другая страна, город и т.д.)..

wersto8top
() автор топика
Ответ на: комментарий от wersto8top

Пытаюсь так, через extern:

static void click1_cb (GtkButton *btn1, gpointer user_data) { const gchar *s; 
extern label;
gtk_label_set_markup(GTK_LABEL(label), «Heldsfdflo.»); 
}

не работает.

wersto8top
() автор топика
Ответ на: комментарий от wersto8top

Передать в click1_cb() label аргументом не пробовал?

А вообще лучше сделать на таймере, чтоьы само обновлялось, без необходимости кликать на кнопку

IIIypuk ★★★
()
Последнее исправление: IIIypuk (всего исправлений: 1)
Ответ на: комментарий от wersto8top

gtk_label_set_markup(GTK_LABEL(label), «Heldsfdflo.»);

Повторяю еще раз, gtk_label_set_markup задает разметку, а текст меняет функция gtk_label_set_label

Чтобы поменять текст label, нужно использовать функцию gtk_label_set_label

IIIypuk ★★★
()
Ответ на: комментарий от wersto8top

p.s: вы меня, похоже можете не понимать, т.к. возможно, я вне вашей системы гос.управления людьми..(другая страна, город и т.д.)

Системы не совместимы между собой, Linux.org.ru у каждой стстемы свой, это очередной инстанс. Если бы мы были в разных странах и системах государственного управления людьми, мы бы не пересеклись здесь.

Глобальный интернет это иллюзия, его не существует

IIIypuk ★★★
()
Ответ на: комментарий от wersto8top

Не так. Это иллюзия. Космоса нет, других стран нет.

Google вообще сайт, который контролирует нас, но созбан с целью иллюзии альтернативы и выбора для конечного пользователя.

Напиши в Google и в Яндекс «linux.org.ru» и увидишь одинаковые сайты в выдаче.

Ты видел когда-нибудь человека из другой страны?

А если видел, ты веришь в это?

13 этаж посмотри

IIIypuk ★★★
()
Последнее исправление: IIIypuk (всего исправлений: 1)
Ответ на: комментарий от wersto8top

Мне сейчас, интересно, создавать приложения/игры с платными продажами для интернет-сторов - чтобы в свбодное время зарабатывать деньги, пусть немного.

wersto8top
() автор топика
Ответ на: комментарий от wersto8top

Я не отрицал существование России и регионов.

Я лично имею опыт проживания в двух разных областях

Я и говорю, что других стран нет, а может и большинства регионов. Помробуй в отпуске сьездить в Калининград.

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

IIIypuk ★★★
()
Ответ на: комментарий от wersto8top

Тогда смотри в пользу Java/Kotlin.

Либо JS+HTML на худой конец.

Android твоя основная платформа, где ты смодешь заработать

IIIypuk ★★★
()
Ответ на: комментарий от IIIypuk

Ну спору нет Ростов_на-Дону город на maps.google.com как помню, находился там около, вблизи, Москвы в 2011 году, по этой карте. А, сейчас, смотришь эту карту, и Ростов-На-Дону находится в 2021 году около страны Украина (снизу справа от Москвы)..Это тайна, мирового правительства - или паралельные миры, или миражи, полтергейст или еще что..И похоже 99% людей, которые съездили из одной области рф, в другую область рф, вообще не возрващаются обратно, плюс, тоже самое касается, поездок в другие страны, похоже 99% людей, не возвращаются обратно.

wersto8top
() автор топика
Ответ на: комментарий от wersto8top

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

wersto8top
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.