GTK Icons bei mehreren Fenstern

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 174
Registriert: Dienstag 14. Juni 2011, 20:03

Montag 25. Januar 2016, 11:58

Hallo,

ich habe mehrere Fenster in einem Programm, jedes Fenster soll ein eigenes Icon haben. Diverse Fenster werden aus einem Haupt-Auswahlfenster aufgerufen.

Bisher habe ich folgendes Verhalten: Ich öffne der Haupt.Auswahlfenster und das festgelegte Icon wird angezeigt. Öffne ich aus diesem heraus ein zweites Fenster wird dieses auch mit dem zugewiesenen Icon geöffnet. Nur das Icon des Haupt-Auswahlfensters wird auch mit diesem ersetzt.
Öffne ich dann aus dem Haupt-Auswahlfenster ein zweites Unterfenster werden alle Icons mit diesem ersetzt.

Beispiel:

Code: Alles auswählen

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_icon_from_file('data/tools_icon.png')

    def calc_tools(self, widget):
        self.accounting_tools = gtk.Window()
        self.accounting_tools.set_icon_from_file('data/calc_tools_icon.png')
Warum ist das so?

MfG

Johannes
Benutzeravatar
martinjo
User
Beiträge: 174
Registriert: Dienstag 14. Juni 2011, 20:03

Donnerstag 28. Januar 2016, 11:42

Hier noch eine Programmbeispiel. Das Icon des zweiten Fensters ersetzt leider das Icon des ersten Fensters.

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import gtk

class IconTest:
    
    def new_window(self, widget):
        self.second_window = gtk.Window()
        pixbuf = self.second_window.render_icon(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU)
        self.second_window.set_icon_list(pixbuf)
        self.second_window.show_all()
        return
    
    def destroy(self, widget):
        gtk.main_quit()
        
    def __init__(self):
        self.main_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        
        pixbuf = self.main_window.render_icon(gtk.STOCK_HOME, gtk.ICON_SIZE_MENU)
        self.main_window.set_icon_list(pixbuf)
        
        self.button = gtk.Button("New Window")
        self.button.connect("clicked", self.new_window)
        self.main_window.add(self.button)
        
        self.button.show()
        self.main_window.show()
        
    def main(self):
        gtk.main()
        gtk.window_set_default_icon_list() 


if __name__ == "__main__":
    it = IconTest()
    it.main()
Oder kann es sein, dass dies einfach nicht möglich ist? Habe jetzt schon sehr lange nach einer Lösung gesucht und konnte nicht mal ansatzweise was dazu finden.
Benutzeravatar
martinjo
User
Beiträge: 174
Registriert: Dienstag 14. Juni 2011, 20:03

Montag 5. März 2018, 01:10

Ich habe hierfür leider noch immer keine Lösung gefunden, doch das Beispiel mal auf Gtk3 upgedated und etwas überarbeitet. Evtl. findet sich ja doch noch jemand der hierfür eine Lösung parat hat.

Also das Problem war, dass beim setzen des Fenstericons für ein Fenster das Icon aller Fenster der Klasse überdeckt werden.

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk


class IconTest:
    
    def __init__(self):
        self.main_window = Gtk.Window(border_width=20)
        icon_theme = Gtk.IconTheme.get_default()
        self.pixbuf1 = icon_theme.load_icon("folder_images", 128, Gtk.IconLookupFlags.FORCE_SVG)
        self.pixbuf2 = icon_theme.load_icon("user-trash", 128, Gtk.IconLookupFlags.FORCE_SVG)
        self.pixbuf3 = icon_theme.load_icon("other-desktop", 128, Gtk.IconLookupFlags.FORCE_SVG)
        self.main_window.set_icon(self.pixbuf1)

        box = Gtk.VBox()
        button = Gtk.Button("New Window 1")
        button.connect("clicked", self.new_window)
        box.pack_start(button, True, True, 0)
        button = Gtk.Button("New Window 2")
        button.connect("clicked", self.new_window_2)
        box.pack_start(button, True, True, 0)
        image = Gtk.Image.new_from_pixbuf(self.pixbuf1)
        box.pack_start(image, True, True, 0)
        
        self.main_window.add(box)
        self.main_window.show_all()
   
    def new_window(self, widget):
        second_window = Gtk.Window(border_width=20)
        second_window.add(Gtk.Image.new_from_pixbuf(self.pixbuf2))
        second_window.set_icon(self.pixbuf2)
        second_window.show_all()

   
    def new_window_2(self, widget):
        second_window = Gtk.Window(icon_name="folder_images", border_width=20)
        second_window.add(Gtk.Image.new_from_pixbuf(self.pixbuf3))
        second_window.show_all()

if __name__ == "__main__":
    IconTest()
    Gtk.main()
   
__deets__
User
Beiträge: 2842
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 5. März 2018, 08:40

Das ist ja eigentlich eine Sache des window managers. Nicht von GTK (oder Qt oder tk).

Und da kann ich mir schon gut vorstellen, das es nur eines gibt. Das wird ja zb auch für die Darstellung im Task Switcher verwand. Da kommt dein Programm ja auch nur einmal vor. Und nicht pro Fenster ein Eintrag. Ebenso in der taskleiste.
Antworten