7

私はこれを数日間オンとオフでいじっていますが、問題が何であるかを理解できないようです.

基本的に、CSS スタイル宣言を使用して Gtk3 でいくつかの Gtk ウィジェットのスタイルを設定しようとしています。複雑なことは何もありませんが、id/name で特定の要素をターゲットにしようとしています。Gtk.CssProvider() の Gtk ドキュメントには、

#widgetname { background-color: #333333; }

名前が「widgetname」に設定されたウィジェットの有効なセレクターとして機能するはずですが、機能させることができないようです。私は当初、CSS が読み込まれていないと考えていましたが、次のようにトップレベルのウィジェットをターゲットにすることができます。

GtkWindow { background-color: #333; }

スタイルがウィンドウに適用され、背景色が変更されていることがわかります。いくつかの異なるタイプのウィジェット (GtkEventBox、GtkTextView、GtkStatusBar、GtkBox) の ID として名前を使用しようとしましたが、ID ベースのセレクターが機能しないようです。

これは、CSS をロードする方法の短縮されたスニペットです。

css = Gtk.CssProvider()

# css.load_from_file(file)
css.load_from_data('''

GtkWindow {
    background-color: #333;
}

GtkEventBox {
    background-color: #333;
}

#statusbarwrap, #textview_event_wrap, #box1 {
     background-color: #333;
}

''')

style_context = self.get_style_context()
style_context.add_provider(
    css,
    Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

ここにGtkCssProviderのドキュメントがあります https://developer.gnome.org/gtk3/3.7/GtkCssProvider.html

そのページの例 24 (1、2 ページ下にスクロールするだけ) は、#ID セレクターが有効であり、Glade でウィジェットの名前を設定していることを示しています。

どんな助けでも大歓迎です。

4

2 に答える 2

5

以下は完全な例です。Gtk3+CSS での名前と ID の混乱を明確にするためにここに投稿しています。

ドイツ語.py :

# coding: utf-8
from gi.repository import Gtk, Gdk
import time

builder = Gtk.Builder()
builder.add_from_file("german.glade")
builder.connect_signals({"closeApplication": Gtk.main_quit})

screen = Gdk.Screen.get_default()

css_provider = Gtk.CssProvider()
css_provider.load_from_path('german.css')

context = Gtk.StyleContext()
context.add_provider_for_screen(screen, css_provider,
  Gtk.STYLE_PROVIDER_PRIORITY_USER)

window = builder.get_object("applicationwindow1")
window.show_all()

Gtk.main()

ドイツ語.css :

#blackBox {
  background-color: black;
}
#redBox {
  background-color: red;
}
.goldBox {
  background-color: gold;
}

ドイツ語.グレード:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
  <requires lib="gtk+" version="3.0"/>
  <object class="GtkApplicationWindow" id="applicationwindow1">
    <property name="can_focus">False</property>
    <signal name="delete-event" handler="closeApplication" swapped="no"/>
    <child>
      <object class="GtkBox" id="box1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkEventBox" id="blackBox">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <placeholder/>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkEventBox" id="eventbox2">
            <property name="name">redBox</property>
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <placeholder/>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkEventBox" id="eventbox3">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <placeholder/>
            </child>
            <style>
              <class name="goldBox"/>
            </style>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

結果:

ドイツの国旗のように、3 つのボックスが縦に並んでいます。#name は、その ID を持つオブジェクトではなく、一致する「名前」プロパティを持つオブジェクトを参照するため、最初のボックスは黒ではありません。

それを理解するのにしばらく時間がかかりました。私はGtk3自身が初めてです...

于 2015-05-26T22:05:41.943 に答える