4

私の英語を許してください。

css ファイルを使用して GtkButton の背景色を変更しようとしていますが、できません。Web で見つけたいくつかの例を試しましたが、どれも機能しません。2つの例を投稿します。1 つは Python 3.2.3 で、もう 1 つは C で、Gtk+ 3.6 と Kubuntu 12.10 を使用しています。

これはそのうちの1つのコードです:

from gi.repository import Gtk, Gdk

class MainWindow(Gtk.Window):
    def __init__(self):
        super().__init__()
        vbox = Gtk.Box(spacing=10,orientation=Gtk.Orientation.VERTICAL)
        self.add(vbox)

        self.entries = [ Gtk.Entry() for i in range(3) ]
        for e in self.entries:
            vbox.pack_start(e, True, True, 0)
            e.connect("changed", self.on_entry_changed)
            e.set_text('123')

        button=Gtk.Button(label='ok')
        vbox.pack_end(button,True,True,0)

    def on_entry_changed(self,entry):
        ctx = entry.get_style_context()
        if not entry.get_text().isnumeric():
            ctx.add_class('invalid')
        else:
            ctx.remove_class('invalid')
cssProvider = Gtk.CssProvider()
cssProvider.load_from_path('style.css')
screen = Gdk.Screen.get_default()
styleContext = Gtk.StyleContext()
styleContext.add_provider_for_screen(screen, cssProvider,
Gtk.STYLE_PROVIDER_PRIORITY_USER) # With the others GTK_STYLE_PROVIDER_PRIORITY values get the same result.

window = MainWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

そしてstyle.css

GtkEntry.invalid {
    background-color: #ffaaaa;
    background: #ffaaaa;
}

GtkButton {
    engine: oxygen-gtk; /*tried also with 'none' and without setting engine*/
    background-color: green;
    background: green;
}

エントリはうまく機能します...背景の色が変わります。しかし、ボタンはなく、エラーメッセージもありません。

EDIT3: (プレビューの編集を削除し、いくつかのタグを変更します) 要約すると... Web で見つけたすべての Python、C、および C++ コードでボタンの色を変更しようとしましたが失敗しました。見つけたすべてのチュートリアルと GTK+ 3 リファレンス マニュアルを読みました。その後、私が知っているのは、問題がKubuntuテーマに関するものであるということだけです.GTKテーマを「oxygen-gtk」から「デフォルト」に変更すると(GTK構成で)、コードがうまく機能することがわかった唯一の方法ですが、これはアイデアではなく、ボタンはひどいものに見えます。

したがって、質問は次のとおりです。

  1. ボタンの背景色を変更できないのはなぜですか?
  2. ボタンだけでこの問題が発生するのはなぜですか? (他のウィジェットとうまく連携します)
  3. ここと GTK フォーラムで、ボタンの色を変更するのは良い方法ではないという回答が得られますが、... この画像 (リンク) のようなメニューが必要な場合はどうすればよいでしょうか (赤いボックスのボタンを参照)。そのための最善の方法はどれですか?

感謝と挨拶!

4

3 に答える 3

5

私はこれがかなり古いことを知っていますが、最初のいくつかの Google 検索結果に表示されたので、私の経験を共有したいと思いました.

Gtk.Button にはボタン テキスト用のインライン Gtk.Label があり、デフォルトではボタンから継承されないため、明示的に指定する必要があります (または、色を指定するだけです)。

GtkButton GtkLabel {
    color: #fff; /* This changes the text color in the button */
}

@sciamp からの回答によると、GTK テーマは背景と境界線の画像も設定するため、background-image: none; border-image: none;Hope を使用して手動で削除する必要があります。

于 2015-07-11T21:42:10.143 に答える
1

これは複雑ですが、直接行うことはできないと思います。

主な理由は、ボタンが背景をレンダリングしないためだと思います。それが行うことは、その領域の周りにフレームをレンダリングしてから、内部の子をレンダリングすることだけです。GtkButton はコンテナーであることに注意してください。通常、テキスト ラベルの GtkLabel を保持しますが、任意のウィジェットを保持できます。

テキスト ラベルの背景色を変更することはできましたが、テキスト自体の周りの非常にタイトなボックスのみが影響を受けます。これは、希望するものではありません。

間接的な解決策は、GtkButton をサブクラス化して、実際に背景をレンダリングするバリアントを作成することです。確かに、これはテーマに対して非常に失礼であり、避けるべきです。

于 2013-02-22T14:54:30.563 に答える