Графический Интерфейс Python. Библиотека Kivymd. Использование Эффекта Размытия

Приветствую вас, дорогие любители и знатоки.

Питон ! Сегодня, как всегда, мы рассмотрим фреймворк для кроссплатформенной разработки.

Киви и библиотеки виджетов в стиле Google Материал Дизайн для рамок Киви - КивиМД .

В этой статье мы рассмотрим, как это сделать размытие влияние отдельных компонентов пользовательского интерфейса.

Подобный обзор я уже делал в статье Материал Питон.

Пользовательские карты с эффектами OpenGL , но следующий материал несколько сложнее и буквально динамичнее.

Ну, начнём.

И для тех, кто не знаком ни с тем, ни с другим Киви ни с библиотекой КивиМД , позвольте мне кратко напомнить вам:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

Киви представляет собой кроссплатформенную среду с открытым исходным кодом, написанную с использованием Питон/Ситон .

Поддерживает устройства ввода: WM_Touch, WM_Pen, Mac OS X Trackpad Magic Mouse, Mtdev, Linux Kernel HID, TUIO .



Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

КивиМД - третья сторона Открытый исходный код библиотека написана на чистом языке Питон , реализующий набор виджетов в стиле Google Материал Дизайн , для использования с фреймворком Киви .

За пределами экосистемы Киви библиотека не используется.

Текущее состояние — бета-версия.

Основная версия включена GitHub - 1.0.0 Эти два проекта разрабатываются отдельно друг от друга, но так как «из коробки» Киви имеет стандартный «убогий» дизайн виджетов, а современные приложения не терпят серости и всем хочется пользоваться красивыми красотами, люди часто путают Киви И КивиМД, задавая, например, такие вопросы, как «Как мне скомпилировать для моего приложения КивиМД вместо Киви? ", что, конечно, неверно, поскольку КивиМД это всего лишь дополнительные виджеты для фреймворка Киви, реализовано с его помощью.

Эти виджеты никогда не будут включены в стандартную библиотеку.

Киви и не заменит ужасные виджеты по умолчанию Киви, потому что Киви хочет быть на 100% кроссплатформенным и не привязываться к материальному дизайну или чему-то еще, оставляя все на стороне пользователя: хочешь дизайн как у Mac OS — делай как у Mac OS, хочешь дизайн как у Windows — делай это как Windows, хорошие все виджеты Киви настроить легко и быстро.

Итак, наша задача сегодня — создать следующую концепцию экрана:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

Главная цель - размытие эффект для двух текстовых полей.

Я сделал анимированный фон, чтобы подчеркнуть динамику.

Итак, для работы нам понадобится Питон 3.6 - 3.9 (3.10 все еще в разработке Киви ), рамки Киви и библиотека КивиМД .

Давайте установим все это:

  
  
  
  
  
  
  
  
  
  
   

pip install "kivy[base] @ https://github.com/kivy/kivy/archive/master.zip " pip install https://github.com/kivymd/KivyMD/archive/master.zip

Первая команда установит фреймворк Киви мастер-версия, а вторая - библиотечная КивиМД также мастер-версия.

Все.

Мы можем работать.

Давайте откроем консоль и создадим шаблон проекта, используя инструменты КивиМД:

python3.9 -m kivymd.tools.patterns.create_project \ MVC \ /Users/macbookair \ BlurConcept \ python3.9 \ master \ --name_screen BlurConceptScreen

Будет создан проект с шаблоном.

MVC в каталоге /Пользователи/macbookair С именем РазмытиеКонцепция , виртуальная среда и все необходимые зависимости:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

Базовый шаблон проекта KivyMD Подробности об архитектуре проекта, которую предлагается использовать.

КивиМД вы можете прочитать в статье Графический интерфейс Python. Библиотека КивыМД.

Шаблон MVC, эффект параллакса и анимированные слайды контента Откройте проект и удалите, кроме имени правила, все содержимое файла.

Blur_concept_screen.kv — это макет нашего единственного экрана в приложении:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

Blur_concept_screen.kv Давайте посмотрим на готовый экран приложения и выясним, какие элементы пользовательского интерфейса мы можем использовать повторно:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

Я выделил метки и два текстовых поля.

В проекте в каждой директории просмотра для каждого экрана ( Вид ) есть пакет компоненты:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

компоненты для экрана BlurConceptScreenView Давайте создадим два пакета в каталоге компоненты для экрана BlurConceptScreenView — общая метка И заполнить поле - метка и текстовое поле с общими параметрами:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

commonlabel.py:

from kivymd.uix.label import MDLabel class CommonLabel(MDLabel): """It is just a base class for a label with common parameters.""" def __init__(self, **kwargs): super().

__init__(**kwargs) self.color = (1, 1, 1, 1) self.font_style = "H4" self.font_name = "assets/fonts/PlayfairDisplay-Black.otf" self.adaptive_height = True self.markup = True

fillfield.py:

from kivymd.uix.textfield import MDTextField class FillField(MDTextField): """It is just a base class for a text field with common parameters.""" def __init__(self, **kwargs): super().

__init__(**kwargs) self.size_hint_x = None self.width = "320dp" self.mode = "fill" self.fill_color_normal = (1, 1, 1, 0.1) self.fill_color_focus = (1, 1, 1, 0.3)

В файле __init__.py Давайте импортируем эти классы, чтобы потом их можно было импортировать прямо из пакета.

компоненты : компоненты/__init__.py:

from .

fillfield.fill_field import FillField from .

commonlabel.common_label import CommonLabel

Теперь откроем файл с классом представления экрана:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

Blur_concept_screen.py .

и объявим необходимые константы и методы:

from kivy.animation import Animation from kivy.metrics import dp from kivy.properties import NumericProperty from View.base_screen import BaseScreenView from View.BlurConceptScreen.components import FillField, CommonLabel class BlurConceptScreenView(BaseScreenView): """Implements the login start screen in the user application.""" OPACITY = NumericProperty(0) SHIFT_Y = NumericProperty(dp(0)) FIELD_WIDTH = NumericProperty(dp(320)) FIELD_HEIGHT = NumericProperty(dp(52)) PADDING = NumericProperty(dp(24)) def on_enter(self, *args): """ Event called when the screen is displayed: the entering animation is complete. """ animation = Animation(SHIFT_Y=dp(140), d=2, t="in_out_quart") animation.bind(on_complete=self.animation_bg_zoom) animation.start(self) Animation(OPACITY=1, d=3).

start(self) def animation_bg_zoom(self, *args): Animation(height=self.ids.bg.height + self.SHIFT_Y, d=2, t="in_out_quart").

start( self.ids.bg )

Алгоритм прост: в момент появления экрана в методе on_enter используя класс Анимация мы анимируем два поля класса BlurConceptScreen: НЕпрозрачность И SHIFT_Y - прозрачность экранных меток и смещение меток по оси Ю.

Ну а изменения свойств базового класса в одноименном правиле разметки в KV-файле применяются автоматически:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

Blur_concept_screen.kv:

#:import STANDARD_INCREMENT kivymd.material_resources.STANDARD_INCREMENT <BlurConceptScreenView> FitImage: id: bg size_hint_y: None source: "assets/images/bg.jpg" height: root.height + root.SHIFT_Y CommonLabel: x: field_login.x y: root.height - root.SHIFT_Y opacity: root.OPACITY text: "You are\nUp Above the Sky" CommonLabel: x: field_login.x opacity: root.OPACITY font_name: "assets/fonts/PlayfairDisplay-Regular.otf" text: "Get Started Here" y: (field_login.y + root.SHIFT_Y) - (root.PADDING + self.height) FillField: id: field_login opacity: root.OPACITY hint_text: "Login" icon_left: "account" pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] + root.SHIFT_Y / 4 FillField: id: field_password opacity: root.OPACITY hint_text: "Password" icon_left: "lock" pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] - root.SHIFT_Y / 4 CommonLabel: id: lbl_forgot_password opacity: root.OPACITY font_style: "Caption" halign: "center" y: field_password.y - root.PADDING * 2 text: "Forgot Password?" MDFillRoundFlatButton: id: sign_in_button text: "Sign In" opacity: root.OPACITY size_hint_x: None -width: field_password.width pos_hint: {"center_x": .

5} font_size: "24sp" font_name: "assets/fonts/PlayfairDisplay-Black.otf" md_bg_color: .

8, .

8, .

8, 1 text_color: app.theme_cls.primary_color ripple_color: app.theme_cls.primary_color[:-1] + [.

4] y: root.SHIFT_Y CommonLabel: opacity: root.OPACITY font_style: "Caption" font_name: "assets/fonts/PlayfairDisplay-Regular.otf" halign: "center" y: dp(160) - root.SHIFT_Y text: "Don`t have an Account? " \ "[font=assets/fonts/PlayfairDisplay-Black.otf]Sign Up[/font]"

Мы уже можем запустить наш проект и увидеть следующую картину:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

Как мы видим, размытие нет эффекта.

Чтобы добавить эффект, используйте виджет Виджет Эффекта :

#:import STANDARD_INCREMENT kivymd.material_resources.STANDARD_INCREMENT #:import HorizontalBlurEffect kivy.uix.effectwidget.HorizontalBlurEffect #:import VerticalBlurEffect kivy.uix.effectwidget.VerticalBlurEffect #:import effect kivy.uix.effectwidget.EffectWidget <BlurConceptScreenView> FitImage: CommonLabel: CommonLabel: EffectWidget: opacity: root.OPACITY effects: ( \ HorizontalBlurEffect(size=12), \ VerticalBlurEffect(size=12), \ ) canvas.before: StencilPush RoundedRectangle: radius: [10, 10, 0, 0] size: root.FIELD_WIDTH, root.FIELD_HEIGHT pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] + root.SHIFT_Y / 4 RoundedRectangle: size: root.FIELD_WIDTH, root.FIELD_HEIGHT radius: [10, 10, 0, 0] pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] - root.SHIFT_Y / 4 StencilUse canvas.after: StencilUnUse RoundedRectangle: size: root.FIELD_WIDTH, root.FIELD_HEIGHT radius: [10, 10, 0, 0] pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] + root.SHIFT_Y / 4 RoundedRectangle: size: root.FIELD_WIDTH, root.FIELD_HEIGHT radius: [10, 10, 0, 0] pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] - root.SHIFT_Y / 4 StencilPop FitImage: id: bg_blur size_hint_y: None source: "assets/images/bg.jpg" height: root.height + root.SHIFT_Y FillField: FillField: CommonLabel: MDFillRoundFlatButton: CommonLabel:

Виджет Эффекта способный применять к своим потомкам различные графические эффекты с помощью пользовательских шейдеров и OpenGL. Что мы сделали в нашем конкретном случае, чтобы получить размытие Эффект? Мы использовали инструкции по холсту ( холст ), определил для них размер и положение, равные размеру и положению двух текстовых полей, используя трафареты ( ТрафаретPush/StencilUse ) выбрал эти области на холсте и применил размытие эффект в свойствах Виджет Эффекта к фоновому изображению :

EffectWidget: effects: ( \ HorizontalBlurEffect(size=12), \ VerticalBlurEffect(size=12), \ ) canvas.before: .

canvas.after: .

FitImage: id: bg_blur size_hint_y: None source: "assets/images/bg.jpg" height: root.height + root.SHIFT_Y

Теперь нам нужно синхронизировать анимацию фоновых изображений, добавив в метод анимация_bg_zoom в классе представления анимация изображения bg_blur:

class BlurConceptScreenView(BaseScreenView): def animation_bg_zoom(self, *args): Animation(height=self.ids.bg_blur.height + self.SHIFT_Y, d=2, t="in_out_quart").

start( self.ids.bg_blur )

Если мы в разметке KV в файле Blur_concept_screen.kv давай просто уйдем Виджет Эффекта с инструкциями по холсту:

#:import HorizontalBlurEffect kivy.uix.effectwidget.HorizontalBlurEffect #:import VerticalBlurEffect kivy.uix.effectwidget.VerticalBlurEffect #:import effect kivy.uix.effectwidget.EffectWidget <BlurConceptScreenView> EffectWidget: opacity: root.OPACITY effects: ( \ HorizontalBlurEffect(size=12), \ VerticalBlurEffect(size=12), \ ) canvas.before: StencilPush RoundedRectangle: radius: [10, 10, 0, 0] size: root.FIELD_WIDTH, root.FIELD_HEIGHT pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] + root.SHIFT_Y / 4 RoundedRectangle: size: root.FIELD_WIDTH, root.FIELD_HEIGHT radius: [10, 10, 0, 0] pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] - root.SHIFT_Y / 4 StencilUse canvas.after: StencilUnUse RoundedRectangle: size: root.FIELD_WIDTH, root.FIELD_HEIGHT radius: [10, 10, 0, 0] pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] + root.SHIFT_Y / 4 RoundedRectangle: size: root.FIELD_WIDTH, root.FIELD_HEIGHT radius: [10, 10, 0, 0] pos: root.center[0] - root.FIELD_WIDTH / 2, \ root.center[1] - root.SHIFT_Y / 4 StencilPop FitImage: id: bg_blur size_hint_y: None source: "assets/images/bg.jpg" height: root.height + root.SHIFT_Y

.

и запустив проект, мы наглядно увидим, как он работает:

Графический интерфейс Python. Библиотека KivyMD. Использование эффекта размытия

Далее мы просто добавляем на экран все остальные виджеты.

К сожалению, добавить гифки, демонстрирующие пошаговое добавление всех элементов, мне не удалось, потому что новый редактор Хабра просто наотрез отказался загружать любые изображения после последней гифки в статье.

Обидно, но ладно.

Всем спасибо за внимание и до новых встреч! Теги: #Разработка для Linux #Разработка для Windows #python #Разработка мобильных приложений #Разработка для MacOS #kivy #kivymd

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.