一部のプログラムのブラックヘッダーウィジェットとは何ですか?


22

一部のubuntuプログラム(ubuntuコントロールパネル、システム設定)では、バンシーなどではありませんが、ウィンドウの上部には暗いトーンの要素が含まれています(Ambienceテーマを使用)。しかし、これを自動的に行う標準のウィジェットは見つかりません。

これらの色はすべて(標準のウィジェット+テーマではなく)手動で設定されていますか?そして、それらが手動で設定されている場合、それらはテーマのどこから来ますか(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-themeがどのように知っているのか、まだ判断できません。 ここに画像の説明を入力してください

しかし、とにかく:今のところはツールバーで十分です...

回答:


19

これらのことですか?

GTK3ツールバー

彼らはただですGtk.Toolbar。Bansheeのような一部のアプリケーションがそれらを使用しない理由は、GTK + 3にまだ移植されておらず、そのようなツールバーを有効にする新しいテーマ機能を受け取っているためです。

独自のPythonアプリケーションをGTK + 3に移植するには、PyGTKの代わりにPyGObjectを使用する必要があります。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が、私はまだ古いツールバーを取得しています。これはfrom gi.repository import Gtk、python2とpython3の両方の後です。
ステファノパラッツォ

1
あなたが投稿したリンクのPyGIデモにもそれらはありません。たぶん、アプリ開発者は自分でスタイルを適用する必要がありますか?
ステファノパラッツォ

これに感謝して、朝ずっと頭を壁にぶつけていました!! ここで最初に検索する必要があります。
0x7c0

5

「VBoxをツールバーに追加する方法」である質問の2番目の部分に関しては、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に追加できました。
モノタスカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.