Что такое виджет черного заголовка в некоторых программах?

22

В некоторых программах Ubuntu (панель управления Ubuntu, настройки системы), но не в банши, например, верхняя часть окна содержит элементы темного тона (с темой Ambience). Но я не могу найти стандартный виджет, который делает это автоматически.

Все эти цвета установлены вручную (вместо стандартного виджета + темы)? И если они установлены вручную, откуда они берутся в теме (каковы параметры в gtk_widget_modify_bg (виджет, GTK_STATE_NORMAL, & color))?

РЕДАКТИРОВАТЬ: Это не похоже на простой Gtk.Toolbar. Если я запускаю следующий код:

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

Я получаю окно, подобное этому: в нем введите описание изображения здесь нет темного тона для панели инструментов.

РЕДАКТИРОВАТЬ 2: Хотя ответ j-johan-edwards «панель инструментов со специальным контекстом» верен в большинстве программ, в ubuntuone-control-panel это не так. Эта программа имеет GtkVBox, который может включать в себя любой диапазон виджетов (в отличие от панели инструментов). Я до сих пор не могу определить, как gtk-theme знает, как рисовать эту часть окна. введите описание изображения здесь

Но в любом случае: пока мне достаточно панели инструментов ...

xubuntix
источник

Ответы:

19

Вы имеете в виду это?

Панель инструментов GTK3

Они просто Gtk.Toolbarс. Причина, по которой некоторые приложения, такие как Banshee, не используют их, заключается в том, что они еще не портированы на GTK + 3 и получили новые возможности создания тем, которые позволяют использовать такие панели инструментов.

Чтобы портировать ваше собственное приложение Python на GTK + 3, вам нужно использовать PyGObject вместо PyGTK. Начиная с 12.04, Quickly будет генерировать проекты PyGObject по умолчанию.

Вам также необходимо добавить primary-toolbarв контекст стиля панели инструментов. Вот так:

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

применение этого контекста к примеру вопроса приводит к следующему:

демонстрация

Jjed
источник
Я добавил пример Gtk.Toolbar, который не выглядит темным. Так что я думаю, это не простой Gtk.Toolbar?
xubuntix
Gtk.get_major_version()говорит 3, но я все еще получаю старую панель инструментов. Это после a from gi.repository import Gtkв обоих python2 и python3.
Стефано Палаццо
1
Демонстрация PyGI по ссылке, которую вы разместили, также не содержит их. Может быть, разработчики приложений должны применить стиль самостоятельно?
Стефано Палаццо
Спасибо за то, что все утро бился головой об стену !! следует искать здесь в первую очередь.
0x7c0
5

Что касается второй части вашего вопроса, которая была «Как добавить VBox на панель инструментов», все, что вам нужно сделать, это обернуть его внутри Gtk.ToolItem, например :.

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

Вы можете сделать это проще, создав вспомогательную функцию или расширив Gtk.Toolbar, например:

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

Он просто проверяет, является ли объект, который вы пытаетесь вставить, элементом ToolItem, а если нет, он оборачивает его в один. Пример использования:

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

Он должен выглядеть этот

Войтек Зилинский
источник
1
Для справки, вы можете сделать это и на поляне. GtkToolItem не отображается в палитре виджетов. Вместо этого вам нужно щелкнуть правой кнопкой мыши панель GtkToolbar в дереве объектов и выбрать «Редактировать», чтобы открыть отдельное окно редактирования. Перейдите на вкладку «Иерархия» и добавьте новый объект в иерархию. Тип объекта по умолчанию - «Кнопка», но вы также можете выбрать «Пользовательский». Этот "пользовательский" элемент на самом деле является пустым GtkToolItem. Затем вы можете выбрать этот пустой элемент с помощью обычного интерфейса «гладь» и добавить к нему обычные виджеты. Это позволило мне добавить виджет GtkEntry к GtkToolbar за считанные секунды.
monotasker