ubuntuusers.de

GTK+ 3.0 Button Eigenschaften verändern

Status: Gelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

tom111

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Hallo Ubuntuusers.

Bin jetzt schon ein ganz großes Stück voran gekommen, mich in GTK+ 3.0 zurecht zu finden. Habe mit glade begonnen die Widgets zu gestalten und hat auch bestens funktioniert. 😀 Jetzt habe ich mal versucht, die Widgets ganz alleine mit GTK+ zu erstellen. Soweit funktioniert das auch alles bestens. Allerdings haben sich dabei ein paar Fragen speziell zu einem ganz normalen Button aufgetan, wo ich euch um euren Rat bitten möchte. Denn dazu konnte ich im Netz leider keine Antwort finden.

Frage 1. Wie kann man die Hintergrundfarbe eines einfachen Buttons bzw. die Schriftfarbe des Buttons ändern? So etwas wie gtk_button_set_color gibt es ja leider nicht.

Frage 2. Wie kann man die Schriftart des Buttons ändern? So etwas wie gtk_button_set_font gibt es ja auch leider nicht.

Frage 3. Wenn ich einen Button mit

1
button1 = gtk_button_new_with_mnemonic("_Button 1");

erstelle, sollte dieser mit Unterstrich unter dem "B" sein. Da ist aber kein Unterstrich unter dem B zu sehen! Das es aber funktioniert konnte ich testen mit

1
gtk_button_set_use_underline (GTK_BUTTON(button1), TRUE);

. Wenn die "underline" auf FALSE steht, wird mir der Unterstrich als ein Zeichen der ganz normalen Buttonbeschriftung vor dem B mit auf dem Button angezeigt. Setze ich die underline Funktion wieder auf TRUE, wird der Unterstrich vor dem B nicht mehr angezeigt, aber auch unter dem B ist keiner zu sehen. Woran könnte das liegen?

Frage 4. Es gibt für ein Widget eine Aktivierungsfunktion

1
gtk_widget_activate (GTK_WIDGET(button1));

. Diese Widget-Funktion habe ich mit Button getestet und es gibt auch keine Error Meldung vom Compiler. Also gehe ich mal davon aus, das diese Funktion auch auf einen Button anwendbar ist. Aber! Ich konnte keine Funktion zum deaktivieren finden. Der Gedanke der dahinter steht ist der: Wenn hinter einem Button eine Programmfunktion einprogrammiert ist, die z.B. Daten über eine serielle Schnittstelle sendet, dann soll der Button zwar schon sichtbar sein, aber dennoch nicht aktiv! Denn es muss ja zumindest erst einmal eine serielle Schnittstelle geöffnet werden, bevor dieser Button eine Funktion auslösen kann. Gibt es eine Möglichkeit, einem Button sein "CLICKED-SIGNAL" kurzfristig zu entziehen und später wieder hinzuzufügen? Den Button also zu deaktivieren?

Meine Idee zur Frage 4 als Lösung wäre die: Ich erstelle eine bool-Variable für den entsprechenden Button. Wenn der Button geklickt wird, wird dann diese bool-Variable erst einmal innerhalb der "void" in einer IF-Anweisung abgefragt. Ist die bool-Variable TRUE, dann wird der Inhalt der "void" abgearbeitet, wenn FALSE dann passiert einfach nichts. Damit ich auch sehe, das der Button gerade deaktiviert ist, könnte ich mit der GTK Anweisung

1
gtk_widget_set_opacity(GTK_WIDGET(button1), 0.25);

den gesamten Button abgrauen. Das funktioniert zwar hervorragend, ich könnte mir aber auch gut vorstellen, das es da etwas professionelleres gibt.

Ich bedanke mich schon mal bei all denen die sich die Zeit nehmen, mich bei der Einarbeitung in die Linux Programmierung zu unterstützen.

Gruß Tom

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Ahoi,

Wie kann man die Hintergrundfarbe eines einfachen Buttons bzw. die Schriftfarbe des Buttons ändern? … Wie kann man die Schriftart des Buttons ändern?

das „sollst“ du nicht tun. Es gibt da absichtlich keine direkten Funktionen in GTK für. Du kriegst es zwar auch programmatisch hin, aber dann wird es sperrig.

Der Grund ist, dass das Aussehen die Aufgabe des Themes des Users sein sollte. Anders formuliert, damit Themes überhaupt sinnvoll funktionieren können, darf die Anwendung nicht sagen: „Aber der Button da ist bitte rot!“

Wenn du das trotzdem wirklich machen willst, dann schau’ dich mal im Umfeld hiervon um:

https://developer.gnome.org/gtk3/stable/GtkCssProvider.html

In einem alten Projekt, das ich nicht mehr weiterführe, hatte ich das mal gemacht, um bei einer Stoppuhr eine wirklich große Schrift zu haben:

https://www.uninformativ.de/git/slinp/file/stopclock/stopclock.c.html#l143

sollte dieser mit Unterstrich unter dem "B" sein. Da ist aber kein Unterstrich unter dem B zu sehen!

Du machst das schon richtig, aber um den Unterstrich zu sehen, musst du die Alt-Taste gedrückt halten.

Es gibt für ein Widget eine Aktivierungsfunktion

Glaube, du suchst das hier:

https://developer.gnome.org/gtk3/unstable/GtkWidget.html#gtk-widget-set-sensitive

Der Button wird dann auch von selbst grau bzw. seine Schrift.

(Das „Activate“ bezieht sich auf den Vorgang, der durch Enter eingeleitet wird, also „der User hat da draufgeklickt“.)

Hoffe, das hilft dir weiter. ☺

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Ahoi an Vain.

Als erstes bedanke ich mich für die wirklich sehr gute Erklärung und Deiner Hilfe mit deinem Beispiel-Code.

Bei diesem Satz muss ich zugeben, habe ich über meine eigene Unfähigkeit lachen müssen... 😊

Vain schrieb:

Du machst das schon richtig, aber um den Unterstrich zu sehen, musst du die Alt-Taste gedrückt halten.

Aber da sieht man mal wieder, an welch kleinsten Problem es scheitern kann...

Was die Farbgebung und Schriftart angeht, hatte ich mir es schon fast gedacht, das man da nichts oder nur mit sehr großem Aufwand (CSS) machen kann. In Glade habe ich auch keine solche Möglichkeit. Hatte aber gehofft das es außerhalb von Glade, also wenn man das Widget Button mit GTK selber erstellt dann vielleicht doch mit einer einfachen GTK-Anweisung geht. Da es aber so scheint als ob eine solche Änderung (und leider auch einige andere Änderungen an Widgets auch) mit einer neueren Version von GTK, nur noch mit CSS zu machen ist, bleibt halt dann alles so wie es der Standard vorsieht. Denn in CSS Blicke ich ja mal überhaupt nicht durch... 🙄

Danke auch für die Information das es sich bei "sensitive" um Deaktivieren eines Widgets sich handelt. Sorry, aber da muss man als Anfänger auch erst einmal darauf kommen. Ich habe schon sehr viele GTK-Anweisungen in einem Programm real ausgetestet, um überhaupt erst einmal zu sehen, was diese überhaupt machen und was alles so möglich ist. Aber unter "sensitive" hatte ich mir etwas ganz anderes vorgestellt und auch noch nicht getestet. Das funktioniert jetzt aber Dank Deiner Hilfe bestens!

Auf der Internetseite von Gnome sind ja alle GTK-Anweisungen die es da so gibt ganz wunderschön aufgelistet, geordnet und grundsätzlich beschrieben. Aber was mir hier als Anfänger fehlt, wären reale Programmbeispiele in C-Code. Dann könnte man sehen, was diese Funktionen noch benötigen, um in voller Funktion nutzen zu können. Aber hier ist es halt sehr schwer, brauchbare Information bzw. Beispiel-Code im Netz dazu zu finden und es tun sich sehr viele Fragen auf...

An z.B. der GTK-Anweisung "gtk_color_chooser_get_rgba" habe ich mir fast die Zähne ausgebissen, bevor ich mit einem "gtk_color_button_new();" eine Farbe auswählen und diese in Variablen zur Weiterverarbeitung übertragen konnte. Nach ca. 20 Stunden Arbeit geht es jetzt aber!

Was auch für mich als Anfänger sehr auffällig ist, wie oft das Wort "deprecated" erscheint und dann diese GTK-Anweisung leider nicht mehr anwendbar ist. Denn der Compiler teilt mir dieses dann auch über das Terminal mit. Wenn dann z.B. im Terminal steht das eine GTK-Anweisung "deprecated" ist und man lieber eine andere GTK-Anweisung verwenden sollte, die da im Terminal sogar exakt benannt wird, man aber dann feststellt das auch diese "neue" GTK-Anweisung ebenfalls "deprecated" ist, dann ist das schon sehr frustrierend.

Deshalb bin ich echt sehr froh, wenn man hier im Forum so nette Menschen findet, die einem dabei helfen können. Danke und Gruß Tom.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

tom111 schrieb:

Sorry, aber da muss man als Anfänger auch erst einmal darauf kommen.

Na, da muss sich niemand entschuldigen. ☺ Der ganze Krempel ist wahnsinnig komplex. Das braucht viel Zeit, Geduld und Energie, um sich da durchzuwurschteln …

nur noch mit CSS zu machen ist

Es ist ein Segen und ein Fluch. Wie gesagt, für einheitliches Theming ist der „neue“ Weg sehr gut.

Ist so ein bisschen wie mit der Position von GUI-Elementen. Zu meinen Visual Basic 5-Zeiten unter Windows 95 war es auch noch total üblich, jeden Button manuell mit der Maus pixelgenau zu platzieren. Zum Glück ist sowas Geschichte und heute gibt es Container-Widgets, die das Layout für dich berechnen, damit man das Fenster auch mal gefahrlos resizen kann. ☺ (Vielleicht gab es das damals auch schon, ist bloß nicht in meiner Realitätsblase angekommen.)

Auf der Internetseite von Gnome sind ja alle GTK-Anweisungen die es da so gibt ganz wunderschön aufgelistet, geordnet und grundsätzlich beschrieben. Aber was mir hier als Anfänger fehlt, wären reale Programmbeispiele in C-Code. Dann könnte man sehen, was diese Funktionen noch benötigen, um in voller Funktion nutzen zu können.

Kennst du das Paket gtk-3-examples? Da ist ein Programm namens gtk3-demo drin. Ich hab’ gerade kein Ubuntu zur Hand, aber auf meinem System gibt gtk3-demo mir eine lange Liste von Beispielprogrammen mit C-Quellcode zur Auswahl. Das Ding ist super hilfreich, ich gucke da auch regelmäßig nach.

Was auch für mich als Anfänger sehr auffällig ist, wie oft das Wort "deprecated" erscheint …

Den Schmerz kenne ich gut. Manchmal gibt es auch einfach keinen Ersatz oder keinen gleichwertigen. Da guckt man dann in die Röhre. Aber so ist das halt, die Welt entwickelt sich weiter und es ist mir lieber, wenn die GTK-Menschen alte Zöpfe abschneiden, anstatt bis auf alle Ewigkeit alten Ballast mit sich (und uns) rumzuschleppen.

Zwischen den großen GTK-Versionen (1, 2, 3, jetzt 4) ändert sich schon recht viel, finde ich. Selbst kleinere Programme zwischen diesen Versionen zu portieren, ist aufwändig. Man tut da gut daran, die Sachen, die heute schon als deprecated markiert sind, wirklich strikt zu meiden – selbst, wenn sie in der aktuellen GTK-Version noch funktionieren. Denn irgendwann kommt eben die nächste GTK-Version und dann will man ja so wenig Arbeit wie möglich haben. ☺

tom111

(Themenstarter)

Anmeldungsdatum:
10. Juli 2020

Beiträge: 102

Ahoi noch mal.

Vain schrieb:

Kennst du das Paket gtk-3-examples? Da ist ein Programm namens gtk3-demo drin. Ich hab’ gerade kein Ubuntu zur Hand, aber auf meinem System gibt gtk3-demo mir eine lange Liste von Beispielprogrammen mit C-Quellcode zur Auswahl. Das Ding ist super hilfreich, ich gucke da auch regelmäßig nach.

Nein, das kannte ich bis jetzt noch nicht. Ist aber wirklich eine weitere sehr Gute Information von dir. Auch mein Ubuntu kennt es noch nicht. Das Terminal sagt mir aber schon, das gtk3-demo nicht vorhanden ist aber mit gtk-3-examples nachinstalliert werden kann. Das werde ich dann auch machen und da mal einen Blick hinein werfen. Ich bin mir sicher, es wird mir genauso hilfreich sein, wie es dir ist. Aber für heute ist es erst einmal genug. Werde morgen mir das Ganze mal genauer ansehen.

Besten Dank für die super Information nochmal und besten Gruß Tom.

Antworten |