Qu'est-ce que le widget d'en-tête noir dans certains programmes?

22

Dans certains programmes ubuntu (panneau de configuration ubuntu, paramètres système), mais pas par exemple dans banshee, la partie supérieure de la fenêtre contient des éléments dans des tons sombres (avec le thème Ambience). Mais je ne peux pas trouver un widget standard qui le fasse automatiquement.

Ces couleurs sont-elles toutes définies à la main (au lieu d'un widget + thème standard)? Et s'ils sont définis à la main, d'où viennent-ils dans le thème (quels sont les paramètres dans gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, & color))?

EDIT: Il ne semble pas être un simple Gtk.Toolbar. Si j'exécute le code suivant:

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()

Je reçois une fenêtre comme celle-ci: entrez la description de l'image ici qui n'a pas de ton sombre pour la barre d'outils.

EDIT2: Bien que la réponse «barre d'outils avec contexte spécial» de j-johan-edwards soit vraie dans la plupart des programmes, ce n'est pas le cas dans le panneau de contrôle ubuntuone. Ce programme a une GtkVBox qui peut inclure n'importe quelle gamme de widgets (contrairement à une barre d'outils). Je ne parviens toujours pas à déterminer comment le thème gtk sait comment peindre cette partie de la fenêtre. entrez la description de l'image ici

Mais bon: pour l'instant une barre d'outils me suffit ...

xubuntix
la source

Réponses:

19

Tu veux dire ça?

Barre d'outils GTK3

Ce ne sont que des Gtk.Toolbars. La raison pour laquelle certaines applications comme Banshee ne les utilisent pas, c'est qu'elles n'ont pas encore été portées sur GTK + 3 , et ont reçu les nouvelles capacités de thème qui permettent des barres d'outils comme ça.

Pour porter votre propre application Python sur GTK + 3, vous devez utiliser PyGObject au lieu de PyGTK. À partir du 12.04, Quickly générera des projets PyGObject par défaut.

Vous devez également ajouter primary-toolbarau contexte de style de barre d'outils. Ainsi:

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

appliquer ce contexte à l'exemple de question se traduit par ceci:

démo

Jjed
la source
J'ai ajouté un exemple de Gtk.Toolbar qui ne ressemble pas à sombre. Donc je suppose que ce n'est pas un simple Gtk.Toolbar?
xubuntix
Gtk.get_major_version()dit 3, mais je reçois toujours l'ancienne barre d'outils. C'est après un from gi.repository import Gtken python2 et python3.
Stefano Palazzo
1
La démo PyGI du lien que vous avez publié ne les a pas non plus. Peut-être que les développeurs d'applications doivent appliquer eux-mêmes le style?
Stefano Palazzo
Merci de me cogner la tête contre un mur toute la matinée !! devrait d'abord chercher ici.
0x7c0
5

En ce qui concerne la deuxième partie de votre question, qui était "Comment ajouter VBox à la barre d'outils", tout ce que vous avez à faire est de l'envelopper dans un Gtk.ToolItem, par exemple :.

...
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)
...

Vous pouvez le simplifier en créant une fonction d'assistance ou en étendant Gtk.Toolbar, par exemple:

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

Il vérifie simplement si l'objet que vous essayez d'insérer est un ToolItem, et sinon, il l'enveloppe à l'intérieur. Exemple d'utilisation:

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()

Cela devrait ressembler à ceci

Voitek Zylinski
la source
1
Pour mémoire, vous pouvez aussi le faire avec de la clairière. GtkToolItem n'apparaît pas dans la palette des widgets. Au lieu de cela, vous devez cliquer avec le bouton droit sur la barre d'outils GtkTool dans l'arborescence d'objets et sélectionner "Modifier" pour ouvrir une fenêtre d'édition distincte. Accédez à l'onglet "Hiérarchie" et ajoutez un nouvel objet à la hiérarchie. Le type d'objet par défaut est "Button", mais vous pouvez également sélectionner "custom". Cet élément "personnalisé" est en fait un GtkToolItem vide. Ensuite, vous pouvez sélectionner cet élément vide à l'aide de l'interface standard et y ajouter des widgets normalement. Cela m'a permis d'ajouter un widget GtkEntry à une GtkToolbar en quelques secondes.
monotasker