¿Cuál es el widget de encabezado negro en algunos programas?

22

En algunos de los programas de ubuntu (panel de control de ubuntu, configuración del sistema), pero no, por ejemplo, en banshee, la parte superior de la ventana contiene elementos en tono oscuro (con el tema Ambience). Pero no puedo encontrar un widget estándar que haga esto automáticamente.

¿Todos estos colores están configurados a mano (en lugar de widget + tema estándar)? Y si se configuran a mano, ¿de dónde vienen en el tema (cuáles son los parámetros en gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, y color))?

EDITAR: No parece ser un simple Gtk.Toolbar. Si ejecuto el siguiente código:

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

Me sale una ventana como esta: ingrese la descripción de la imagen aquí que no tiene un tono oscuro para la barra de herramientas.

EDIT2: Aunque la respuesta 'barra de herramientas con contexto especial' de j-johan-edwards es cierta en la mayoría de los programas, no es el caso en el panel de control de ubuntuone. Este programa tiene un GtkVBox que puede incluir cualquier rango de widgets (a diferencia de una barra de herramientas). Todavía no puedo determinar cómo el tema gtk sabe cómo pintar esa parte de la ventana. ingrese la descripción de la imagen aquí

Pero de todos modos: por ahora una barra de herramientas es suficiente para mí ...

xubuntix
fuente

Respuestas:

19

¿Te refieres a estos?

Barra de herramientas GTK3

Son solo Gtk.Toolbars. La razón por la cual algunas aplicaciones como Banshee no las usan es porque aún no se han portado a GTK + 3 , y recibieron las nuevas capacidades de temas que permiten barras de herramientas como esa.

Para portar su propia aplicación Python a GTK + 3, debe usar PyGObject en lugar de PyGTK. A partir del 12.04, Quickly generará proyectos PyGObject por defecto.

También debe agregar primary-toolbaral contexto de estilo de la barra de herramientas. Al igual que:

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

aplicando ese contexto al ejemplo de la pregunta resulta en esto:

manifestación

Jjed
fuente
Agregué un ejemplo de un Gtk.Toolbar que no parece oscuro. Así que supongo que no es un simple Gtk.Toolbar?
xubuntix
Gtk.get_major_version()dice 3, pero sigo obteniendo la barra de herramientas anterior. Esto es después de un from gi.repository import Gtktanto en python2 como en python3.
Stefano Palazzo
1
La demostración de PyGI del enlace que ha publicado tampoco los tiene. ¿Quizás los desarrolladores de aplicaciones tengan que aplicar el estilo ellos mismos?
Stefano Palazzo
¡Gracias por esto me ha estado golpeando la cabeza contra la pared toda la mañana! debería haber buscado aquí primero.
0x7c0
5

Con respecto a la segunda parte de su pregunta, que era "Cómo agregar VBox a la barra de herramientas", todo lo que tiene que hacer es envolverlo dentro de un Gtk.ToolItem, por ejemplo :.

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

Puede simplificarlo creando una función auxiliar o extendiendo Gtk.Toolbar, por ejemplo:

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

Simplemente comprueba si el objeto que intenta insertar es un elemento de herramienta, y si no, lo envuelve dentro de uno. Ejemplo de uso:

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

Debe quedar como esta

Voitek Zylinski
fuente
1
Para el registro, también puedes hacer esto con glade. GtkToolItem no aparece en la paleta de widgets. En su lugar, debe hacer clic derecho en la barra de herramientas Gtk en el árbol de objetos y seleccionar "Editar" para abrir una ventana de edición separada. Vaya a la pestaña "Jerarquía" y agregue un nuevo objeto a la jerarquía. El tipo de objeto predeterminado es "Botón", pero también puede seleccionar "personalizado". Ese elemento "personalizado" es, de hecho, un GtkToolItem vacío. Luego, puede seleccionar ese elemento vacío utilizando la interfaz normal de alegría y agregarle widgets normalmente. Esto me permitió agregar un widget GtkEntry a una barra de herramientas Gtk en cuestión de segundos.
monotasker