Các widget tiêu đề màu đen trong một số chương trình là gì?


22

Trong một số chương trình ubfox (bảng điều khiển ubfox, cài đặt hệ thống), nhưng không, ví dụ như trong banshee, phần trên cùng của cửa sổ chứa các thành phần có tông màu tối (với chủ đề Ambience). Nhưng tôi không thể tìm thấy một widget tiêu chuẩn thực hiện điều này tự động.

Có phải tất cả các màu được đặt bằng tay (thay vì widget + chủ đề tiêu chuẩn) không? Và nếu chúng được đặt bằng tay, chúng đến từ đâu trong chủ đề (các tham số trong gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, & color)) là gì?

EDIT: Nó dường như không phải là một Gtk.Toolbar đơn giản. Nếu tôi chạy đoạn mã sau:

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

Tôi nhận được một cửa sổ như thế này: nhập mô tả hình ảnh ở đây không có tông màu tối cho thanh công cụ.

EDIT2: Mặc dù câu trả lời 'thanh công cụ với ngữ cảnh đặc biệt' của j-johan-edwards là đúng trong hầu hết các chương trình, nhưng đó không phải là trường hợp trong bảng điều khiển ubfoxone. Chương trình này có GtkVBox có thể bao gồm bất kỳ phạm vi tiện ích nào (không giống như thanh công cụ). Tôi vẫn không thể xác định làm thế nào chủ đề gtk biết cách vẽ phần đó của cửa sổ. nhập mô tả hình ảnh ở đây

Nhưng dù sao đi nữa: bây giờ một thanh công cụ là đủ cho tôi ...

Câu trả lời:


19

Ý của bạn là những thứ này?

Thanh công cụ GTK3

Họ chỉ là Gtk.Toolbars. Lý do một số ứng dụng như Banshee không sử dụng chúng là vì chúng chưa được chuyển sang GTK + 3 và đã nhận được các khả năng theo chủ đề mới cho phép các thanh công cụ như vậy.

Để chuyển ứng dụng Python của riêng bạn sang GTK + 3, bạn cần sử dụng PyGObject thay vì PyGTK. Kể từ ngày 12.04, Quickly sẽ tạo các dự án PyGObject theo mặc định.

Bạn cũng cần thêm primary-toolbarvào ngữ cảnh kiểu thanh công cụ. Thích như vậy:

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

áp dụng bối cảnh đó cho ví dụ câu hỏi dẫn đến kết quả này:

bản giới thiệu


Tôi đã thêm một ví dụ về Gtk.Toolbar trông không giống như bóng tối. Vì vậy, tôi đoán nó không phải là một Gtk.Toolbar đơn giản?
xubuntix

Gtk.get_major_version()nói 3, nhưng tôi vẫn nhận được thanh công cụ cũ. Đây là sau một from gi.repository import Gtktrong cả python2 và python3.
Stefano Palazzo

1
Bản demo PyGI từ liên kết bạn đã đăng cũng không có chúng. Có lẽ các nhà phát triển ứng dụng phải tự áp dụng kiểu dáng?
Stefano Palazzo

Cảm ơn vì điều này đã đập đầu tôi vào tường cả buổi sáng !! nên tìm kiếm ở đây đầu tiên.
0x7c0

5

Liên quan đến phần thứ hai của câu hỏi của bạn, đó là "Cách thêm VBox vào thanh công cụ", tất cả những gì bạn phải làm là bọc nó bên trong Gtk.ToolItem, ví dụ :.

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

Bạn có thể làm cho nó đơn giản hơn bằng cách tạo một hàm trợ giúp hoặc mở rộng Gtk.Toolbar, ví dụ:

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

Nó chỉ đơn giản kiểm tra xem đối tượng bạn cố gắng chèn có phải là ToolItem hay không, và nếu không, nó sẽ bọc nó bên trong một đối tượng. Ví dụ sử dụng:

chính

#!/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()

Nó sẽ trông như thế này


1
Đối với bản ghi, bạn cũng có thể làm điều này với glade. GtkToolItem không xuất hiện trong bảng các widget. Thay vào đó, bạn phải nhấp chuột phải vào GtkToolbar trong cây đối tượng và chọn "Chỉnh sửa" để mở một cửa sổ chỉnh sửa riêng. Chuyển đến tab "Phân cấp" và thêm một đối tượng mới vào cấu trúc phân cấp. Loại đối tượng mặc định là "Nút", nhưng bạn cũng có thể chọn "tùy chỉnh". Mục "tùy chỉnh" đó thực tế là một GtkToolItem trống. Sau đó, bạn có thể chọn mục trống đó bằng giao diện vui mừng thông thường và thêm widget vào nó bình thường. Điều này cho phép tôi thêm tiện ích GtkEntry vào GtkToolbar trong vài giây.
đơn điệu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.