在某些程序中,黑色标题小部件是什么?


22

在某些ubuntu程序(ubuntu控制面板,系统设置)中,而在女妖等中则没有,窗口的顶部包含深色元素(带有“氛围”主题)。但是我找不到自动执行此操作的标准小部件。

这些颜色都是手工设置的吗(而不是标准的小部件和主题)?并且,如果手动设置它们,它们在主题中来自哪里(gtk_widget_modify_bg(widget,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()

我得到一个这样的窗口: 在此处输入图片说明 工具栏没有暗色调。

EDIT2:尽管在大多数程序中j-johan-edwards的“具有特殊上下文的工具栏”的答案是正确的,但在ubuntuone-control-panel中却并非如此。该程序有一个GtkVBox,它可以包含任何范围的小部件(不同于工具栏)。我仍然无法确定gtk主题如何知道如何绘制窗口的该部分。 在此处输入图片说明

但是无论如何:就我而言,工具栏已经足够...

Answers:


19

你是这些意思吗

GTK3工具栏

他们只是Gtk.Toolbars。诸如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 2011年

Gtk.get_major_version()3,但我仍旧使用旧的工具栏。这是在from gi.repository import Gtkpython2和python3中都在a之后。
Stefano Palazzo

1
您发布的链接中的PyGI演示也没有。也许应用程序开发人员必须自己应用样式?
Stefano Palazzo

谢谢你,整个早晨我的头一直撞在墙上!!应该先在这里搜索。
0x7c0 2012年

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 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.