2017-10-13 1 views
1

Ich habe einen Gtk.Entry und möchte seinen Rahmen rot, wenn der Benutzer einen ungültigen Wert eingeben. Ich benutze Gtk + 3 und Python3. Irgendwelche Eingaben dazu? Ich habe gesehen, dass "Gtk.Entry.set_inner_border()" für gtk +> 3.4 veraltet ist.Gtk3 + Wie gtk.Entry Grenze zu einer Farbe ändern?

EDIT1:

enter image description here

Es scheint, dass entweder meine Gtk-Version oder mein OS mag nicht an allen Farben! Ich habe auch diese 2 Zeilen Code und meine Tasten haben keine Farbe:

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

Meine Gtk + 3-Version ist 3.18. Ich schätze, das ist der Grund? Würden Sie mir vorschlagen, das Widget set_color zu aktualisieren oder zu benutzen?

Ich werde untersuchen und in den schlimmsten Fällen könnte ich Gtk.Widget.set_background_color verwenden, die ich getestet habe und gut funktioniert, auch wenn es nicht die Farbe der Grenze aber den Hintergrund des Textes beeinflusst. Jetzt sollte ich herausfinden, wie man automatisch den Text hehe.

Vielen Dank sowieso José

EDIT2:

Keine Farbe mit den folgenden Zeilen angezeigt:

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

enter image description here

+1

Ich habe keine Maschine läuft Gtk + 3.18 aber ich werde Montag haben und kann es überprüfen. Eine andere Möglichkeit ist, [GTK Inspector] (https://wiki.gnome.org/Projects/GTK+/Inspector) auszuführen und zu prüfen, welche CSS-Stilklassen verwendet werden. Versuche es. –

+0

Ich wusste nichts über diesen Debugger. Sieht gut aus. Es sagt, dass die Klasse dieser 2 Knöpfe die ist, die ich spezifizierte. Ich würde gerne die Farben sehen, ich möchte hehe – deko

+0

Hi check my edit. Mit Gtk + 3.18 fügen Sie einfach einen Punkt vor dem Eintrag: '.entry' –

Antwort

1

Gtk + 3.x verwendet CSS Style und theme die Widgets. Die CSS-Struktur, Stilklassen, hat sich von 3.0 auf 3.26 geändert. Das bedeutet, dass es wichtig ist, die von Ihnen verwendete Version zu kennen.

mit Gtk + 3,22 Sie die CSS verwenden können:

entry { 
    border-color: Red; 
} 

mit Gtk + 3.18 Verwendung:

.entry { 
    border-color: Red; 
} 

Kopieren CSS-Code in eine Datei namens test.css, dann ist dieses Beispiel angepasst wurden aus die 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() 

das Ergebnis sollte ähnlich sein:

enter image description here

EDIT:

Ergebnis auf Fedora 23 (GTK + 3.18.9):

enter image description here

+0

Ich bearbeitet meine Frage, um Sie zu beantworten – deko

+0

Hallo José, zuerst danke für die Erinnerung.Ich habe den Punkt hinzugefügt, aber es funktioniert noch nicht. Bist du sicher, dass deine Version die 3.18 ist? Vielleicht prüfe ich meine falsch? Ich glaube, meins ist 3.18.9. Ich führe den Befehl "dpkg -l libgtk2.0-0 libgtk-3-0" – deko

+1

@deko Ja. Ich benutze Fedora 23 mit Gtk + 3.18.9. Ich habe einen Screenshot von Gtk Inspector hinzugefügt. Ich habe auch die CSS-Datei bearbeitet, um es zu testen (test.css) und es funktioniert. –