# -*- coding: utf-8 -*- from kivy.lang import Builder from kivy.uix.modalview import ModalView from kivy.uix.floatlayout import FloatLayout from kivy.uix.boxlayout import BoxLayout from kivymd.button import MDFlatButton, MDIconButton from kivymd.theming import ThemableBehavior from kivymd.elevationbehavior import ElevationBehavior from kivy.properties import ObjectProperty, ListProperty from kivymd.label import MDLabel from kivy.metrics import dp from kivy.utils import get_color_from_hex from kivymd.color_definitions import colors Builder.load_string(""" #:import SingleLineTextField kivymd.textfields.SingleLineTextField #:import MDTabbedPanel kivymd.tabs.MDTabbedPanel #:import MDTab kivymd.tabs.MDTab : size_hint: (None, None) size: dp(260), dp(120)+dp(290) pos_hint: {'center_x': .5, 'center_y': .5} canvas: Color: rgb: app.theme_cls.primary_color Rectangle: size: dp(260), dp(120) pos: root.pos[0], root.pos[1] + root.height-dp(120) Color: rgb: app.theme_cls.bg_normal Rectangle: size: dp(260), dp(290) pos: root.pos[0], root.pos[1] + root.height-(dp(120)+dp(290)) MDFlatButton: pos: root.pos[0]+root.size[0]-dp(72), root.pos[1] + dp(10) text: "Close" on_release: root.dismiss() MDLabel: font_style: "Headline" text: "Change theme" size_hint: (None, None) size: dp(160), dp(50) pos_hint: {'center_x': 0.5, 'center_y': 0.9} MDTabbedPanel: size_hint: (None, None) size: dp(260), root.height-dp(135) pos_hint: {'center_x': 0.5, 'center_y': 0.475} id: tab_panel tab_display_mode:'text' MDTab: name: 'color' text: "Theme Color" BoxLayout: spacing: dp(4) size_hint: (None, None) size: dp(270), root.height # -dp(120) pos_hint: {'center_x': 0.532, 'center_y': 0.89} orientation: 'vertical' BoxLayout: size_hint: (None, None) pos_hint: {'center_x': 0.5, 'center_y': 0.5} size: dp(230), dp(40) pos: self.pos halign: 'center' orientation: 'horizontal' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Red') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Red' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Pink') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Pink' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Purple') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Purple' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('DeepPurple') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'DeepPurple' BoxLayout: size_hint: (None, None) pos_hint: {'center_x': .5, 'center_y': 0.5} size: dp(230), dp(40) pos: self.pos halign: 'center' orientation: 'horizontal' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Indigo') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Indigo' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Blue') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Blue' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('LightBlue') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'LightBlue' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Cyan') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Cyan' BoxLayout: size_hint: (None, None) pos_hint: {'center_x': .5, 'center_y': 0.5} size: dp(230), dp(40) pos: self.pos halign: 'center' orientation: 'horizontal' padding: 0, 0, 0, dp(1) BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Teal') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Teal' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Green') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Green' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('LightGreen') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'LightGreen' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Lime') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Lime' BoxLayout: size_hint: (None, None) pos_hint: {'center_x': .5, 'center_y': 0.5} size: dp(230), dp(40) pos: self.pos orientation: 'horizontal' halign: 'center' padding: 0, 0, 0, dp(1) BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Yellow') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Yellow' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Amber') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Amber' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Orange') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Orange' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('DeepOrange') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'DeepOrange' BoxLayout: size_hint: (None, None) pos_hint: {'center_x': .5, 'center_y': 0.5} size: dp(230), dp(40) #pos: self.pos orientation: 'horizontal' padding: 0, 0, 0, dp(1) BoxLayout: MDIconButton: size: dp(40), dp(40) size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Brown') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Brown' BoxLayout: MDIconButton: size: dp(40), dp(40) pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('Grey') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'Grey' BoxLayout: MDIconButton: size: dp(40), dp(40) #pos: self.pos size_hint: (None, None) canvas: Color: rgba: root.rgb_hex('BlueGrey') Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.primary_palette = 'BlueGrey' BoxLayout: MDIconButton: size: dp(40), dp(40) size_hint: (None, None) canvas: Color: rgba: app.theme_cls.bg_normal Ellipse: size: self.size pos: self.pos disabled: True MDTab: name: 'style' text: "Theme Style" BoxLayout: size_hint: (None, None) pos_hint: {'center_x': .3, 'center_y': 0.5} size: self.size pos: self.pos halign: 'center' spacing: dp(10) BoxLayout: halign: 'center' size_hint: (None, None) size: dp(100), dp(100) pos: self.pos pos_hint: {'center_x': .3, 'center_y': 0.5} MDIconButton: size: dp(100), dp(100) pos: self.pos size_hint: (None, None) canvas: Color: rgba: 1, 1, 1, 1 Ellipse: size: self.size pos: self.pos Color: rgba: 0, 0, 0, 1 Line: width: 1. circle: (self.center_x, self.center_y, 50) on_release: app.theme_cls.theme_style = 'Light' BoxLayout: halign: 'center' size_hint: (None, None) size: dp(100), dp(100) MDIconButton: size: dp(100), dp(100) pos: self.pos size_hint: (None, None) canvas: Color: rgba: 0, 0, 0, 1 Ellipse: size: self.size pos: self.pos on_release: app.theme_cls.theme_style = 'Dark' """) class MDThemePicker(ThemableBehavior, FloatLayout, ModalView, ElevationBehavior): # background_color = ListProperty([0, 0, 0, 0]) time = ObjectProperty() def __init__(self, **kwargs): super(MDThemePicker, self).__init__(**kwargs) def rgb_hex(self, col): return get_color_from_hex(colors[col][self.theme_cls.accent_hue]) if __name__ == "__main__": from kivy.app import App from kivymd.theming import ThemeManager class ThemePickerApp(App): theme_cls = ThemeManager() def build(self): main_widget = Builder.load_string(""" #:import MDRaisedButton kivymd.button.MDRaisedButton #:import MDThemePicker kivymd.theme_picker.MDThemePicker FloatLayout: MDRaisedButton: size_hint: None, None pos_hint: {'center_x': .5, 'center_y': .5} size: 3 * dp(48), dp(48) center_x: self.parent.center_x text: 'Open theme picker' on_release: MDThemePicker().open() opposite_colors: True """) return main_widget ThemePickerApp().run()