Co to jest widżet czarnego nagłówka w niektórych programach?

22

W niektórych programach ubuntu (panel sterowania ubuntu, ustawienia systemowe), ale nie np. W banshee, górna część okna zawiera elementy w ciemnym odcieniu (z motywem Ambience). Ale nie mogę znaleźć standardowego widgetu, który robi to automatycznie.

Czy te kolory są ustawione ręcznie (zamiast standardowego widgetu + motywu)? A jeśli są ustawione ręcznie, skąd pochodzą w motywie (jakie są parametry w gtk_widget_modify_bg (widget, GTK_STATE_NORMAL i kolor))?

EDYCJA: To nie wydaje się być prostym paskiem narzędzi Gtk. Jeśli uruchomię następujący kod:

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

Dostaję takie okno: wprowadź opis zdjęcia tutaj które nie ma ciemnego tonu dla paska narzędzi.

EDYCJA 2: Chociaż odpowiedź na „pasek narzędzi ze specjalnym kontekstem” autorstwa j-johan-edwards jest prawdziwa w większości programów, w panelu sterowania ubuntuone tak nie jest. Ten program ma GtkVBox, który może zawierać dowolny zakres widżetów (w przeciwieństwie do paska narzędzi). Nadal nie jestem w stanie ustalić, w jaki sposób motyw GTK wie, jak malować tę część okna. wprowadź opis zdjęcia tutaj

Ale w każdym razie: na razie wystarczy mi pasek narzędzi ...

xubuntix
źródło

Odpowiedzi:

19

Masz na myśli to?

Pasek narzędzi GTK3

To tylko Gtk.Toolbars. Niektóre aplikacje, takie jak Banshee, nie korzystają z nich, ponieważ nie zostały jeszcze przeniesione do GTK + 3 i otrzymały nowe możliwości tematyczne, które umożliwiają takie paski narzędzi.

Aby przenieść własną aplikację Python do GTK + 3, musisz użyć PyGObject zamiast PyGTK. Od 12.04 Quickly będzie domyślnie generować projekty PyGObject.

Musisz także dodać primary-toolbardo kontekstu stylu paska narzędzi. Tak jak:

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

zastosowanie tego kontekstu do przykładu pytania powoduje:

próbny

Jjed
źródło
Dodałem przykład paska narzędzi Gtk.Toolbar, który nie wygląda jak ciemny. Sądzę więc, że nie jest to zwykły pasek narzędzi Gtk.Toolbar?
xubuntix 18.10.11
Gtk.get_major_version()mówi 3, ale wciąż otrzymuję stary pasek narzędzi. Dzieje się tak po from gi.repository import Gtkpython2 i python3.
Stefano Palazzo
1
Demo PyGI z zamieszczonego linku również ich nie ma. Może twórcy aplikacji muszą sami zastosować styl?
Stefano Palazzo
Dzięki, że przez cały ranek waliłem głową w ścianę !! powinienem najpierw tu szukać.
0x7c0
5

W odniesieniu do drugiej części pytania, która brzmiała: „Jak dodać VBox do paska narzędzi”, wszystko co musisz zrobić, to owinąć go w Gtk.ToolItem, np .:

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

Możesz to uprościć, tworząc funkcję pomocnika lub rozszerzając Gtk.Toolbar, na przykład:

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

Po prostu sprawdza, czy obiekt, który próbujesz wstawić, jest narzędziem ToolItem, a jeśli nie, zawija go w sobie. Przykład użycia:

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

Powinno to tak wyglądać

Voitek Zylinski
źródło
1
Dla przypomnienia, możesz to zrobić również na polanie. GtkToolItem nie pojawia się w palecie widżetów. Zamiast tego należy kliknąć prawym przyciskiem myszy pasek narzędzi GtkToolbar w drzewie obiektów i wybrać „Edytuj”, aby otworzyć osobne okno edycji. Przejdź do zakładki „Hierarchia” i dodaj nowy obiekt do hierarchii. Domyślny typ obiektu to „Przycisk”, ale można również wybrać „niestandardowy”. Ten „niestandardowy” element jest w rzeczywistości pustym GtkToolItem. Następnie możesz wybrać ten pusty element za pomocą zwykłego interfejsu zadowolenia i normalnie dodawać do niego widżety. To pozwoliło mi dodać widżet GtkEntry do paska narzędzi GtkToolbar w ciągu kilku sekund.
monotasker