Alles so schön bunt hier
| Anke (encarsia) | Auch verfügbar in: English
Schöner klicken mit Cascading Style Sheets
CSS
GTK+-Objekte lassen sich mit Hilfe von CSS im Layout verändern. Meiner unmaßgeblichen Ansicht nach sollte man es damit allerdings nicht übertreiben und das grundlegende Erscheinungsbild dem eingestellten Theme überlassen. Links:
GTK, Python and CSS are an awesome combo - Grundlagen mit Beispiel
Overview of CSS in GTK+ - ausführliche Übersicht mit vielen Beispielen
A GTK+ update - Neuerungen seit GTK+ 3.20
Glade
Mit Glade werden nur die Fenster/Widgets angelegt, in diesem Beispiel vier Levelbars mit Werten Die CSS-Layout-Anweisungen erfolgen dann im Code.
Python
CSS
Layout-Anweisungen erfolgen nach dem Muster
widget [element] { font... color... background... ... }
innerhalb einer String-Variblen, die von der Klasse Gtk.CssProvider()
geladen werden.
Levelbar
Levelbars können, wie bereits im Artikel "Bars" angedeutet, in definierten Wertebereichen unterschiedliche Farben annehmen (um zum Beispiel einen kritischen Ladezustand zu visualisieren). Die vordefinierten Offset-Marker dafür sind:
low
(<=.25)
high
(<=.75)
full
(bis 1)
Die Werte können mit den Funktionen get_offset_value
abgefragt bzw. mit add_offset_value
angelegt oder verändert werden.
Im Beispiel wird der unteren Levelbar ein zusätzlicher Offsetmarker zwischen high
und full
angelegt, deshalb wird beim Wert von 0.8 dort im Gegensatz zur dritten Levelbar nicht der Marker für full
ereicht.
self.bar.add_offset_value("alert", .9)
Listings
Python
#!/usr/bin/python # -*- coding: utf-8 -*- import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk class Handler: def on_window_destroy(self, *args): Gtk.main_quit() class Example: def __init__(self): self.builder = Gtk.Builder() self.builder.add_from_file("07_css.glade") self.builder.connect_signals(Handler()) css = b""" levelbar trough block.filled.low { background-color: green; } levelbar trough block.filled.high { background-color: yellow; } levelbar trough block.filled.alert { background-color: orange; } levelbar trough block.filled.full { background-color: red; } """ #load css stylesheet style_provider = Gtk.CssProvider() style_provider.load_from_data(css) Gtk.StyleContext.add_provider_for_screen( Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) self.bar = self.builder.get_object("lev4") self.bar.add_offset_value("alert", .9) print("low: ", self.bar.get_offset_value("low")) print("high: ", self.bar.get_offset_value("high")) print("alert:", self.bar.get_offset_value("alert")) print("full: ", self.bar.get_offset_value("full")) window = self.builder.get_object("window") window.show_all() def main(self): Gtk.main() x = Example() x.main()
Glade
<?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.20.0 --> <interface> <requires lib="gtk+" version="3.20"/> <object class="GtkWindow" id="window"> <property name="can_focus">False</property> <property name="default_width">400</property> <property name="default_height">150</property> <signal name="destroy" handler="on_window_destroy" swapped="no"/> <child> <object class="GtkBox"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="homogeneous">True</property> <child> <object class="GtkLevelBar" id="lev1"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_top">5</property> <property name="margin_bottom">5</property> <property name="value">0.20000000000000001</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLevelBar" id="lev2"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_top">5</property> <property name="margin_bottom">5</property> <property name="value">0.5</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkLevelBar" id="lev3"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_top">5</property> <property name="margin_bottom">5</property> <property name="value">0.80000000000000004</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">2</property> </packing> </child> <child> <object class="GtkLevelBar" id="lev4"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="margin_top">5</property> <property name="margin_bottom">5</property> <property name="value">0.80000000000000004</property> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">3</property> </packing> </child> </object> </child> <child> <placeholder/> </child> </object> </interface>
Kommentare
Comments powered by Disqus