일부 프로그램에서 검은 색 헤더 위젯은 무엇입니까?


22

밴시와 같은 일부 우분투 프로그램 (우분투 제어판, 시스템 설정)에서는 창의 상단에 어두운 분위기의 요소가 있습니다 (주변 테마 포함). 그러나이 작업을 자동으로 수행하는 표준 위젯을 찾을 수 없습니다.

이 색상들은 모두 표준 위젯 + 테마 대신 손으로 설정되어 있습니까? 그리고 그들이 직접 설정하면 테마에서 어디에서 왔습니까 (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의 '특별한 맥락을 가진 툴바'답변이 대부분의 프로그램에서 사실이지만, 우분투 온 컨트롤 패널에서는 그렇지 않습니다. 이 프로그램에는 툴바와 달리 다양한 위젯을 포함 할 수있는 GtkVBox가 있습니다. 여전히 gtk- 테마가 윈도우의 해당 부분을 페인트하는 방법을 아는 방법을 결정할 수 없습니다. 여기에 이미지 설명을 입력하십시오

그러나 어쨌든 : 지금은 툴바로 충분합니다 ...

답변:


19

이것들을 의미합니까?

GTK3 툴바

그들은 단지 Gtk.Toolbars입니다. Banshee와 같은 일부 응용 프로그램에서 이러한 응용 프로그램을 사용하지 않는 이유는 아직 GTK + 3으로 이식되지 않았기 때문에 툴바를 활성화하는 새로운 테마 기능을 받았기 때문입니다.

자신의 Python 응용 프로그램을 GTK + 3으로 이식하려면 PyGTK 대신 PyGObject 를 사용해야 합니다 . 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 Gtkpython2와 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
기록을 위해, 당신은 glade로 이것을 할 수 있습니다. 위젯 팔레트에 GtkToolItem이 나타나지 않습니다. 대신 객체 트리에서 GtkToolbar를 마우스 오른쪽 버튼으로 클릭하고 "편집"을 선택하여 별도의 편집 창을 열어야합니다. "계층 구조"탭으로 이동하여 새 개체를 계층 구조에 추가하십시오. 기본 객체 유형은 "버튼"이지만 "custom"을 선택할 수도 있습니다. 이 "맞춤형"항목은 실제로 비어있는 GtkToolItem입니다. 그런 다음 일반 glad 인터페이스를 사용하여 빈 항목을 선택하고 위젯을 정상적으로 추가 할 수 있습니다. 이를 통해 GtkEntry 위젯을 몇 초 만에 GtkToolbar에 추가 할 수있었습니다.
monotasker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.