Was ist das Black-Header-Widget in einigen Programmen?

22

In einigen Ubuntu-Programmen (Ubuntu-Systemsteuerung, Systemeinstellungen), aber nicht z. B. in Banshee, enthält der obere Teil des Fensters Elemente in dunklem Ton (mit dem Ambience-Thema). Aber ich kann kein Standard-Widget finden, das dies automatisch erledigt.

Sind diese Farben alle von Hand eingestellt (anstelle von Standard-Widget + Thema)? Und wenn sie von Hand festgelegt wurden, woher kommen sie im Design (welche Parameter enthält gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, & color))?

EDIT: Es scheint keine einfache Gtk.Toolbar zu sein. Wenn ich folgenden Code ausführe:

from gi.repository import Gtk
window = Gtk.Window()
window.set_default_size(200, -1)
window.connect("destroy", lambda q: Gtk.main_quit())
toolbar = Gtk.Toolbar()
window.add(toolbar)
toolbutton = Gtk.ToolButton(stock_id=Gtk.STOCK_NEW)
toolbar.add(toolbutton)
window.show_all()
Gtk.main()

Ich bekomme ein Fenster wie dieses: Bildbeschreibung hier eingeben das keinen dunklen Ton für die Symbolleiste hat.

EDIT2: Obwohl die Antwort 'Symbolleiste mit speziellem Kontext' von j-johan-edwards in den meisten Programmen zutrifft, ist dies in der Ubuntuone-Systemsteuerung nicht der Fall. Dieses Programm verfügt über eine GtkVBox, die (anders als eine Symbolleiste) eine Reihe von Widgets enthalten kann. Ich kann immer noch nicht feststellen, wie das GTK-Theme diesen Teil des Fensters malen kann. Bildbeschreibung hier eingeben

Aber trotzdem: vorerst reicht mir eine Symbolleiste ...

xubuntix
quelle

Antworten:

19

Meinst du das?

GTK3-Symbolleiste

Sie sind nur Gtk.Toolbars. Der Grund, warum einige Anwendungen wie Banshee sie nicht verwenden, ist, dass sie noch nicht auf GTK + 3 portiert wurden und die neuen Theming-Funktionen erhalten haben, die solche Symbolleisten ermöglichen.

Um Ihre eigene Python-Anwendung auf GTK + 3 zu portieren , müssen Sie PyGObject anstelle von PyGTK verwenden. Ab 12.04, Schnell wird pygobject Projekte standardmäßig generieren.

Sie müssen auch primary-toolbarden Kontext des Symbolleistenstils hinzufügen . Wie so:

toolbar = Gtk.Toolbar()
context = toolbar.get_style_context()
context.add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)

Das Anwenden dieses Kontexts auf das Fragenbeispiel führt zu folgendem Ergebnis:

Demo

Jjed
quelle
Ich habe ein Beispiel für eine Gtk.Toolbar hinzugefügt, die nicht dunkel aussieht. Also denke ich, es ist keine einfache Gtk.Toolbar?
xubuntix
Gtk.get_major_version()sagt 3, aber ich bekomme immer noch die alte Symbolleiste. Dies ist nach a from gi.repository import Gtkin python2 und python3.
Stefano Palazzo
1
In der PyGI-Demo des von Ihnen geposteten Links sind sie ebenfalls nicht enthalten. Vielleicht müssen App-Entwickler das Styling selbst anwenden?
Stefano Palazzo
Danke, dass ich den ganzen Morgen mit dem Kopf gegen eine Wand geschlagen bin !! sollte hier erstmal gesucht werden.
0x7c0
5

In Bezug auf den zweiten Teil Ihrer Frage, nämlich "So fügen Sie VBox zur Symbolleiste hinzu", müssen Sie ihn nur in ein Gtk.ToolItem einbinden, z.

...
self.toolbar = Gtk.Toolbar()
self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
tool_item = Gtk.ToolItem()
tool_item.add(self.box)
self.toolbar.insert(tool_item, 0)
...

Sie können es einfacher machen, indem Sie eine Hilfsfunktion erstellen oder die Gtk.Toolbar erweitern, zum Beispiel:

custom_toolbar.py

from gi.repository import Gtk

class CustomToolbar(Gtk.Toolbar):
    def __init__(self):
        super(CustomToolbar, self).__init__()
        ''' Set toolbar style '''
        context = self.get_style_context()
        context.add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)

    def insert(self, item, pos):
        ''' If widget is not an instance of Gtk.ToolItem then wrap it inside one '''
        if not isinstance(item, Gtk.ToolItem):
            widget = Gtk.ToolItem()
            widget.add(item)
            item = widget

        super(CustomToolbar, self).insert(item, pos)
        return item

Es wird lediglich geprüft, ob das Objekt, das Sie einfügen möchten, ein ToolItem ist. Andernfalls wird es in ein ToolItem eingeschlossen. Anwendungsbeispiel:

main.py

#!/usr/bin/python
from gi.repository import Gtk
from custom_toolbar import CustomToolbar

class MySongPlayerWindow(Gtk.Window):
    def __init__(self):
        super(MySongPlayerWindow, self).__init__(title="My Song Player")
        self.set_size_request(640, 480)

        layout = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(layout)

        status_bar = Gtk.Statusbar()
        layout.pack_end(status_bar, False, True, 0)

        big_button = Gtk.Button(label="Play music")
        layout.pack_end(big_button, True, True, 0)

        ''' Create a custom toolbar '''
        toolbar = CustomToolbar()
        toolbar.set_style(Gtk.ToolbarStyle.BOTH)        
        layout.pack_start(toolbar, False, True, 0)

        ''' Add some standard toolbar buttons '''
        play_button = Gtk.ToggleToolButton(stock_id=Gtk.STOCK_MEDIA_PLAY)
        toolbar.insert(play_button, -1)

        stop_button = Gtk.ToolButton(stock_id=Gtk.STOCK_MEDIA_STOP)
        toolbar.insert(stop_button, -1)

        ''' Create a vertical box '''
        playback_info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, margin_top=5, margin_bottom=5, margin_left=10, margin_right=10)

        ''' Add some children... '''
        label_current_song = Gtk.Label(label="Artist - Song Name", margin_bottom=5)
        playback_info.pack_start(label_current_song, True, True, 0)

        playback_progress = Gtk.ProgressBar(fraction=0.6)
        playback_info.pack_start(playback_progress, True, True, 0)

        '''
        Add the vertical box to the toolbar. Please note, that unlike Gtk.Toolbar.insert,
        CustomToolbar.insert returns a ToolItem instance that we can manipulate
        '''
        playback_info_item = toolbar.insert(playback_info, -1)
        playback_info_item.set_expand(True)        

        ''' Add another custom item '''       
        search_entry = Gtk.Entry(text='Search')
        search_item = toolbar.insert(search_entry, -1)
        search_item.set_vexpand(False)
        search_item.set_valign(Gtk.Align.CENTER)

win = MySongPlayerWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

Es sollte wie folgt aussehen diese

Voitek Zylinski
quelle
1
Für die Aufzeichnung können Sie dies auch mit Lichtung tun. GtkToolItem wird nicht in der Palette der Widgets angezeigt. Stattdessen müssen Sie mit der rechten Maustaste auf die GtkToolbar im Objektbaum klicken und "Bearbeiten" auswählen, um ein separates Bearbeitungsfenster zu öffnen. Gehen Sie zur Registerkarte "Hierarchie" und fügen Sie der Hierarchie ein neues Objekt hinzu. Der Standardobjekttyp ist "Schaltfläche", Sie können jedoch auch "Benutzerdefiniert" auswählen. Dieses "benutzerdefinierte" Element ist tatsächlich ein leeres GtkToolItem. Dann können Sie das leere Element über die normale Benutzeroberfläche auswählen und es normalerweise mit Widgets versehen. Dadurch konnte ich in wenigen Sekunden ein GtkEntry-Widget zu einer GtkToolbar hinzufügen.
Monotasker