5

私の最近の頭を悩ませているのは、GTK3 を使用して Python3 で愚かな小さなアプリを作成することです。ボタンにはフォググレー以外の色を使用します。これを行う方法について、過去数日間グーグルで検索しましたが、これまでに試したことはすべて失敗しました。失敗しただけでなく、静かに失敗し、何が起こっているのかについての手がかりを与えるエラーメッセージは表示されませんでした。

これは私のテストアプリです:

from gi.repository import Gtk, Gdk

class ButtonWindow(Gtk.Window):

    def __init__(self):
        super().__init__(title="Button Test")
        self.set_border_width(10)
        hbox = Gtk.Box(spacing=10)
        self.add(hbox)
        hbox.set_homogeneous(False)

        # make the button
        button = Gtk.Button('Test Button')
        hbox.pack_start(button, True, True, 0)

        # try to change its colour ....

#        button.modify_base(Gtk.StateType.NORMAL, Gdk.color_parse('green'))
#        button.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0, 1, 0, 1))
#        button.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0x00ff00))
#        button.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("green"))
#        button.modify_bg(Gtk.StateType.ACTIVE, Gdk.color_parse("green"))
#        button.modify_bg(Gtk.StateType.SELECTED, Gdk.color_parse("green"))

        # attempt to change the style ....

#        style = button.get_style().copy()
#        style.bg[Gtk.StateType.NORMAL] = Gdk.color_parse('green')
#        style.bg[Gtk.StateType.ACTIVE] = Gdk.color_parse('red')
#        style.bg[Gtk.StateType.SELECTED] = Gdk.color_parse('blue')
#        style.bg[Gtk.StateType.PRELIGHT] = Gdk.color_parse('black')
#        button.set_style(style)

        # ok, let's try changing the box ....

#        hbox.modify_base(Gtk.StateType.NORMAL, Gdk.color_parse('green'))
#        hbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,1,0,1))
#        hbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0x00ff00ff))
#        hbox.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse('green'))

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

失敗した試みをコメントとして残しておきます。上記のように、アプリケーションに関する限り、上記のバリエーションのいずれもエラー メッセージを生成しないため、機能しているように見えます。しかし、ボタンが古くなった食器の色のままであるため、どれもうまくいかないようです。

参考までに、標準リポジトリからインストールされた python3-gi と python3-gi-cairo を使用して、Ubuntu 12.04 で Python 3.2.3 を使用しています。

誰かが私を正しい方向に向けることができますか?

編集: 以下は、@mike の回答に基づいて作り直された例です。これは機能しますが、いくつかの問題があり、フォローアップの質問で対処される可能性があります。問題は次のとおりです。

  1. background代わりに Ubuntu で使用しなければならないのはなぜbackground-colorですか?
  2. フォントのスタイリングを機能させるにはまだいくつかの問題がありますが、少なくとも今は動作する例があります。
  3. たとえば、テキストやその他の属性に基づいて、さまざまなスタイル/色をさまざまなボタンに適用できますか?

だから、コード: -

from gi.repository import Gtk, Gdk

class ButtonWindow(Gtk.Window):

    def __init__(self):
        super().__init__(title="Button Test")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=10)
        self.add(hbox)
        hbox.set_homogeneous(False)

        # make the button
        button = Gtk.Button('Test Button')
        hbox.pack_start(button, True, True, 0)

# get the style from the css file and apply it
cssProvider = Gtk.CssProvider()
cssProvider.load_from_path('gtkStyledButtonTest.css')
screen = Gdk.Screen.get_default()
styleContext = Gtk.StyleContext()
styleContext.add_provider_for_screen(screen, cssProvider,
                                     Gtk.STYLE_PROVIDER_PRIORITY_USER)

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

css ファイルは次のようになります。

GtkWindow {
    background-color: #0000ff;
}

GtkButton {
    color: #ff0000;
    background: #00ff00;
}

誰かがこれが役立つことを願っています。

4

3 に答える 3

6

これは古い質問ですが、参考のために質問3を参照して回答を追加したいと思います。

GTK3 は、スタイル クラスの概念を追加します。したがって、さまざまな色のボタンを取得するには、名前を直接指定するか、スタイル クラスをそのコンテキストに追加します。これはすべて、マイクが回答で提供したリンクで説明されています。

以下は、スタイル クラスを使用してエントリ内の無効なテキストを強調表示する方法の簡単な例です。

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('ok',name='ok-button')
        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)

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

style.css を使用:

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

GtkButton#ok-button {
    background-color: green;
    background: green;
}
于 2012-12-16T00:25:00.587 に答える
5

GTK3 で推奨される方法は、スタイリングに CSS を使用することです。Ubuntu 12.04 では、background-color の代わりに background を使用する必要がある場合があります。しかし、私はPythonを知らないので、リンクを張るだけです。

https://thegnomejournal.wordpress.com/2011/03/15/styling-gtk-with-css/

于 2012-08-28T01:44:43.777 に答える
0

@boosthに触発されて、これは変更されたコードです(ボタンをラップし、ラッパーに色を適用します-コメント付きの行を参照してください# <----)。

ただし、イベントボックスの色は変わりますが、ボタン自体は同じままです。だから、これは私が探していたものではありませんが、これまでのところこれが最良の答えです。

from gi.repository import Gtk, Gdk

class ButtonWindow(Gtk.Window):

    def __init__(self):
        super().__init__(title="Button Test")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=10)
        self.add(hbox)
        hbox.set_homogeneous(False)

        # make the button
        button = Gtk.Button('Test Button')
        buttonWrapper = Gtk.EventBox()                  # <----
        buttonWrapper.add(button)                       # <----
        hbox.pack_start(buttonWrapper, True, True, 0)   # <----

        # change the colour of the wrapper ....
        buttonWrapper.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("green"))
        buttonWrapper.modify_bg(Gtk.StateType.ACTIVE, Gdk.color_parse("red"))
        buttonWrapper.modify_bg(Gtk.StateType.SELECTED, Gdk.color_parse("blue"))


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

これを行う方法があるはずです...。

于 2012-08-21T01:03:12.480 に答える