Apa widget header hitam di beberapa program?

22

Dalam beberapa program ubuntu (panel kontrol ubuntu, pengaturan sistem), tetapi tidak misalnya dalam banshee, bagian atas jendela berisi elemen dalam nada gelap (dengan tema Ambience). Tetapi saya tidak dapat menemukan widget standar yang melakukan ini secara otomatis.

Apakah semua warna ini diatur dengan tangan (bukan widget + tema standar)? Dan jika mereka diatur dengan tangan, dari mana mereka berasal dalam tema (apa parameter di gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, & warna))?

EDIT: Tampaknya bukan Gtk.Toolbar sederhana. Jika saya menjalankan kode berikut:

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

Saya mendapatkan jendela seperti ini: masukkan deskripsi gambar di sini yang tidak memiliki nada gelap untuk bilah alat.

EDIT2: Meskipun jawaban 'bilah alat dengan konteks khusus' oleh j-johan-edwards benar di sebagian besar program, itu tidak terjadi di panel kontrol ubuntuone. Program ini memiliki GtkVBox yang dapat mencakup berbagai widget (tidak seperti toolbar). Saya masih tidak dapat menentukan bagaimana tema gtk tahu cara melukis bagian jendela itu. masukkan deskripsi gambar di sini

Tetapi bagaimanapun juga: untuk saat ini toolbar sudah cukup bagi saya ...

xubuntix
sumber

Jawaban:

19

Apakah maksud Anda ini?

Bilah Alat GTK3

Mereka hanya Gtk.Toolbars. Alasan beberapa aplikasi seperti Banshee tidak menggunakannya adalah karena mereka belum porting ke GTK + 3 , dan menerima kemampuan tema baru yang memungkinkan toolbar seperti itu.

Untuk port aplikasi Python Anda sendiri ke GTK + 3, Anda perlu menggunakan PyGObject bukan PyGTK. Pada 12,04, Cepat akan menghasilkan proyek PyGObject secara default.

Anda juga perlu menambahkan primary-toolbarkonteks gaya bilah alat. Seperti itu:

toolbar = Gtk.Toolbar()
context = toolbar.get_style_context()
context.add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)

menerapkan konteks itu pada contoh hasil pertanyaan di ini:

demo

Jjed
sumber
Saya menambahkan contoh Gtk.Toolbar yang tidak terlihat gelap. Jadi saya kira itu bukan Gtk.Toolbar sederhana?
xubuntix
Gtk.get_major_version()kata 3, tapi saya masih mendapatkan toolbar lama. Ini setelah from gi.repository import Gtkdi kedua python2 dan python3.
Stefano Palazzo
1
Demo PyGI dari tautan yang Anda poskan tidak memilikinya. Mungkin pengembang aplikasi harus menerapkan penataan sendiri?
Stefano Palazzo
Terima kasih untuk ini telah membenturkan kepalaku ke dinding sepanjang pagi !! harus dicari di sini dulu.
0x7c0
5

Berkenaan dengan bagian kedua dari pertanyaan Anda, yaitu "Bagaimana cara menambahkan VBox ke toolbar", yang harus Anda lakukan adalah membungkusnya di dalam Gtk.ToolItem, misalnya :.

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

Anda dapat membuatnya lebih sederhana dengan membuat fungsi pembantu atau memperluas Gtk.Toolbar, misalnya:

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

Ini hanya memeriksa apakah objek yang Anda coba masukkan adalah ToolItem, dan jika tidak, ia membungkusnya di dalam satu. Contoh penggunaan:

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

Seharusnya terlihat seperti ini

Voitek Zylinski
sumber
1
Sebagai catatan, Anda dapat melakukannya dengan glade juga. GtkToolItem tidak muncul di palet widget. Sebagai gantinya Anda harus mengklik kanan pada GtkToolbar di pohon objek dan pilih "Edit" untuk membuka jendela pengeditan terpisah. Buka tab "Hierarchy" dan tambahkan objek baru ke hierarki. Jenis objek default adalah "Tombol," tetapi Anda juga dapat memilih "kustom." Item "khusus" itu sebenarnya adalah GtkToolItem kosong. Kemudian Anda dapat memilih item kosong itu menggunakan antarmuka senang biasa dan menambahkan widget secara normal. Ini memungkinkan saya untuk menambahkan widget GtkEntry ke GtkToolbar dalam hitungan detik.
monotasker