简体   繁体   中英

Gtk3+ How to change Gtk.Entry border to a color?

I have a Gtk.Entry and would like to change his border to red whenever the user enter an invalid value. I am using Gtk+3 and Python3. Any inputs on this? I've seen "Gtk.Entry.set_inner_border()" is deprecated for gtk+ > 3.4.

EDIT1:

在此处输入图片说明

It seems that either my Gtk version or my OS don't like colors at all! I also have these 2 lines of code and my buttons don't have any color:

    button1.get_style_context().add_class('suggested-action')
    button2.get_style_context().add_class(Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION)

My Gtk+3 version is 3.18. I guess this is the reason? Would you suggest me to upgrade or use the widget set_color functions?

I'm gonna investigate and in the worst of cases I might use Gtk.Widget.set_background_color which I tested and works fine, even if it does not affect the color of the border but the background of the text. Now I should figure out how to automatically select the text hehe.

Thank you so much anyways José

EDIT2:

No color is displayed with the following lines:

    b_add.get_style_context().add_class('suggested-action')
    b_remove.get_style_context().add_class(Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION)

在此处输入图片说明

Gtk+ 3.x uses CSS to style and theme the widgets. The CSS structure, style classes, did change from 3.0 up to 3.26. This means that it's important to know the version you are using.

With Gtk+ 3.22 you can use the css:

entry { 
    border-color: Red;
}

With Gtk+ 3.18 use:

.entry {
    border-color: Red;
}

Copy this css code to a file called test.css, then use this adapted example from the python gt3 tutorial :

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GObject

class EntryWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Entry Demo")
        self.set_size_request(200, 100)

        self.timeout_id = None

        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)

        self.entry = Gtk.Entry()
        self.entry.set_text("Hello World")
        vbox.pack_start(self.entry, True, True, 0)

        hbox = Gtk.Box(spacing=6)
        vbox.pack_start(hbox, True, True, 0)

        self.check_editable = Gtk.CheckButton("Editable")
        self.check_editable.connect("toggled", self.on_editable_toggled)
        self.check_editable.set_active(True)
        hbox.pack_start(self.check_editable, True, True, 0)

        self.check_visible = Gtk.CheckButton("Visible")
        self.check_visible.connect("toggled", self.on_visible_toggled)
        self.check_visible.set_active(True)
        hbox.pack_start(self.check_visible, True, True, 0)

        self.pulse = Gtk.CheckButton("Pulse")
        self.pulse.connect("toggled", self.on_pulse_toggled)
        self.pulse.set_active(False)
        hbox.pack_start(self.pulse, True, True, 0)

        self.icon = Gtk.CheckButton("Icon")
        self.icon.connect("toggled", self.on_icon_toggled)
        self.icon.set_active(False)
        hbox.pack_start(self.icon, True, True, 0)

    def on_editable_toggled(self, button):
        value = button.get_active()
        self.entry.set_editable(value)

    def on_visible_toggled(self, button):
        value = button.get_active()
        self.entry.set_visibility(value)

    def on_pulse_toggled(self, button):
        if button.get_active():
            self.entry.set_progress_pulse_step(0.2)
            # Call self.do_pulse every 100 ms
            self.timeout_id = GObject.timeout_add(100, self.do_pulse, None)
        else:
            # Don't call self.do_pulse anymore
            GObject.source_remove(self.timeout_id)
            self.timeout_id = None
            self.entry.set_progress_pulse_step(0)

    def do_pulse(self, user_data):
        self.entry.progress_pulse()
        return True

    def on_icon_toggled(self, button):
        if button.get_active():
            icon_name = "system-search-symbolic"
        else:
            icon_name = None
        self.entry.set_icon_from_icon_name(Gtk.EntryIconPosition.PRIMARY,
            icon_name)

win = EntryWindow()
style_provider = Gtk.CssProvider()
style_provider.load_from_path("test.css")

Gtk.StyleContext.add_provider_for_screen(
    Gdk.Screen.get_default(),
    style_provider,
    Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

The result should be similar to this:

在此处输入图片说明

EDIT:

Result on Fedora 23 (Gtk+ 3.18.9):

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM