GTK+

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

GTK+

Beitrag von +Fuss+ » Mi Dez 17, 2008 4:56 pm

So,
ich habe jetzt angefangen mit dem HalloWelt Programm in GTK+.
Mit

Code: Alles auswählen

gcc HelloWorld.c `sdl-config gtk+-2.0 --cflags --libs`
hat das auch super geklappt.
Ich kann auch nachvollziehen, warum der Rechner etwas bestimmtes macht.

Jetzt wollte ich folgendes Programm (von dieser Seite: http://de.wikibooks.org/wiki/GTK )
testen, um zu verstehen was man mit Boxen alles anstellen kann:

Code: Alles auswählen

#include <gtk/gtk.h>
  
int main(int argc, char *argv[])
{
GtkWidget *window, *box;
         
gtk_init(&argc, &argv);
          
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
           
box = gtk_vbox_new(false, 10);
          
gtk_box_pack_start(GTK_BOX(box), gtk_label_new("Nummer Eins"), false, false, 0);
gtk_box_pack_start(GTK_BOX(box), gtk_label_new("Nummer Zwei"), false, false, 0);
gtk_box_pack_start(GTK_BOX(box), gtk_label_new("Nummer Drei"), false, false, 0);
           
gtk_container_add(GTK_CONTAINER(window), box);
         
gtk_widget_show_all(window);
           
gtk_main();
}
Dann in der Konsole wieder gcc Boxen.c `sdl ... eingegeben.
Danach kam eine Meldung von gcc:

Code: Alles auswählen

GTK.c: In Funktion »main«:
GTK.c:12: Fehler: »false« nicht deklariert (erste Benutzung in dieser Funktion)
GTK.c:12: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt
GTK.c:12: Fehler: für jede Funktion in der er auftritt.)
Ich hoffe ihr könnt mir helfen...

MfG Fuss

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: GTK+

Beitrag von Jside » Mi Dez 17, 2008 5:12 pm

Code: Alles auswählen

#define FALSE    0
bzw.

Code: Alles auswählen

#define false    0
Dann gehts, ansonsten musst du die types.h includieren.

Das sind so die Typischen sachen: FALSE, TRUE und NULL die eigentlich *nur* 0, 1 und 0 sind, und jediglich eine Bezeichnung bekommen haben.

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

Re: GTK+

Beitrag von +Fuss+ » Mi Dez 17, 2008 6:04 pm

Danke für die Antwort.

Das mit dem includieren funktioniert nicht.
Vielleicht weil ich Linux hab?!

Das definieren funktioniert ohne Probleme!

MfG Fuss

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: GTK+

Beitrag von Jside » Do Dez 18, 2008 6:55 am

Nein nein, die types.h gibts bei allen OSen -selbst HobbyOS'en ;)

Bei Linux liegt die allerdings in einem Unterverzeichniss:
#include "sys/types.h"
oder
#include "linux/types.h"
weiss ich jetzt nicht so genau, normalerweise benutzte ich die nie.... :mrgreen:

Alternativ kannst du aber auch statt "FALSE" einfach eine 0 in den Code setzten:
box = gtk_vbox_new(0, 10);
Denn wie gesagt sind "FALSE", und "NULL" nur eine "wörtliche" variante von 0, und "TRUE" eine von 1, damit der Sourcecode *sauberer* und leserlicher ist....

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: GTK+

Beitrag von Xin » Do Dez 18, 2008 8:30 am

+Fuss+ hat geschrieben:Danke für die Antwort.

Das mit dem includieren funktioniert nicht.
Vielleicht weil ich Linux hab?!
"false" ist ein Schlüsselwort in C++, daher ist es in C nicht definiert.
In C gibt es FALSE und TRUE. FALSE und "false" sind zwar prinzipiell das gleiche.
FALSE und TRUE musst Du Dir, wenn ich mich recht entsinne, irgendwo selbst definieren, und da das jeder macht, möglichst so, dass es nicht doppelt definiert wird:

Code: Alles auswählen

#ifndef TRUE
#define TRUE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif
Ich rate davon ab, 0 und 1 zu verwenden, da 0 und 1 Zahlen sind und TRUE und FALSE boolische Aussagen (Wahrheitsaussagen).
Zwar ist 0 falsch und 1 wahr, aber als Mensch liest man da erstmal die Zahlen. Für die Lesbarkeit ist es also von Vorteil, wenn da wirklich etwas steht, dass Dir sagt, dass es nur Wahr und Falsch gibt, statt 0 und 1...und eventuell 2? oder 3?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

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

Re: GTK+

Beitrag von +Fuss+ » Di Dez 23, 2008 8:34 pm

Ich wollte jetzt damit anfangen GTK+ zu lernen.
Und da kommt jetzt auch direkt mal eine Frage zu, zu der ich keine Antwort finde.

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();
}

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);

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

gtk_main();

return 0;
}
da sieht man jetzt die Zeile

Code: Alles auswählen

button = gtk_button_new_with_label("Frohe Weihnachten!"); // Ausgabe der Schrift des Buttons
gibt es eine Möglichkeit, dass die Schrift innerhalb des Buttons blinkt???


MfG Fuss

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: GTK+

Beitrag von Xin » Di Dez 23, 2008 8:44 pm

+Fuss+ hat geschrieben:

Code: Alles auswählen

button = gtk_button_new_with_label("Frohe Weihnachten!"); // Ausgabe der Schrift des Buttons
gibt es eine Möglichkeit, dass die Schrift innerhalb des Buttons blinkt???
Das sind ja nervige Effekte.

Sowas musst Du selbst programmieren. Soweit ich weiß, kannst Du Dir über GTK einen Timer aktivieren, so dass Du im Rhythmus des Timers den Text entfernen, bzw. wieder hinzufügen kannst.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

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

Re: GTK+

Beitrag von +Fuss+ » Di Dez 23, 2008 9:01 pm

Noch 2 Fragen:

Was brauch ich, damit ich den Code unter Windows kompilieren kann?
MinGW hab ich (was muss ich bei gcc noch eingeben, damit der die Librarier mit einbindet?),
die Libraries und so hab ich von gtk.org geladen (wohin wird die .zip entpackt?)

Muss ich noch extra was installiert haben, damit die fertige .exe auf Windows läuft (auch auf anderen Rechnern)?

MfG Fuss,
der gerade nach sieht, wie er das mit dem Timer macht.

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

Re: GTK+

Beitrag von +Fuss+ » Di Dez 23, 2008 10:12 pm

weiß zufällig jemand ob es die DOS-Funktion "delay(zeit)" auch unter Linux gibt, oder wenigstens irgendwas vergleichbares.

Sonst muss ich mir nachher noch selber eine Funktion aus den ganzen time.h Sachen zusammenbauen...

edit:
sleep-Funktion gefunden und angewendet:

Code: Alles auswählen

#include <gtk/gtk.h>
#include <stdio.h>
#include <unistd.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();
}

int main (int argc, char *argv[]) 
{
int zeit;
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);

for (zeit = 0; zeit < 10; zeit++)
{
button = gtk_button_new_with_label("Frohe Weihnachten!");
sleep(1);
button = gtk_button_new_with_label("");
sleep(1);
}

g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(button_geklickt), NULL);

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

gtk_main();

return 0;
}

aber der scheiß Computer :x wartet nach dem starten des Programms erst 20sek und danach erscheint das Fenster, aber der Button befindet sich schon in der Endstellung... :cry:

Gibt es wirklich keine Möglichkeit dieses Fenster mit dem Button schon direkt nach dem Start anzuzeigen, und der Button verändert sich erst dann???

Oder muss ich erst 10000 Bücher kaufen und ins deutsche übersetzen, damit ich rauskrieg, ob es unter GTK+ überhaupt möglich ist, dass die Schrift in einem Button blinkt????

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

Re: GTK+

Beitrag von Kerli » Di Dez 23, 2008 11:26 pm

+Fuss+ hat geschrieben:aber der scheiß Computer :x wartet nach dem starten des Programms erst 20sek und danach erscheint das Fenster, aber der Button befindet sich schon in der Endstellung... :cry:

Gibt es wirklich keine Möglichkeit dieses Fenster mit dem Button schon direkt nach dem Start anzuzeigen, und der Button verändert sich erst dann???
Ich hab zwar keine Erfahrung mit gtk, aber es schaut so aus als würdest du in der Schleife 20 mal den Button neu erstellen und anschließend erst mit 'gtk_widget_show(button)' anzeigen.

Du solltest also schauen ob es geht den Button früher anzuzeigen und dann zb nur die Beschriftung ändern.
+Fuss+ hat geschrieben:Oder muss ich erst 10000 Bücher kaufen und ins deutsche übersetzen, damit ich rauskrieg, ob es unter GTK+ überhaupt möglich ist, dass die Schrift in einem Button blinkt????
So viel Bücher gibt es sehr wahrscheinlich nicht zu dem Thema :P
Aber wozu sollte der Text eigentlich blinken? Ich hab bis jetzt noch kein Programm gesehen, dass das verwendet...
"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