В некоторых программах Ubuntu (панель управления Ubuntu, настройки системы), но не, например. в банши, верхняя часть окна содержит элементы темного тона (с темой Ambience). Но я не могу найти стандартный виджет, который делает это автоматически.
Все эти цвета установлены вручную (вместо стандартного виджета + тема)? И если они установлены вручную, откуда они берутся в теме (каковы параметры в gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, & amp; 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 знает, как рисовать эту часть окна.
Но в любом случае: пока мне достаточно панели инструментов ...
Вы имеете в виду эти?
Это просто Gtk.Toolbar
s. Причина, по которой некоторые приложения, такие как 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)
применение этого контекста к примеру вопроса приводит к следующему:
با توجه به قسمت دوم س yourال شما که "نحوه افزودن 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()
به نظر می رسد مانند این