PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gtk_alignment anwenden



boba
02-03-2006, 21:37
In einem Beispiel eines Buches ist ein beipiel mit Notebooks unter GTK, ich würde jetzt gerne ein Bild auf einer Notebookseite ausrichten.
dafür hab ich ein gtk_alignment_new erschaffen aber komme partou nicht daraus wie ich das jetzt auf das Bild anwende, und das Buch scheint wohl zu glauben der Leser kann eh schon alles oder wie auch immer.

danke


apfel = g_object_new(GTK_TYPE_IMAGE,"file", "bla.png",NULL);

appos = gtk_alignment_new(1.0, 0.0, 0.0, 0.0);
seite2_titel = g_object_new(GTK_TYPE_LABEL,"label", "Larum", NULL);
gtk_notebook_append_page_menu(
notiz,
GTK_WIDGET(apfel),
GTK_WIDGET(seite2_titel),
NULL);

jeebee
04-03-2006, 12:12
also ich empfehle dir, einen Blick auf www.gtk.org zu werfen, dort findest du ein relativ gutes Tutorial, sowie alle API-Dokumentationen von gtk.

Ich denke mal, du kannst dein Alignment mit

gtk_container_add(GTK_CONTAINER(appos), apfel);
auf dein Bild anwenden, da GtkAlignment von GtkContainer abgeleitet ist. Anschliessend must du anstatt dem Bild, das Alignment in das Notebook einbinden.

boba
04-03-2006, 18:10
also ich empfehle dir, einen Blick auf www.gtk.org zu werfen, dort findest du ein relativ gutes Tutorial, sowie alle API-Dokumentationen von gtk.

Ich denke mal, du kannst dein Alignment mit

gtk_container_add(GTK_CONTAINER(appos), apfel);
auf dein Bild anwenden, da GtkAlignment von GtkContainer abgeleitet ist. Anschliessend must du anstatt dem Bild, das Alignment in das Notebook einbinden.

danke, aber so richtig cool und mit dem Bestückt was ich suche ist das tut leider nicht, und ich fin auch nicht gerade gute Beipiele.
Mittlerweile bin ich soweit bei bei einem ausgewählten Listenelement ein g_print auf die console zu bekommen.
Ich würde jetzt gerne für jede Zeile eine eigenes Bild anzeigen lassen.
diese fktn zeigt den Text an, das Bild sollte nach dem Wert der gewählten Reihe benannt sein,
also wert1.png, wert2.png...

void sagwas(GtkTreeSelection *auswahl, gpointer daten){

GtkTreeIter iter;
GtkTreeModel *model = NULL;

if(gtk_tree_selection_get_selected(auswahl, &model, &iter))
{
gchar *name;
gtk_tree_model_get(model, &iter, 1, &name, -1); /*immer mit -1 am Ende*/
g_print("Hallo %s\n",name);
// bild_aktualisieren();
g_free(name);
}
}
nun hab ich versucht innerhalb der Oberen fktn diese auszurufen
und damit das Bild zu ändern:



void bild_aktualisieren()
{
static GdkPixbuf *start_shot = NULL;
GdkPixbuf *changed_shot;

g_object_get(shot, "pixbuf", &start_shot, NULL);
//gdk_pixbuf_new_from_file("bla2.png", NULL);
g_object_set(shot, "pixbuf", "bla2.png", changed_shot, NULL);
g_object_unref(changed_shot);
}
aufgerufen wird das hier:



//____________default picture________________________
shot = g_object_new(GTK_TYPE_IMAGE,"file", "Zwei.png", NULL);

if(auswahl)
{
g_signal_connect(G_OBJECT(auswahl), "changed",G_CALLBACK(sagwas), NULL);
//g_signal_connect(G_OBJECT(auswahl), "changed",G_CALLBACK(bild_aktualisieren), NULL);
}



Ich leide schon wieder unter dem alten linux krampf das die Docs immer das missen was man brauch und es schwer ist n gutes Forum oder überhaupt hilfe zu finde :( und das 2006, schlimm.


Mir würds ja schon reichen wenn mir jemand verrät wie ich vorgehe wenn ich einen knopf drücke das anstatt ein g_print ein g_object_new(GTK_TYPE_LABEL, "label", "Hallo", NULL); oder so ausgeführt wird, ich such seit 2 Tagen nach Infos dazu. danke

jeebee
04-03-2006, 20:10
also ein GtkLabel muss ja in einer hbox, vbox, table oder einem Container-Element eingebettet werden, also brauchst du in der Callback-Funktion die das Label darstellen soll, auch eine Referenz auf den entsprechenden Container.
Hier ein Beispiel das bei jedem Klick auf den Button ein neues Label anhängt:

#include <gtk/gtk.h>

static void add_label(GtkWidget *widget, gpointer data) {
GtkWidget *label;
label = gtk_label_new("Hallo");
gtk_box_pack_end_defaults(GTK_BOX(data), label);
gtk_widget_show(label);
return;
}

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

gtk_init(&argc, &argv);

GtkWidget *window;
GtkWidget *box;
GtkWidget *button;

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
box = gtk_vbox_new(FALSE,2);

gtk_container_add(GTK_CONTAINER(window), box);

button = gtk_button_new_with_label("Hallo-Label hinzufügen");
g_signal_connect(G_OBJECT(button), "clicked",
G_CALLBACK(add_label), GTK_WIDGET(box));
gtk_box_pack_start_defaults(GTK_BOX(box), button);

gtk_widget_show_all(window);

gtk_main();

return 0;
}

boba
04-03-2006, 20:19
cool, das ist schonmal gut, wie kann ich denn dann das alte Label durhc ein neues ersetzen und evtl eine Bild ersetzen.

Ich versuch seit ner Stunde sowas hinzubekommen:



/* -*-coding: utf-8;-*- */
#include <gtk/gtk.h>
#include <stdio.h>
#include <gnome.h>

gint delete_event(GtkWidget *widget, GdkEvent event, gpointer daten){
return FALSE;
}

void ende(GtkWidget *widget, gpointer daten){
gtk_main_quit();
}

void hallo(void){
g_print("ja\n");
}

void bild_aktualisieren(GtkImage *bild){

static GdkPixbuf *start_shot = NULL;
GdkPixbuf *pixbuf;

g_object_get(bild, "pixbuf", &pixbuf, NULL);
pixbuf = gdk_pixbuf_new_from_file("2.png", NULL);
g_object_set(bild, "pixbuf", NULL);
g_object_unref(pixbuf);

}

int main(int argc, char **argv)
{
GtkWindow *fenster;
GtkLabel *titel;
GtkImage *bild;
GdkPixbuf *pixbuf;
GtkWidget *fixed;
GtkButton *knopf;


gtk_init(&argc, &argv);

fenster = g_object_new(GTK_TYPE_WINDOW, "title", "Anzeigeelemente", "border-width", 12, NULL);
g_signal_connect(fenster, "delete-event", G_CALLBACK(delete_event), NULL);
g_signal_connect(fenster, "destroy", G_CALLBACK(ende), NULL);

fixed = gtk_fixed_new ();
gtk_container_add (GTK_CONTAINER (fenster), fixed);
gtk_widget_show (fixed);

titel = g_object_new(GTK_TYPE_LABEL, "label", "Hallo", NULL);
//bild = g_object_new(GTK_TYPE_IMAGE, "file", "1.gif", NULL);
pixbuf = gdk_pixbuf_new_from_file ("1.gif", NULL);

knopf = g_object_new(GTK_TYPE_BUTTON, "label", "fester", NULL);

g_signal_connect(knopf, "clicked", G_CALLBACK(hallo), NULL);
g_signal_connect(knopf, "clicked", G_CALLBACK(bild_aktualisieren), NULL);

gtk_fixed_put(GTK_FIXED(fixed), pixbuf, 21, 14);
gtk_fixed_put(GTK_FIXED(fixed), titel, 1, 2);
gtk_fixed_put(GTK_FIXED(fixed), knopf, 32, 54);

gtk_widget_show_all(GTK_WIDGET(fenster));
gtk_main();
return (0);
}

jeebee
04-03-2006, 20:37
/* -*-coding: utf-8;-*- */
#include <gtk/gtk.h>
#include <stdio.h>
/* #include <gnome.h> */

/* Variable zum hin und herwechseln zw 2 (oder mehr) Bildern
(vllt nicht sehr guter Stil, aber einfach ;-) */

int which;

gint delete_event(GtkWidget *widget, GdkEvent event, gpointer daten){
return FALSE;
}

void ende(GtkWidget *widget, gpointer daten){
gtk_main_quit();
}

void hallo(void){
g_print("ja\n");
}

void bild_aktualisieren(GtkWidget *widget, gpointer data){

/* which = 1, also vom 2. zum 1. Bild wechseln */
if(which) {
gtk_image_set_from_file(GTK_IMAGE(data), "1.png");
which = 0;
}
/* umgekehrt */
else {
gtk_image_set_from_file(GTK_IMAGE(data), "2.png");
which = 1;
}
}

int main(int argc, char **argv)
{
/*
Erste Aktion:
vom 1. Bild zum 2. Bild wechseln
*/
which = 0;

GtkWindow *fenster;
GtkLabel *titel;
GtkImage *bild;
GtkWidget *fixed;
GtkButton *knopf;


gtk_init(&argc, &argv);

fenster = g_object_new(GTK_TYPE_WINDOW, "title", "Anzeigeelemente", "border-width", 12, NULL);
g_signal_connect(fenster, "delete-event", G_CALLBACK(delete_event), NULL);
g_signal_connect(fenster, "destroy", G_CALLBACK(ende), NULL);

fixed = gtk_fixed_new ();
gtk_container_add (GTK_CONTAINER (fenster), fixed);
gtk_widget_show (fixed);

titel = g_object_new(GTK_TYPE_LABEL, "label", "Hallo", NULL);
bild = g_object_new(GTK_TYPE_IMAGE, "file", "1.png", NULL);

knopf = g_object_new(GTK_TYPE_BUTTON, "label", "fester", NULL);

g_signal_connect(knopf, "clicked", G_CALLBACK(hallo), NULL);
g_signal_connect(knopf, "clicked", G_CALLBACK(bild_aktualisieren), GTK_WIDGET(bild));

gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(bild), 21, 14);
gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(titel), 1, 2);
gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(knopf), 32, 54);

gtk_widget_show_all(GTK_WIDGET(fenster));
gtk_main();
return (0);
}
Damit kann man durch klicken zwischen den Bildern 1.png und 2.png wechseln...

boba
04-03-2006, 21:02
danke, das war einfacher wie ich mir das gedacht habe,
ich hab das schon halb in meine tabellenauswahl gepackt,
die funktion wird hier aufgerufen:


auswahl = gtk_tree_view_get_selection(GTK_TREE_VIEW(ansicht) );
g_signal_connect(G_OBJECT(auswahl), "changed",G_CALLBACK(bild_aktualisieren), GTK_WIDGET(shot));

Jetzt würde ich gerne den Inhalt/namen der spalte dazu nutzen ein Bild auszuwählen, diese BIld liegt im ordner der genauso bezeichnet ist wie die Spalte:

void bild_aktualisieren(GtkTreeSelection *auswahl, gpointer data){

GtkTreeIter iter;
GtkTreeModel *model = NULL;

if(gtk_tree_selection_get_selected(auswahl, &model, &iter))
{
gchar *name;
gtk_tree_model_get(model, &iter, 1, &name, -1);
gtk_image_set_from_file(GTK_IMAGE(data), "name/01.png");
// g_print("Hallo %s\n",name);

}
}

Ich versuche gerade den namen in eine variable mit f/s/printf zu schreiben, das crashed bisher nur das programm

jeebee
04-03-2006, 21:06
mit


gchar path[128];
sprintf(path, "%s/01.png", name);

sollte es gehen. Zu beachten ist, das mit sprintf nicht in ein (g)char* geschrieben werden kann und dass die Variable path lange genug ist.

boba
04-03-2006, 21:19
das mag er irgentwie nicht, der Pfad wird richtig ausgegeben,
ich ruf das ganze so auf:
gchar path[128];
sprintf(path, "%s/01.png", name);
gtk_image_set_from_file(GTK_IMAGE(data), "path");
g_print("%s\n",path);

PS: ohne die Anführungsstriche bei path funzt das super, danke :D
2 Tage rumgefummelt, aber so lernt man
Mal sehen ob ich das ganze auf meine Textbox adaptieren kann

jeebee
04-03-2006, 21:31
ich denke, die Adaption sollte kein grosses Problem sein, da die Funktionen für die verschiedenen Widgets ziemlich ähnlich aussehen...

noch etwas: wenn du von einer Funktion die genauen Parameter nicht weisst, dann bist du auf gtk.org unter API Reference und der entsprechenden Dokumentation richtig (jedenfalls wenn du der englischen Sprache mächtig bist).

boba
04-03-2006, 21:54
ich hab das devhelp hier laufen und schaue auch regelmässig darein, braucht nur ne weile bis ich daraus schlau werde ...
Der Text wird in meinem Frame angezeigt, nur das er bei jeder auswahl den neuen text darunter packt, wie in deinem Beispiel,
ist ja ok das er eine neue Box anlegt aber soll halt immer nur den akuellen text anzeigenm, ich hab die fktnen gtk_label_set_text(label, info) und _set gefunden, muss ich dann vorher schon ein label_new gesetzt haben?

Das Problem liegt wohl eher daran das ich die box mit jedem aufruf neu anlege



if(gtk_tree_selection_get_selected(auswahl, &model, &iter))
{
gchar *name;
gtk_tree_model_get(model, &iter, 1, &name, -1); /*immer mit -1 am Ende*/
//g_print("Hallo %s\n",name);
GtkWidget *label;
gchar info[128];
sprintf(info, "%s", name);
label = gtk_label_new(NULL);
gtk_label_set_text(label, info);
gtk_box_pack_end_defaults(GTK_BOX(data), label);
gtk_widget_show(label);

return;
}

jeebee
04-03-2006, 23:16
eine Lösung dafür ist, in der main() das Label zu definieren und initialisieren:

GtkWidget *label;
label = gtk_label_new();
/* ... */
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(update_label), GTK_WIDGET(label)
und anschliessend in der g_signal_connect als data übergeben und in der Callback-Funktion den Text zu setzen:

in update_label()
gtk_label_set_text(GTK_LABEL(data), "der neue text");


Der Nachteil ist, dass das Label schon zu Beginn vorhanden ist, was aber bei einem genügend grossen Fenster keine negativen Auswirkungen haben sollte.

boba
05-03-2006, 20:06
das war ein produktiver sonntag ;).
Vielen dan für die Tips, hat ne menge gebracht.

Ich veruch gerade eine Scrollbar an meinen tree anzubasteln, die liste nennt sich liste mit einer spalte spalte0, er zeigt auch alles brav an aber es scrollt nix :(. die fktn die ich nutze ist wohl auch nicht für treeviews gedacht.



//rollen = gtk_scrolled_window_new(NULL, NULL);
rollen = gtk_vscrollbar_new(NULL);
//gtk_scrolled_window_set_vadjustment(rollen, 1);
gtk_scrolled_window_add_with_viewport(rollen, GTK_WIDGET(spalte0));
gtk_container_add(GTK_CONTAINER(spalte0), GTK_WIDGET(rollen));
gtk_fixed_put(GTK_FIXED (fixed1), rollen, 800, 20);
gtk_widget_set_size_request(rollen, 16, 560);


wie gehts weiter?

jeebee
06-03-2006, 13:10
schau dir mal das Programm gtk-demo an, dort findest du recht gute code-beispiele
evtl hats auch was für scrolled_windows darunter...

ich kenn diese Funktionen noch nich...