web-dev-qa-db-fra.com

Quel est le widget en-tête noir dans certains programmes?

Dans certains programmes ubuntu (panneau de configuration ubuntu, paramètres système), mais pas par ex. Dans Banshee, la partie supérieure de la fenêtre contient des éléments de ton sombre (avec le thème Ambience). Mais je ne peux pas trouver un widget standard qui le fait 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 de gtk_widget_modify_bg (widget, GTK_STATE_NORMAL et couleur))?

EDIT: Cela ne semble pas être un simple Gtk.Toolbar. Si je lance 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: enter image description here qui n'a pas un ton sombre pour la barre d'outils.

EDIT2: Bien que la réponse 'j-johan-edwards' à la barre d'outils avec un contexte spécial soit vraie dans la plupart des programmes, ce n'est pas le cas dans le panneau de configuration d'ubbuntuone. Ce programme a une GtkVBox qui peut inclure n’importe quelle gamme de widgets (à la différence d’une barre d’outils). Je n'arrive toujours pas à déterminer comment le thème gtk sait comment peindre cette partie de la fenêtre. enter image description here

Mais quand même: pour l'instant une barre d'outils me suffit ...

22
xubuntix

Voulez-vous dire ceux-ci?

GTK3 Toolbar

Ils sont juste Gtk.Toolbars. La raison pour laquelle certaines applications telles que Banshee ne les utilisent pas, c'est qu'elles ne sont pas encore portées sur GTK + et qu'elles ont reçu les nouvelles fonctionnalités de thématisation qui permettent de telles barres d'outils.

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

Vous devez également ajouter primary-toolbar au contexte du style de la 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 a pour résultat:

demo

19
Jjed

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 dans un objet. 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 à this

5
Voitek Zylinski