วิดเจ็ตส่วนหัวสีดำคืออะไรในบางโปรแกรม


22

ในบางโปรแกรมของ ubuntu (แผงควบคุมของ ubuntu, การตั้งค่าระบบ) แต่ไม่เช่นใน banshee ส่วนบนของหน้าต่างจะมีองค์ประกอบในโทนมืด (พร้อมกับชุดรูปแบบ Ambience) แต่ฉันไม่สามารถหาวิดเจ็ตมาตรฐานที่ทำสิ่งนี้โดยอัตโนมัติ

มีการตั้งค่าสีเหล่านี้ด้วยมือ (แทนที่จะเป็นชุดเครื่องมือ + ธีมมาตรฐาน) หรือไม่? และหากตั้งค่าด้วยมือพวกเขามาจากที่ใดในชุดรูปแบบ (พารามิเตอร์ใน gtk_widget_modify_bg คืออะไร (วิดเจ็ต, 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 รู้วิธีการวาดส่วนนั้นของหน้าต่างได้อย่างไร ป้อนคำอธิบายรูปภาพที่นี่

แต่อย่างไรก็ตาม: สำหรับตอนนี้แถบเครื่องมือก็เพียงพอแล้วสำหรับฉัน ...

คำตอบ:


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แต่ฉันยังคงได้รับแถบเครื่องมือเก่า นี่คือหลังจากfrom gi.repository import Gtkในทั้ง python2 และ python3
Stefano Palazzo

1
ตัวอย่าง PyGI จากลิงก์ที่คุณโพสต์นั้นไม่มีทั้งคู่ ผู้พัฒนาแอพอาจจะต้องใช้สไตล์ของตัวเองเหรอ?
Stefano Palazzo

ขอบคุณสำหรับสิ่งนี้ต่อสู้หัวของฉันกับกำแพงทุกเช้า !! ควรค้นหาที่นี่ก่อน
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 ไม่ปรากฏในชุดเครื่องมือ แต่คุณต้องคลิกขวาที่ GtkToolbar ในแผนผังวัตถุและเลือก "แก้ไข" เพื่อเปิดหน้าต่างแก้ไขแยกต่างหาก ไปที่แท็บ "ลำดับชั้น" และเพิ่มวัตถุใหม่ลงในลำดับชั้น ประเภทวัตถุเริ่มต้นคือ "ปุ่ม" แต่คุณสามารถเลือก "กำหนดเอง" ได้ รายการ "กำหนดเอง" นั้นอันที่จริงแล้วเป็น GtkToolItem ที่ว่างเปล่า จากนั้นคุณสามารถเลือกรายการที่ว่างเปล่าโดยใช้อินเตอร์เฟซดีใจปกติและเพิ่มวิดเจ็ตไปตามปกติ สิ่งนี้ทำให้ฉันสามารถเพิ่มวิดเจ็ต GtkEntry ใน GtkToolbar ได้ในไม่กี่วินาที
monotasker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.