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


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 знает, как рисовать эту часть окна. введите описание изображения здесь

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

Ответы:


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)

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

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


Я добавил пример 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.