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.