GTK+

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: GTK+

Beitrag von Kerli » Mi Dez 24, 2008 12:47 pm

Ich hab mich jetzt auch einmal kurz schlau gemacht. Und du solltest dir wirklich einmal die Timer anschauen. zb hier wird es eigentlich ganz gut erklärt...
+Fuss+ hat geschrieben:Ich hasse Gtk...
Und damit du nicht ganz verzweifelst hab ich das sogar noch in dein Programm eingebaut:

Code: Alles auswählen

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

void button_geklickt(GtkWidget *button_widget, gpointer data)
{
    printf("Button \"%s\" geklickt!\n",
    gtk_button_get_label(GTK_BUTTON(button_widget)) );
    gtk_main_quit();
}

// Wird vom Timer alle 0.75 Sekunden aufgerufen
static gboolean
time_handler(GtkWidget *widget)
{
   static int visible = 0;

   if( visible )
   {
       gtk_button_set_label( (GtkButton*)widget, "Frohe Weihnachten!" );
       visible = 0;
   }
   else
   {
       gtk_button_set_label( (GtkButton*)widget, "" );
       visible = 1;
   }

   return TRUE;
}

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

    GtkWidget *window;
    GtkWidget *button;

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Weihnachten");

    gtk_container_set_border_width(GTK_CONTAINER(window), 100);

    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK (gtk_main_quit), NULL);

    button = gtk_button_new_with_label("Frohe Weihnachten!"); // Ausgabe der Schrift des Buttons
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(button_geklickt), NULL);
    g_timeout_add(750, (GSourceFunc) time_handler, (gpointer) button); // Timer mit 0.75 Sekunden Intervall registrieren


    gtk_widget_show(button);
    gtk_container_add(GTK_CONTAINER(window), button);
    gtk_widget_show(window);

    gtk_main();

    return 0;
}
Du solltest darauf achten, das du nichts am grundlegenden Ablauf mit der Nachrichtenschleife änderst, da darauf alle aktuellen Betriebssysteme aufbauen, und so ein reibungsloser Programmablauf ermöglicht wird.
Und der Timer macht nichts anderes als dir nach einer bestimmten Zeit immer wieder ein Event zu schicken, das du dann in einer Funktion auffangen kannst und zb den Text ändern kannst.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: GTK+

Beitrag von +Fuss+ » Mi Dez 24, 2008 12:52 pm

DANKE!

funktioniert, jetzt versuche ich das zu verstehen und danach wird als Test ein anderes Programm mit Timer gebaut.

MfG Fuss

edit:
Zeit von 750 auf 100 geändert ;)

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: GTK+

Beitrag von +Fuss+ » Di Dez 30, 2008 7:38 pm

Noch eine Frage zum Thema Timer:
ist es auch möglich, das die Schrift des Buttons zwischen 3 Zuständen wechselt?

Code: Alles auswählen

    static gboolean
    time_handler(GtkWidget *widget)
    {
       static int visible = 0;

       if( visible )
       {
           gtk_button_set_label( (GtkButton*)widget, "1" );
           visible = 0;
       }
       else
       {
           gtk_button_set_label( (GtkButton*)widget, "2" );
           visible = 1;
       }

       return TRUE;
    }


g_timeout_add(750, (GSourceFunc) time_handler, (gpointer) button); // Timer mit 0.75 Sekunden Intervall registrieren
Jetzt wechselt die Schrift ja zwischen 1 und 2,
wie geht es, dass die Schrift auf dem Burron zwischen 1, 2 und 3 wechselt?

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: GTK+

Beitrag von Kerli » Di Dez 30, 2008 7:55 pm

+Fuss+ hat geschrieben:Noch eine Frage zum Thema Timer:
ist es auch möglich, das die Schrift des Buttons zwischen 3 Zuständen wechselt?
Klar, das ist kein Problem. Du kannst zum Beispiel eine Variable nehmen die den aktuellen Zustand beinhaltet und bei jedem Timeraufruf hinaufgezählt wird. Wenn sie einen bestimmten Wert erreicht wird sie einfach wieder zurückgesetzt.

Jetzt musst du nur mehr abhängig vom aktuellen Zustand noch deinen Button verändern. Ob das jetzt 2, 3 oder mehr Zustände sind ist dann eigentlich egal.

Und so nebenbei: Falls der Timer einmal aufhören soll brauchst du nur in der Funktion 'time_handler' 'FALSE' zurückgeben...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: GTK+

Beitrag von +Fuss+ » Di Dez 30, 2008 9:44 pm

ok danke

ich probier das jetzt mal.

MfG Fuss

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: GTK+

Beitrag von +Fuss+ » Di Dez 30, 2008 10:32 pm

Das was ich eigentlich machen wollte (mehrere Zustände im Timer) hab ich noch nicht verstanden.
Wie mache ich das mit der Variablen?

Dafür hab ich das mit dem "return FALSE;" gemacht:

Code: Alles auswählen

       
if(i<100)
{
       i++;
       return TRUE;
}
else
{
       return FALSE;
}

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: GTK+

Beitrag von Dirty Oerti » Di Dez 30, 2008 11:16 pm

Du hast ja deinen Timerhandler.

Du brauchst also nur eine Variable, in der du den aktuellen Zustand speichern kannst.
Dazu nimmst du z.B. eine globale Variable.
Oder, was auch gehen müsste, du definierst eine Variable als static.

Code: Alles auswählen

//im TimerHandler
static char zustand = 0;//Zustand wird NUR beim ersten Aufruf auf 0 gesetzt!
if (zustand==0) {
    //was auch immer..
} elseif (zustand==1) {
  //bla
}// und so weiter...

zustand++;
if (zustand > 3) zustand = 0;

Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: GTK+

Beitrag von Kerli » Di Dez 30, 2008 11:31 pm

+Fuss+ hat geschrieben:Dafür hab ich das mit dem "return FALSE;" gemacht:
Ok, vielleicht hätte ich das besser nicht sagen sollen, aber das hat eigentlich nicht direkt mit deiner Frage zu tun, aber es ist im Zusammenhang mit Timern wichtig. Vergiss es zurzeit am Besten noch einmal...

Nun zu deinem Problem:

Du möchtest das nach jedem Ablauf der Timerperiode ein neuer Zustand eintritt. Wenn alle gewünschten Zustände durchlaufen worden sind willst du wieder von vorne beginnen.
Du definierst also wieder wie gehabt die 'time_handler'-Funktion und definierst eine statische Variable, die den aktuellen Zustand speichern soll. Statisch muss die Variable deshalb sein, damit der Wert der Variable auch bei folgenden Funktionsaufrufen erhalten bleibt:

Code: Alles auswählen

gboolean time_handler(GtkWidget *widget)
{
  static int state = 0; // aktueller Zustand (Beginnend mit 0)

  return TRUE;
}
Da du nach jedem Aufruf der Funktion auch den Zustand wechseln möchtest erhöhst du den Wert der Variablen um 1. Weil du nur 3 Zustände haben willst musst du noch schauen, dass wenn die Zustandsvariable 3 erreicht sie auch wieder zurückgesetzt wird:

Code: Alles auswählen

++state;
if( state >= 3 ) state = 0;
Und jetzt musst du nur mehr deinen Button oder was auch immer abhängig vom Zustand anpassen. Alles in allem schaut das dann ca. so aus:

Code: Alles auswählen

gboolean time_handler(GtkWidget *widget)
{
  static int state = 0; // aktueller Zustand (Beginnend mit 0)

  switch( state )
  {
    case 0:
      // Tu was mit deinem Button für Zustand 0
      break;
    case 1:
      // Tu was mit deinem Button für Zustand 1
      break;
    case 2:
      // Tu was mit deinem Button für Zustand 2
      break;
  }

  ++state; // nächster Zustand
  if( state >= 3 ) state = 0; // Zustandszähler bei Bedarf zurücksetzen

  return TRUE;
}
edit: Da war wohl jemand schneller als ich, aber @ Dirty Oerti: In deinem Beispiel hast du 4 Zustände ;)
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: GTK+

Beitrag von +Fuss+ » Mi Dez 31, 2008 12:05 am

;) Danke, jetzt hab ich das verstanden!

switch: da hätte ich auch selber drauf kommen müssen.

Warum das mit dem return vergessen?
grundsätzlich ist das doch ganz einfach: wenn FALSE zurückgegeben wird ist ende mit dem Timer, wenn TRUE zurückgegeben wird, gehts weiter.

MfG Fuss

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: GTK+

Beitrag von Kerli » Mi Dez 31, 2008 12:07 am

+Fuss+ hat geschrieben:Warum das mit dem return vergessen?
grundsätzlich ist das doch ganz einfach: wenn FALSE zurückgegeben wird ist ende mit dem Timer, wenn TRUE zurückgegeben wird, gehts weiter.
Ja, passt schon. Ich hab nur gedacht, dass es dich vielleicht zu weit vom eigentlichen Problem ablenken könnte :D
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten