Qual è il widget dell'intestazione nera in alcuni programmi?


22

In alcuni dei programmi di Ubuntu (pannello di controllo di Ubuntu, impostazioni di sistema), ma non ad es. In banshee, la parte superiore della finestra contiene elementi in tono scuro (con il tema Ambience). Ma non riesco a trovare un widget standard che lo fa automaticamente.

Questi colori sono tutti impostati manualmente (invece del widget standard + tema)? E se sono impostati manualmente, da dove provengono nel tema (quali sono i parametri in gtk_widget_modify_bg (widget, GTK_STATE_NORMAL e color))?

EDIT: Non sembra essere un semplice Gtk.Toolbar. Se eseguo il seguente codice:

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

Ottengo una finestra come questa: inserisci qui la descrizione dell'immagine che non ha un tono scuro per la barra degli strumenti.

EDIT2: Sebbene la risposta "barra degli strumenti con contesto speciale" di j-johan-edwards sia vera nella maggior parte dei programmi, non è il caso nel pannello di controllo di Ubuntuone. Questo programma ha un GtkVBox che può includere qualsiasi intervallo di widget (a differenza di una barra degli strumenti). Non sono ancora in grado di determinare come il tema GTK sa come dipingere quella parte della finestra. inserisci qui la descrizione dell'immagine

Ma comunque: per ora una barra degli strumenti è abbastanza per me ...

Risposte:


19

Intendi questi?

Barra degli strumenti GTK3

Sono solo Gtk.Toolbars. Il motivo per cui alcune applicazioni come Banshee non le usano è che non hanno ancora effettuato il porting su GTK + 3 e hanno ricevuto le nuove funzionalità di temi che abilitano barre degli strumenti del genere.

Per eseguire il porting della propria applicazione Python su GTK + 3, è necessario utilizzare PyGObject anziché PyGTK. A partire dal 12.04, Quickly genererà progetti PyGObject per impostazione predefinita.

È inoltre necessario aggiungere primary-toolbaral contesto di stile della barra degli strumenti. Così:

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

l'applicazione di tale contesto all'esempio della domanda comporta questo:

dimostrazione


Ho aggiunto un esempio di Gtk.Toolbar che non sembra scuro. Quindi suppongo che non sia un semplice Gtk.Toolbar?
xubuntix,

Gtk.get_major_version()dice 3, ma sto ancora ottenendo la vecchia barra degli strumenti. Questo è dopo from gi.repository import Gtka sia in python2 che in python3.
Stefano Palazzo

1
Neanche la demo di PyGI dal link che hai pubblicato. Forse gli sviluppatori di app devono applicare lo stile da soli?
Stefano Palazzo

Grazie per questo ho sbattuto la testa contro un muro tutta la mattina !! dovrebbe prima cercare qui.
0x7c0

5

Per quanto riguarda la seconda parte della tua domanda, che era "Come aggiungere VBox alla barra degli strumenti", tutto ciò che devi fare è avvolgerlo in un Gtk.ToolItem, ad esempio :.

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

Puoi semplificarlo creando una funzione di supporto o estendendo Gtk.Toolbar, ad esempio:

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

Controlla semplicemente se l'oggetto che si tenta di inserire è un oggetto strumento e, in caso contrario, lo avvolge all'interno di uno. Esempio di utilizzo:

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

Esso dovrebbe essere simile a questo


1
Per la cronaca, puoi farlo anche con Glade. GtkToolItem non appare nella tavolozza dei widget. Invece devi fare clic con il tasto destro su GtkToolbar nella struttura degli oggetti e selezionare "Modifica" per aprire una finestra di modifica separata. Vai alla scheda "Gerarchia" e aggiungi un nuovo oggetto alla gerarchia. Il tipo di oggetto predefinito è "Pulsante", ma puoi anche selezionare "personalizzato". Quell'elemento "personalizzato" è in realtà un GtkToolItem vuoto. Quindi puoi selezionare quell'elemento vuoto usando la normale interfaccia felice e aggiungere i widget normalmente. Ciò mi ha permesso di aggiungere un widget GtkEntry a una GtkToolbar in pochi secondi.
monotasker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.