Wie setzt man das Window Icon korrekt?

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Freitag 24. Februar 2012, 10:33

Wie setzt man bei GTK3 das Window-Icon korrekt, so dass es skaliert?

Code: Alles auswählen

self.window.set_icon_from_file('icon.png')
Weist ein Icon zu das nicht skaliert. Wenn ich ein SVG zuweise motzt er mit 'icon too large'.
Wenn ich mehrere zuweise, skaliert das Icon trotzdem nicht.

Code: Alles auswählen

icon_list = []
for resolution in ['16','32','48','64','128']:
	self.window.set_icon_from_file('icon' + resolution + '.png')
	icon_list.append(self.window.get_icon())
self.window.set_icon_list(icon_list)
Wie macht man das richtig?
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Dienstag 28. Februar 2012, 18:54

set_icon_list() geht eben nicht. Zumindest nicht so wie ich es gemacht habe (siehe Codeblock weiter oben). Das Icon bleibt immer gleich (im Launcher bzw. bei Alt+Tab). Sieht dort jemand einen Fehler?
lunar

Dienstag 28. Februar 2012, 19:05

@rhersel: So ist diese Methode auch nicht gedacht. Du musst die Symbole manuell über GdkPixbuf laden und anschließend über diese Methode dem Fenster zuweisen.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Mittwoch 7. März 2012, 18:23

Aber wie bekomme ich das Image-File in den PixBuf?

GdkPixbuf kennt ja nur zwei Methoden die beide nicht aus einem File lesen: http://developer.gnome.org/gdk3/stable/ ... xbufs.html
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Mittwoch 7. März 2012, 19:14

Wenn man bei Google nach „pixbuf from file“ sucht, findet man beim ersten Treffer den Link zu der Erklärung.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Donnerstag 8. März 2012, 14:56

In Gdk3 gibt es kein gdk_new_from_pixbuf()
lunar

Donnerstag 8. März 2012, 15:02

@rhersel: Diese Funktion ist auch nicht Teil von GDK, sondern von Gdk-Puxbuf. Gdk selbst kümmert sich nur um die Details der Fensterverwaltung.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Donnerstag 8. März 2012, 15:45

Dank, so geht es: (nur die relevanten Codezeilen)

Code: Alles auswählen

from gi.repository import Gtk, Gdk, GdkPixbuf

icon_16 = GdkPixbuf.Pixbuf.new_from_file('icon16.png')
icon_32 = GdkPixbuf.Pixbuf.new_from_file('icon32.png')
icon_48 = GdkPixbuf.Pixbuf.new_from_file('icon48.png')
icon_64 = GdkPixbuf.Pixbuf.new_from_file('icon64.png')
icon_128 = GdkPixbuf.Pixbuf.new_from_file('icon128.png')
self.window.set_icon_list([icon_16, icon_32, icon_48, icon_64, icon_128])
Zuletzt geändert von Anonymous am Donnerstag 8. März 2012, 16:38, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

Donnerstag 8. März 2012, 16:46

Diese ständige Wiederholung der Pixelgrössen könnte man durch eine „list comprehension” los werden (ungetestet):

Code: Alles auswählen

self.window.set_icon_list(
    [
        GdkPixbuf.Pixbuf.new_from_file('icon%d.png' % x)
        for x in [16, 32, 48, 64, 128]
    ]
)
Edit: Den von nomnom angeprochenen Fehler verbessert.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Donnerstag 8. März 2012, 16:56

Bei BlackJacks Variante fehlt natürlich noch das „% x“ hinter dem Stringliteral. Die eckigen Klammern um die Zahlen hätte man übrigens auch weglassen können. (Dann würde über ein Tupel statt über eine Liste iteriert.)
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Donnerstag 8. März 2012, 21:34

Sehr elegant; hab's jetzt so gemacht:

Code: Alles auswählen

self.window.set_icon_list(
	[GdkPixbuf.Pixbuf.new_from_file('nota%d.png' % resolution)
	for resolution in 16, 32, 48, 64, 128])
Aber leider funktioniert die Sache immer noch nicht. Python-seitig ist zwar alles ok aber die verschiedenen Auflösungen werden nicht verwendet. Wenn ich im Ubuntu 11.10 Unity 3D Launcher die Icongrösse auf 'ganz gross' stelle ist das Icon ziemlich verwaschen. Das Gleiche beim App-Switcher (Alt+Tab) obwohl das 128er Icon die richtige Auflösung für die Alt+Tab Grösse bieten würde.

Schade, dass man nicht einfach ein SVG angeben kann; damit wäre der Unsinn mit den 5 Icon-Grössen überflüssig.

Kennt jemand ein Python Programm das in den normalen Repositories ist. Dann schaue ich mal im Sourcecode nach wie andere Leute das machen.
lunar

Donnerstag 8. März 2012, 22:20

@rhersel: Bist Du sicher, dass das der empfohlene Weg ist, einem Gtk-Fenster ein Symbol zu verleihen? Ich kenne mich mit Gtk nicht aus, doch bei Qt kann man dieses Symbol automatisch in der passenden Größe aus dem aktuellen Symbolthema laden.

Es ist auch kein Unsinn, verschiedene Symbole für verschiedene Größen anzugeben. Jede Desktop-Umgebung verfährt so, vor allem bei kleinen Symbolen, da diese in der Regel nachbearbeitet werden. Daher findest Du unter "/usr/share/icons" auch eine Menge Symbole als Pixelgrafik.

Probiere erst einmal auch, ob die Symbole in anderen Desktopumgebungen funktionieren. Unity ist in dieser Hinsicht etwas... merkwürdig.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Donnerstag 8. März 2012, 23:22

Ich meine, dass das nichts mit dem Desktop zu tun haben kann. Unter Unity (und in jeder anderen Distro bzw. Desktop) hat jede Anwendung eigene Applikations-Icons in diversen Auflösungen und legt diese in "usr/share/icons" ab. Wo die Icons gespeichert sind, sollte doch egal sein. Die Anwendung lädt die Icons und gut ist. Auch bei Qt musst du deiner Anwendung doch ein individuelles App-Icon verpassen können.

Ein SVG zu verwenden fände ich halt wesentlich eleganter weil man sich dadurch die vielen Dateien in verschiedenen Auflösung ersparen würde. Das ist ja genau der Sinn von Scalable Vector Graphics.

Ich werde deinen Ratschlag trotzdem befolgen und mein Programm mal unter dem Gnome-Shell Desktop laufen lassen.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Donnerstag 8. März 2012, 23:55

Wie zu erwarten war, skalieren die Icons auch unter Gnome-Shell nicht.
Da aber alle anderen Anwendungen das können, dürfte es nicht zu schwierig sein herauszufinden wie man es richtig macht. Ich werde mal bei Ubuntuusers und AskUbuntu nachfragen und auch versuchen den Sourcecode einer anderen Anwendung zu untersuchen.
Antworten