Темы приложения в Gtk+3.x

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Имеется вот такой макет.
В нём работает Gtk.CssProvider.
Имеется меню из трёх тем и три файла CSS.
Может быть кто нибудь подскажет как из функции вытащить данные файлов CSS и "запихать" их в провайдер?
Заранее благодарен.

Код:
#!/usr/bin/env/python3

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk, Gio

class MyWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="sablon")
        
        grid = Gtk.Grid()
        grid.set_column_spacing(10)
        grid.set_row_spacing(10)
        self.add(grid)
        
        self.menubar = Gtk.MenuBar()
        self.menubar.set_hexpand(True)
        self.subMenu1 = Gtk.Menu()
        self.menuTheme = Gtk.MenuItem(label = "Темы")
        self.menubar.append(self.menuTheme)
        self.itemBanan = Gtk.MenuItem(label = "Банан")
        self.itemPerl = Gtk.MenuItem(label = "Жемчуг")
        self.itemBisq = Gtk.MenuItem(label = "Бисквит")
        self.subMenu1.append(self.itemBanan)
        self.subMenu1.append(self.itemPerl)
        self.subMenu1.append(self.itemBisq)
        self.menuTheme.set_submenu(self.subMenu1)
        self.itemBanan.connect("activate", self.themeSwap)
        self.itemPerl.connect("activate", self.themeSwap)
        self.itemBisq.connect("activate", self.themeSwap)
        
        ent1 = Gtk.Entry()
        ent2 = Gtk.Entry()
        ent3 = Gtk.Entry()
        
        grid.attach(self.menubar, 0, 0, 3, 1)
        grid.attach(ent1, 0, 1, 1, 1)
        grid.attach(ent2, 1, 2, 1, 1)
        grid.attach(ent3, 2, 3, 1, 1)
        
        provider = Gtk.CssProvider()
        provider.load_from_file(Gio.File.new_for_path('banan.css'))
        Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

        self.get_style_context().add_class('banan')
        
    def themeSwap(self, event):
        self.itemName = self.subMenu1.get_active()
        if self.itemName == self.itemBanan:
            self.fileName = 'banan.css'
            self.className = 'banan'
        elif self.itemName == self.itemPerl:
            self.fileName = 'perl.css'
            self.className = 'perl'
        elif self.itemName == self.itemBisq:
            self.fileName = 'bisq.css'
            self.className = 'bisq'
        #return(self.fileName, self.className)
        print(self.fileName, self.className)
        
if __name__ == '__main__':
    window = MyWindow()
    window.connect("destroy", Gtk.main_quit)
    window.show_all()
    Gtk.main()
 

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Ответ естественно нашёлся.
Провайдер переносим в функцию.
Только для дефолтной системной темы нужно будет указать путь к теме.
Python:
 def themeSwap(self, event, *args):
        self.itemName = self.subMenu1.get_active()
        if self.itemName == self.itemBanan:
            fileName = 'banan.css'
            className = 'banan'
        elif self.itemName == self.itemPerl:
            fileName = 'perl.css'
            className = 'perl'
        elif self.itemName == self.itemBisq:
            fileName = 'bisq.css'
            className = 'bisq'
        elif self.itemName == self.itemDef:
            fileName = '/usr/share/themes/Adwaita-dark/gtk-3.0/gtk.css'
            className = 'Adwaita-dark'
        provider = Gtk.CssProvider()
        provider.load_from_file(Gio.File.new_for_path(fileName))
        Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
        self.get_style_context().add_class(className)
Здесь -- указан путь для линукс минт(GNOME).
Кому надо -- юзайте.
Сами самодельные CSS файлы вот такие:
CSS:
.bisq {
    background-color: rgb(234, 230, 202);
    color: rgb(50, 20, 20);
    }
Здесь задан только общий цвет фона главного окна.
Остальное добавлять по вкусу.
 

Форум IT Специалистов