Що таке віджет чорного заголовка в деяких програмах?


22

У деяких програмах ubuntu (панель керування ubuntu, системні налаштування), але не, наприклад, у banshee, у верхній частині вікна містяться елементи темного тону (з темою Ambience). Але я не можу знайти стандартний віджет, який робить це автоматично.

Чи всі ці кольори встановлені вручну (замість стандартного віджета + теми)? І якщо вони встановлені вручну, звідки вони беруться в темі (які параметри в gtk_widget_modify_bg (віджет, GTK_STATE_NORMAL і колір))?

EDIT: Схоже, це не простий панель Gtk.Tool. Якщо я запускаю такий код:

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

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

EDIT2: Хоча відповідь "j-johan-edwards" на панелі інструментів із спеціальним контекстом справедлива у більшості програм, це не так у панелі управління ubuntuone. Ця програма має GtkVBox, який може включати будь-який діапазон віджетів (на відміну від панелі інструментів). Я досі не можу визначити, як gtk-тема знає, як намалювати цю частину вікна. введіть тут опис зображення

Але все одно: наразі мені достатньо панелі інструментів ...

Відповіді:


19

Ви це маєте на увазі?

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

Вони просто Gtk.Toolbars. Причина, що деякі програми, такі як Banshee, не використовують їх, - це те, що вони ще не перенеслися на GTK + 3 , і отримали нові можливості тематизації, що дозволяють увімкнути подібні панелі інструментів.

Щоб перенести свій власний додаток Python на GTK + 3, вам потрібно використовувати PyGObject замість PyGTK. Станом на 12.04, Швидко генеруватиме проекти 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 не відображається в палітрі віджетів. Натомість вам потрібно клацнути правою кнопкою миші на панелі GtkTool у дереві об’єктів та вибрати "Редагувати", щоб відкрити окреме вікно редагування. Перейдіть на вкладку «Ієрархія» та додайте новий об’єкт до ієрархії. Типовим типом об'єкта є "Кнопка", але ви також можете вибрати "користувацький". Цей "користувацький" елемент насправді порожній GtkToolItem. Тоді ви можете вибрати цей порожній елемент за допомогою звичайного інтерфейсу радості та додати до нього віджети звичайно. Це дозволило мені додати віджет GtkEntry до панелі GtkTool за лічені секунди.
одноосібник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.