{"id":313181,"date":"2020-11-15T21:01:45","date_gmt":"2020-11-15T21:01:45","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=313181"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=313181","title":{"rendered":"\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0437\u0430\u0439\u043d. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u0432 Kivy"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ai\/dq\/vu\/aidqvupj-e1iykvvmkk7nzncvqe.png\"><\/div>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0432\u0441\u0435\u0445 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0437\u043d\u0430\u0442\u043e\u043a\u043e\u0432 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Python!<br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f\u043c\u0438 \u0432 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 <a href=\"https:\/\/github.com\/kivy\/kivy\" rel=\"nofollow\">Kivy<\/a> \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 <i>Google Material Design<\/i> \u2014 <a href=\"https:\/\/github.com\/kivymd\/KivyMD\" rel=\"nofollow\">KivyMD<\/a>. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Kivy \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 material \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043e\u0434\u043d\u0438\u043c \u044d\u043a\u0440\u0430\u043d\u043e\u043c \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439. \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c GIF \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u043a\u043e\u0444\u0435 \u0438 \u043f\u043e\u0433\u043d\u0430\u043b\u0438!<a name=\"habracut\"><\/a><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043e\u0433\u0440\u0435\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u044f \u0445\u043e\u0447\u0443 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432 \u0438\u0442\u043e\u0433\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/j7\/uh\/_u\/j7uh_u6wqnipiz_yubskpo13-1a.gif\"><\/div>\n<p>  \u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Kivy:<\/p>\n<pre><code class=\"bash\">pip install kivy <\/code><\/pre>\n<p>  \u0418 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 KivyMD, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0432 \u0441\u0442\u0438\u043b\u0435 Material Design \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Kivy:<\/p>\n<pre><code class=\"bash\">pip install https:\/\/github.com\/kivymd\/KivyMD\/archive\/master.zip <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u043a \u0440\u0430\u0431\u043e\u0442\u0435! \u041e\u0442\u043a\u0440\u043e\u0435\u043c <i>PyCharm<\/i> \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 <i>CallScreen<\/i> \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043a\u0430\u0442\u043e\u043b\u043e\u0433\u043e\u0432:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pf\/xw\/rb\/pfxwrbxjmtzfdiksivpfktm0vxw.png\"><\/div>\n<p>  \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u043b\u044e\u0431\u0430\u044f. \u041d\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Kivy, \u043d\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 KivyMD \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439, \u043a\u0440\u043e\u043c\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <i>main.py<\/i>. \u042d\u0442\u043e \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vo\/_k\/zy\/vo_kzyyhodu1ieztuze8ilu4i44.png\"><\/div>\n<p>  \u0412 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 <i>data\/images<\/i> \u044f \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e:  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<tbody>\n<tr>\n<td>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/m7\/_a\/ka\/m7_aka7vqs0opi-ic46idbc5mtu.jpeg\"><\/div>\n<\/td>\n<td>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/3j\/xm\/sa\/3jxmsamez7voybrrbo0il5loqps.jpeg\"><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  \u0412 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <i>uix\/screens\/baseclass<\/i> \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b <i>callscreen.py<\/i> \u0441 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u044b\u043c Python \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/p3\/m1\/a3\/p3m1a3kehihlb7d1e3v9iprqx8s.png\"><\/div>\n<p>  \u0410 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <i>uix\/screens\/kv<\/i> \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <i>callscreen.kv<\/i> (\u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0443\u0441\u0442\u044b\u043c) \u2014 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c UI \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c DSL \u044f\u0437\u044b\u043a\u0435 <a href=\"https:\/\/kivy.org\/doc\/stable\/guide\/lang.html\" rel=\"nofollow\">Kivy Language<\/a>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wr\/cw\/hy\/wrcwhy8-hr_xjodilwbutfgtn8u.png\"><\/div>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u043d, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b <i>callscreen.py<\/i> \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u044d\u043a\u0440\u0430\u043d\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <b>callscreen.py:<\/b><\/p>\n<pre><code class=\"python\">import os  from kivy.lang import Builder  from kivymd.uix.screen import MDScreen  # \u0427\u0438\u0442\u0430\u0435\u043c \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c KV \u0444\u0430\u0439\u043b with open(os.path.join(os.getcwd(), &quot;uix&quot;, &quot;screens&quot;, &quot;kv&quot;, &quot;callscreen.kv&quot;), encoding=&quot;utf-8&quot;) as KV:     Builder.load_string(KV.read())   class CallScreen(MDScreen):     pass <\/code><\/pre>\n<p>  \u041a\u043b\u0430\u0441\u0441 <i>CallScreen<\/i> \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d \u043e\u0442 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 <i>MDScreen<\/i> \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 KivyMD (\u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <i>MD<\/i> \u2014 Material Design). <a href=\"https:\/\/kivymd.readthedocs.io\/en\/latest\/components\/screen\/\" rel=\"nofollow\">MDScreen<\/a> \u2014 \u044d\u0442\u043e \u0430\u043d\u0430\u043b\u043e\u0433 \u0432\u0438\u0434\u0436\u0435\u0442\u0430 <i>Screen<\/i> \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Kivy \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f <a href=\"https:\/\/kivy.org\/doc\/stable\/api-kivy.uix.screenmanager.html\" rel=\"nofollow\">kivy.uix.screenmanager<\/a>, \u043d\u043e \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. \u0422\u0430\u043a\u0436\u0435 MDScreen \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u044b \u043e\u0434\u0438\u043d \u043d\u0430\u0434 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/c_\/40\/0l\/c_400lso-3wpzuwtomq9gatkkdo.gif\"><\/div>\n<p>  \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044f \u00ab\u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0438\u0435\u00bb \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435.<\/p>\n<p>  \u0412 \u0442\u043e\u0447\u043a\u0435 \u0432\u0445\u043e\u0434\u0430 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u0444\u0430\u0439\u043b <i>main.py<\/i> \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 <i>TestCallScreen<\/i>, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <i>MDApp<\/i> \u0441 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>build<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442 \u0438\u043b\u0438 \u043b\u0430\u0439\u043e\u0443\u0442, \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 \u043a\u043b\u0430\u0441\u0441 \u044d\u043a\u0440\u0430\u043d\u0430 <i>CallScreen<\/i>.<\/p>\n<p>  <b>main.py:<\/b><\/p>\n<pre><code class=\"python\">from kivymd.app import MDApp  from uix.screens.baseclass.callscreen import CallScreen   class TestCallScreen(MDApp):     def build(self):         return CallScreen()   TestCallScreen().run() <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u044d\u043a\u0440\u0430\u043d. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0444\u0430\u0439\u043b <i>main.py<\/i>, \u0443\u0432\u0438\u0434\u0438\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/f5\/dn\/73\/f5dn73dbgdknpcwtycejmt7zflw.png\"><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0435 UI \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b\u0435 <i>callscreen.kv<\/i>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u043e\u0435 \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0438 \u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c Python \u043a\u043b\u0430\u0441\u0441 c \u0438\u043c\u0435\u043d\u0435\u043c <i>CallScreen<\/i>, \u0442\u043e \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432 KV \u0444\u0430\u0439\u043b\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u0438\u043c\u044f. \u0425\u043e\u0442\u044f \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0434\u0435, \u043d\u043e \u044d\u0442\u043e, \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435:<\/p>\n<pre><code class=\"json\">MyRootWidget:      BoxLayout:          Button:          Button: <\/code><\/pre>\n<p>  \u0418 \u0430\u043d\u0430\u043b\u043e\u0433 \u043d\u0430 Python:<\/p>\n<pre><code class=\"python\">root = MyRootWidget() box = BoxLayout() box.add_widget(Button()) box.add_widget(Button()) root.add_widget(box) <\/code><\/pre>\n<p>  \u0421\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0434\u0435\u0440\u0435\u0432\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u0435\u0435 \u0432 Kv Language, \u0447\u0435\u043c \u0432 Python \u043a\u043e\u0434\u0435. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0443 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432, \u0432\u0430\u0448 Python \u043a\u043e\u0434 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u043b\u043e\u0448\u043d\u043e\u0439 \u043a\u0430\u0448\u0435\u0439 \u0438 \u0443\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043d\u044c \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0442\u043e \u0431\u044b \u0447\u0442\u043e \u043d\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u043d\u043e \u0435\u0441\u043b\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b UI \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u044d\u0442\u043e \u043f\u043b\u044e\u0441. \u041d\u0443, \u0430 \u0432 Kivy \u044d\u0442\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043f\u043b\u044e\u0441, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 Kv Language \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 Python.<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u043d\u0430\u0447\u043d\u0435\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441 \u0442\u0438\u0442\u0443\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">&lt;CallScreen&gt;      FitImage:         id: title_image  # id \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0436\u0435\u0442\u0443         size_hint_y: .45  # \u0432\u044b\u0441\u043e\u0442\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (45% \u043e\u0442 \u0432\u044b\u0441\u043e\u0442\u044b \u044d\u043a\u0440\u0430\u043d\u0430)         # \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 root \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441.         # \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e &lt;class 'uix.screens.baseclass.callscreen.CallScreen'&gt;,         # \u0430 self - \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430 - &lt;kivymd.utils.fitimage.FitImage object&gt;.         y: root.height - self.height  # \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0441\u0438 Y         source: &quot;data\/images\/avatar.jpg&quot;  # \u043f\u0443\u0442\u044c \u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e <\/code><\/pre>\n<p>  \u0412\u0438\u0434\u0436\u0435\u0442 <a href=\"https:\/\/kivymd.readthedocs.io\/en\/latest\/api\/kivymd\/utils\/fitimage\/\" rel=\"nofollow\">FitImage<\/a> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0441\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pd\/eq\/gj\/pdeqgjklraggvs0_rxi17ywpc-i.gif\"><\/div>\n<p>  \u041c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0444\u0430\u0439\u043b <i>main.py<\/i> \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vf\/fv\/o3\/vffvo3pjzbdan6bkinjymku0ko0.png\"><\/div>\n<p>  \u041f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u044d\u043a\u0440\u0430\u043d \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u044b \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0438\u0437 Python \u043a\u043b\u0430\u0441\u0441\u0430 <i>CallScreen<\/i>:<\/p>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">#:import get_color_from_hex kivy.utils.get_color_from_hex #:import colors kivymd.color_definitions.colors   &lt;CallScreen&gt;      FitImage:         [...]      MDFloatingActionButton:         icon: &quot;phone&quot;         x: root.width - self.width - dp(20)         y: app.root.height * 45 \/ 100 + self.height \/ 2         md_bg_color: get_color_from_hex(colors[&quot;Green&quot;][&quot;A700&quot;])         on_release:             # \u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0442\u0438\u0442\u0443\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.             root.animation_title_image(title_image); \\             root.open_call_box = True if not root.open_call_box else False <\/code><\/pre>\n<p>  \u0418\u043c\u043f\u043e\u0440\u0442\u044b \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 Kv Language:<\/p>\n<pre><code class=\"json\">#:import get_color_from_hex kivy.utils.get_color_from_hex #:import colors kivymd.color_definitions.colors <\/code><\/pre>\n<p>  \u0411\u0443\u0434\u0443\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c \u0432 Python \u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\"># \u041c\u0435\u0442\u043e\u0434 get_color_from_hex \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430 # \u0438\u0437 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 rgba. from kivy.utils import get_color_from_hex # \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u043e\u0442\u0442\u0435\u043d\u043a\u043e\u0432 \u0446\u0432\u0435\u0442\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c: # # colors = { #     &quot;Red&quot;: { #         &quot;50&quot;: &quot;FFEBEE&quot;, #         &quot;100&quot;: &quot;FFCDD2&quot;, #         ..., #     }, #     &quot;Pink&quot;: { #         &quot;50&quot;: &quot;FCE4EC&quot;, #         &quot;100&quot;: &quot;F8BBD0&quot;, #         ..., #     }, #     ... # } # # https:\/\/kivymd.readthedocs.io\/en\/latest\/themes\/color-definitions\/ from kivymd.color_definitions import colors <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/q3\/fx\/ms\/q3fxmszgwljtcausnonpsyqqd5u.png\"><\/div>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u0437\u0435\u043b\u0435\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u2014 <i>AttributeError: &#8216;CallScreen&#8217; object has no attribute &#8216;animation_title_image&#8217;<\/i>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0431\u0430\u0437\u043e\u0432\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 <i>CallScreen<\/i> \u0432 \u0444\u0430\u0439\u043b\u0435 <i>callscreen.py<\/i> \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 \u043d\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <i>animation_title_image<\/i>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u0442\u0443\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>  <b>callscreen.py:<\/b><\/p>\n<pre><code class=\"python\"># \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432. from kivy.animation import Animation  [...]  class CallScreen(MDScreen):     # \u0424\u043b\u0430\u0433 \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e.     open_call_box = False      def animation_title_image(self, title_image):         &quot;&quot;&quot;         :type title_image: &lt;kivymd.utils.fitimage.FitImage object&gt;         &quot;&quot;&quot;          if not self.open_call_box:             # \u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u0442\u0443\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u0435\u0441\u044c \u044d\u043a\u0440\u0430\u043d.             Animation(size_hint_y=1, d=0.6, t=&quot;in_out_quad&quot;).start(title_image)         else:             # \u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0442\u0438\u0442\u0443\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e.             Animation(size_hint_y=0.45, d=0.6, t=&quot;in_out_quad&quot;).start(title_image) <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u043b\u0438, \u043a\u043b\u0430\u0441\u0441 <a href=\"https:\/\/kivy.org\/doc\/stable\/api-kivy.animation.html\" rel=\"nofollow\">Animation<\/a>, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043a\u0430\u043a \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445, \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <i>size_hint_y<\/i> \u2014 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u0432\u044b\u0441\u043e\u0442\u044b, \u0437\u0430\u0434\u0430\u0432\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <i>d<\/i> \u2014 duration \u0438 \u0442\u0438\u043f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <i>t<\/i> \u2014 type. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430, \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 <i>+<\/i>, <i>+=<\/i>\u2026 \u041d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b. \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u043e\u0439 \u0433\u0438\u0444\u043a\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0442\u0438\u043f\u044b \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 <i>in_elastic<\/i> \u0438 <i>out_elastic<\/i>:  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<tbody>\n<tr>\n<td>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/t5\/if\/im\/t5ifimdgximer0fkmflv1szyp6y.gif\"><\/div>\n<\/td>\n<td>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/oi\/yp\/mg\/oiypmguxu7qhauigeyauikajy0s.gif\"><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0448 \u0448\u0430\u0433 \u2014 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c blur \u044d\u0444\u0444\u0435\u043a\u0442 \u043a \u0442\u0438\u0442\u0443\u043b\u044c\u043d\u043e\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e. \u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0432 Kivy \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"https:\/\/kivy.org\/doc\/stable\/api-kivy.uix.effectwidget.html\" rel=\"nofollow\">EffectWidget<\/a>. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0438\u0434\u0436\u0435\u0442 \u0442\u0438\u0442\u0443\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 EffectWidget.<\/p>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">#:import effect kivy.uix.effectwidget.EffectWidget #:import HorizontalBlurEffect kivy.uix.effectwidget.HorizontalBlurEffect #:import VerticalBlurEffect kivy.uix.effectwidget.VerticalBlurEffect #:import get_color_from_hex kivy.utils.get_color_from_hex  #:import colors kivymd.color_definitions.colors   &lt;CallScreen&gt;      EffectWidget:         effects:             # blur_value \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f.             (\\             HorizontalBlurEffect(size=root.blur_value), \\             VerticalBlurEffect(size=root.blur_value), \\             )          FitImage:             [...]      MDFloatingActionButton:         [...]         on_release:             # \u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 blur \u044d\u0444\u0444\u0435\u043a\u0442\u0430.             root.animation_blur_value(); \\             [...] <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <i>blur_value<\/i> \u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Python <i>CallScreen<\/i> \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <i>animation_blur_value<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f.<\/p>\n<p>  <b>callscreen.py:<\/b><\/p>\n<pre><code class=\"python\">from kivy.properties import NumericProperty [...]   class CallScreen(MDScreen):     # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044f \u0434\u043b\u044f EffectWidget.     blur_value = NumericProperty(0)      [...]      def animation_blur_value(self):         if not self.open_call_box:             Animation(blur_value=15, d=0.6, t=&quot;in_out_quad&quot;).start(self)         else:             Animation(blur_value=0, d=0.6, t=&quot;in_out_quad&quot;).start(self) <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2i\/wc\/0e\/2iwc0eontpo4swwul8l0m7rg_tc.gif\"><\/div>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u0443\u0435\u043c \u0437\u0435\u043b\u0435\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043d\u0435 \u043c\u043e\u0437\u043e\u043b\u0438\u043b\u0430 \u043d\u0430\u043c \u0433\u043b\u0430\u0437\u0430.<\/p>\n<p>  <b>callscreen.py:<\/b><\/p>\n<pre><code class=\"python\">from kivy.utils import get_color_from_hex from kivy.core.window import Window  from kivymd.color_definitions import colors  [...]   class CallScreen(MDScreen):     [...]      def animation_call_button(self, call_button):         if not self.open_call_box:             Animation(                 x=self.center_x - call_button.width \/ 2,                 y=dp(40),                 md_bg_color=get_color_from_hex(colors[&quot;Red&quot;][&quot;A700&quot;]),                 d=0.6,                 t=&quot;in_out_quad&quot;,             ).start(call_button)         else:             Animation(                 y=Window.height * 45 \/ 100 + call_button.height \/ 2,                 x=self.width - call_button.width - dp(20),                 md_bg_color=get_color_from_hex(colors[&quot;Green&quot;][&quot;A700&quot;]),                 d=0.6,                 t=&quot;in_out_quad&quot;,             ).start(call_button) <\/code><\/pre>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">[...]  &lt;CallScreen&gt;      EffectWidget:         [...]          FitImage:             [...]      MDFloatingActionButton:         [...]         on_release:             # \u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u0430.             root.animation_call_button(self); \\             [...] <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/oz\/cd\/_8\/ozcd_8a4kbe8ntcurn83duqpeoa.gif\"><\/div>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u0432\u0430 \u043f\u0443\u043d\u043a\u0438\u0430 \u0442\u0438\u043f\u0430 <a href=\"https:\/\/kivymd.readthedocs.io\/en\/latest\/components\/list\/#twolineavatarlistitem\" rel=\"nofollow\">TwoLineAvatarListItem<\/a> \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d.<\/p>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">#:import STANDARD_INCREMENT kivymd.material_resources.STANDARD_INCREMENT #:import IconLeftWidget kivymd.uix.list.IconLeftWidget  [...]   &lt;ItemList@TwoLineAvatarListItem&gt;     icon: &quot;&quot;     font_style: &quot;Caption&quot;     secondary_font_style: &quot;Caption&quot;     height: STANDARD_INCREMENT      IconLeftWidget:         icon: root.icon   &lt;CallScreen&gt;      EffectWidget:         [...]          FitImage:             [...]      MDBoxLayout:         id: list_box         orientation: &quot;vertical&quot;         adaptive_height: True         y: root.height * 45 \/ 100 - self.height \/ 2          ItemList:             icon: &quot;phone&quot;             text: &quot;Phone&quot;             secondary_text: &quot;123 456 789&quot;          ItemList:             icon: &quot;mail&quot;             text: &quot;Email&quot;             secondary_text: &quot;kivydevelopment@gmail.com&quot;      MDFloatingActionButton:         [...]         on_release:             root.animation_list_box(list_box); \\             [...] <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cq\/jh\/5n\/cqjh5nb9clot2t50jno-phrn9iw.png\"><\/div>\n<p>  \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u0432\u0430 \u043f\u0443\u043d\u043a\u0442\u0430 <i>ItemList<\/i> \u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u0438\u0445 \u0432 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0431\u043e\u043a\u0441\u0435. \u041c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <i>animation_list_box<\/i> \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <i>CallScreen<\/i> \u0434\u043b\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u043a\u0441\u0430.<\/p>\n<p>  <b>callscreen.py:<\/b><\/p>\n<pre><code class=\"python\">[...]   class CallScreen(MDScreen):     [...]      def animation_list_box(self, list_box):         if not self.open_call_box:             Animation(                 y=-list_box.y,                 opacity=0,                 d=0.6,                 t=&quot;in_out_quad&quot;\u0431             ).start(list_box)         else:             Animation(                 y=self.height * 45 \/ 100 - list_box.height \/ 2,                 opacity=1,                 d=0.6,                 t=&quot;in_out_quad&quot;,             ).start(list_box) <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zl\/at\/61\/zlat619tqx5vewsbzlyhka5ziqi.gif\"><\/div>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u044d\u043a\u0440\u0430\u043d.<\/p>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">[...]  &lt;CallScreen&gt;      EffectWidget:         [...]          FitImage:             [...]      MDToolbar:         y: root.height - self.height - dp(20)         md_bg_color: 0, 0, 0, 0         opposite_colors: True         title: &quot;Profile&quot;         left_action_items:  [[&quot;menu&quot;, lambda x: x]]         right_action_items: [[&quot;dots-vertical&quot;, lambda x: x]]      MDBoxLayout:         [...]          ItemList:             [...]          ItemList:             [...]      MDFloatingActionButton:         [...] <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jl\/nv\/pb\/jlnvpbuoo8m4usampsmwqhn5mv0.png\"><\/div>\n<p>  \u0410\u0432\u0430\u0442\u0430\u0440 \u0438 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">[...]  &lt;CallScreen&gt;      EffectWidget:         [...]          FitImage:             [...]      MDToolbar:         [...]      MDFloatLayout:         id: round_avatar         size_hint: None, None         size: &quot;105dp&quot;, &quot;105dp&quot;         md_bg_color: 1, 1, 1, 1         radius: [self.height \/ 2,]         y: root.height * 45 \/ 100 + self.height         x: root.center_x - (self.width + user_name.width + dp(20)) \/ 2          FitImage:             size_hint: None, None             size: &quot;100dp&quot;, &quot;100dp&quot;             mipmap: True             source: &quot;data\/images\/round-avatar.jpg&quot;             radius: [self.height \/ 2,]             pos_hint: {&quot;center_x&quot;: .5, &quot;center_y&quot;: .5}             mipmap: True      MDLabel:         id: user_name         text: &quot;Irene&quot;         font_style: &quot;H3&quot;         bold: True         size_hint: None, None         -text_size: None, None         size: self.texture_size         theme_text_color: &quot;Custom&quot;         text_color: 1, 1, 1, 1         y: round_avatar.y + self.height \/ 2         x: round_avatar.x + round_avatar.width + dp(20)      MDBoxLayout:         [...]          ItemList:             [...]          ItemList:             [...]      MDFloatingActionButton:         root.animation_round_avatar(round_avatar, user_name); \\         root.animation_user_name(round_avatar, user_name); \\         [...] <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tv\/qo\/8b\/tvqo8b4qa7fvthytafhpt8hwqno.png\"><\/div>\n<p>  \u0422\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 <i>X<\/i> \u0438 <i>Y<\/i> \u0430\u0432\u0430\u0442\u0430\u0440\u0430 \u0438 \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>  <b>callscreen.py:<\/b><\/p>\n<pre><code class=\"python\">[...]   class CallScreen(MDScreen):     [...]      def animation_round_avatar(self, round_avatar, user_name):         if not self.open_call_box:             Animation(                 x=self.center_x - round_avatar.width \/ 2,                 y=round_avatar.y + dp(50),                 d=0.6,                 t=&quot;in_out_quad&quot;,             ).start(round_avatar)         else:             Animation(                 x=self.center_x - (round_avatar.width + user_name.width + dp(20)) \/ 2,                 y=self.height * 45 \/ 100 + round_avatar.height,                 d=0.6,                 t=&quot;in_out_quad&quot;,             ).start(round_avatar)      def animation_user_name(self, round_avatar, user_name):         if not self.open_call_box:             Animation(                 x=self.center_x - user_name.width \/ 2,                 y=user_name.y - STANDARD_INCREMENT,                 d=0.6,                 t=&quot;in_out_quad&quot;,             ).start(self.ids.user_name)         else:             Animation(                 x=round_avatar.x + STANDARD_INCREMENT,                 y=round_avatar.center_y - user_name.height - dp(20),                 d=0.6,                 t=&quot;in_out_quad&quot;,             ).start(user_name) <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jf\/au\/qb\/jfauqbhvak4p0gi7gi0y_vx9z10.gif\"><\/div>\n<p>  \u041d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u043a\u0441 \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/dl\/hh\/ur\/dlhhur0-8ng9fnwrfdtpq7o-5gs.png\"><\/div>\n<p>  \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 KivyMD \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u043e\u0441\u044c <a href=\"https:\/\/kivymd.readthedocs.io\/en\/latest\/components\/button\/\" rel=\"nofollow\">\u043d\u0443\u0436\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438<\/a>. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e-\u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443 \u0441\u043c\u0430\u0441\u0442\u0435\u0440\u0438\u0442\u044c \u0435\u0451 \u0441\u0430\u043c\u043e\u043c\u0443. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 <a href=\"https:\/\/kivymd.readthedocs.io\/en\/latest\/components\/button\/#mdiconbutton\" rel=\"nofollow\">MDIconButton<\/a> \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <i>canvas<\/i>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043d\u043e\u043f\u043a\u0438, \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b \u0435\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043c\u0435\u0442\u043a\u043e\u0439 \u0432 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u043e\u043a\u0441.<\/p>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">&lt;CallBoxButton@MDBoxLayout&gt;     orientation: &quot;vertical&quot;     adaptive_size: True     spacing: &quot;8dp&quot;     icon: &quot;&quot;     text: &quot;&quot;      MDIconButton:         icon: root.icon         theme_text_color: &quot;Custom&quot;         text_color: 1, 1, 1, 1          canvas:             Color:                 rgba: 1, 1, 1, 1             Line:                 width: 1                 circle:                     (\\                     self.center_x, \\                     self.center_y, \\                     min(self.width, self.height) \/ 2, \\                     0, \\                     360, \\                     )      MDLabel:         text: root.text         size_hint_y: None         height: self.texture_size[1]         font_style: &quot;Caption&quot;         halign: &quot;center&quot;         theme_text_color: &quot;Custom&quot;         text_color: 1, 1, 1, 1  [...] <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/lz\/gp\/v5\/lzgpv5zayp7mj8vqpljuzp6lsfe.png\"><\/div>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u043e\u043a\u0441 \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a.<\/p>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">&lt;CallBox@MDGridLayout&gt;     cols: 3     rows: 2     adaptive_size: True     spacing: &quot;24dp&quot;      CallBoxButton:         icon: &quot;microphone-off&quot;         text: &quot;Mute&quot;     CallBoxButton:         icon: &quot;volume-high&quot;         text: &quot;Speaker&quot;     CallBoxButton:         icon: &quot;dialpad&quot;         text: &quot;Keypad&quot;      CallBoxButton:         icon: &quot;plus-circle&quot;         text: &quot;Add call&quot;     CallBoxButton:         icon: &quot;call-missed&quot;         text: &quot;Transfer&quot;     CallBoxButton:         icon: &quot;account&quot;         text: &quot;Contact&quot;  [...] <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/16\/oq\/bj\/16oqbjtebrt7xazofrr7m9xyuqa.png\"><\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 <i>CallBox<\/i> \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u0435 <i>CallScreen<\/i> \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0441\u0438 <i>Y<\/i> \u0437\u0430 \u043d\u0438\u0436\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<p>  <b>callscreen.kv:<\/b><\/p>\n<pre><code class=\"json\">[...]  &lt;CallScreen&gt;      EffectWidget:         [...]          FitImage:             [...]      MDToolbar:         [...]      MDFloatLayout:         [...]          FitImage:             [...]      MDLabel:         [...]      MDBoxLayout:         [...]          ItemList:             [...]          ItemList:             [...]      MDFloatingActionButton:         root.animation_call_box(call_box, user_name); \\         [...]      CallBox:         id: call_box         pos_hint: {&quot;center_x&quot;: .5}         y: -self.height         opacity: 0 <\/code><\/pre>\n<p>  \u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u043e\u043a\u0441\u0430 \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438.<\/p>\n<p>  <b>callscreen.py:<\/b><\/p>\n<pre><code class=\"python\">from kivy.metrics import dp [...]   class CallScreen(MDScreen):     [...]      def animation_call_box(self, call_box, user_name):         if not self.open_call_box:             Animation(                 y=user_name.y - call_box.height - dp(100),                 opacity=1,                 d=0.6,                 t=&quot;in_out_quad&quot;,             ).start(call_box)         else:             Animation(                 y=-call_box.height,                 opacity=0,                 d=0.6,                 t=&quot;in_out_quad&quot;,             ).start(call_box) <\/code><\/pre>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ik\/pz\/pi\/ikpzpiyirf-fn6ynf90tsp2ptha.gif\"><\/div>\n<p>  \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f GIF-\u043a\u0430 \u0441 \u0442\u0435\u0441\u0442\u043e\u043c \u043d\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/c6\/1c\/8l\/c61c8lmgs7ijfksd0-8e9fxlaei.gif\"><\/div>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0431\u044b\u043b \u043f\u043e\u043b\u0435\u0437\u0435\u043d!<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/528154\/\"> https:\/\/habr.com\/ru\/post\/528154\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ai\/dq\/vu\/aidqvupj-e1iykvvmkk7nzncvqe.png\"><\/div>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0432\u0441\u0435\u0445 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0437\u043d\u0430\u0442\u043e\u043a\u043e\u0432 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Python!<br \/>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f\u043c\u0438 \u0432 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 <a href=\"https:\/\/github.com\/kivy\/kivy\" rel=\"nofollow\">Kivy<\/a> \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 <i>Google Material Design<\/i> \u2014 <a href=\"https:\/\/github.com\/kivymd\/KivyMD\" rel=\"nofollow\">KivyMD<\/a>. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Kivy \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 material \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043e\u0434\u043d\u0438\u043c \u044d\u043a\u0440\u0430\u043d\u043e\u043c \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439. \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c GIF \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043b\u0438\u0432\u0430\u0439\u0442\u0435 \u043a\u043e\u0444\u0435 \u0438 \u043f\u043e\u0433\u043d\u0430\u043b\u0438!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-313181","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=313181"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313181\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=313181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=313181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=313181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}