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: 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.
Mais quand même: pour l'instant une barre d'outils me suffit ...
Voulez-vous dire ceux-ci?
Ils sont juste Gtk.Toolbar
s. 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:
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