{"id":456924,"date":"2025-04-22T15:00:14","date_gmt":"2025-04-22T15:00:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=456924"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=456924","title":{"rendered":"<span>\u0413\u0440\u0430\u0444\u0438\u043a\u0430 \u0438 Python: 6 GUI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0432 2025 \u0433\u043e\u0434\u0443<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/068\/25d\/b33\/06825db33dc20b33a3bd2c16bd66f047.png\" width=\"1920\" height=\"1080\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/068\/25d\/b33\/06825db33dc20b33a3bd2c16bd66f047.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/068\/25d\/b33\/06825db33dc20b33a3bd2c16bd66f047.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041b\u0435\u0448\u0430 \u0416\u0438\u0440\u044f\u043a\u043e\u0432, \u044f \u0442\u0435\u0445\u043b\u0438\u0434 \u0431\u044d\u043a\u0435\u043d\u0434-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u0438\u0442\u0440\u0438\u043d\u044b KION, \u0430 \u0435\u0449\u0435 \u0432 \u041c\u0422\u0421 \u044f \u0432\u043e\u0437\u0433\u043b\u0430\u0432\u043b\u044f\u044e Python-\u0433\u0438\u043b\u044c\u0434\u0438\u044e.<\/p>\n<p>\u0412 2025 \u0433\u043e\u0434\u0443 Python \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 (GUI) \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0412 \u044d\u0442\u043e\u0439 \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0435 \u2014 \u0448\u0435\u0441\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u0444\u0438\u0448\u043a\u0430\u043c\u0438. \u041f\u043e\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0441\u044f \u0432 \u043c\u0438\u0440 \u043a\u043d\u043e\u043f\u043e\u043a, \u043e\u043a\u043e\u043d \u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u2014 \u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0438 \u0434\u043e \u044f\u0440\u043a\u0438\u0445 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 GitHub.<\/p>\n<h2>Tkinter<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb0\/45d\/5cc\/cb045d5ccd49ee16c54ea3fd46fcca58.png\" width=\"1400\" height=\"788\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cb0\/45d\/5cc\/cb045d5ccd49ee16c54ea3fd46fcca58.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb0\/45d\/5cc\/cb045d5ccd49ee16c54ea3fd46fcca58.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>Tkinter \u043a\u0430\u043a Python-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 1990-\u0445, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u0438 \u0443\u0447\u0430\u0441\u0442\u0438\u0438 \u0413\u0432\u0438\u0434\u043e \u0432\u0430\u043d \u0420\u043e\u0441\u0441\u0443\u043c\u0430 (Guido van Rossum) \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u043d\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 Python. \u0412 \u0430\u043f\u0440\u0435\u043b\u0435 2025 \u0433\u043e\u0434\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Python (3.12+) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Tcl\/Tk 8.6.13.<\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Python \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u0437 \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0438, \u044f \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u0438 \u0437\u0432\u0435\u0437\u0434\u044b. \u041e\u043d\u0430 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u043d\u0430\u0431\u043e\u0440 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 (\u043a\u043d\u043e\u043f\u043a\u0438, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f, \u043c\u0435\u0442\u043a\u0438, \u043c\u0435\u043d\u044e \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435) \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 (pack, grid, place) \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0430\u0437\u0430 \u2014 Tcl\/Tk, \u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0430\u044f (Windows, macOS, Linux). Tkinter \u043f\u0440\u043e\u0441\u0442 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u043d\u0435\u0442, \u0430 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u044e\u0437\u0435\u0440\u043e\u0432 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432. \u0415\u0449\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c ttk (Themed Tk), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u0442\u0438\u043b\u0435\u043c.<\/p>\n<p><strong>\u0414\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u0434\u0435\u0442 \u0441 Python.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430<\/strong>: \u043b\u0435\u0433\u043a\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c Python \u0438 Tcl\/Tk.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0437\u0440\u0435\u043b\u0430\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043e\u0449\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b<\/strong>: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f \u0438 \u043a\u0430\u043d\u0432\u0430\u0441 (Canvas) \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434<\/strong>: \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b Tkinter \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u0442\u0430\u0440\u043e\u043c\u043e\u0434\u043d\u043e \u0431\u0435\u0437 ttk.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/strong>: \u043d\u0435\u0442 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u044d\u0442\u043e \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 GUI-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 2025 \u0433\u043e\u0434\u0443. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0446\u0435\u043d\u0438\u0442\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u0414\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b. \u041e \u043d\u0438\u0445 \u2014 \u043d\u0438\u0436\u0435.<\/p>\n<p><strong>\u0412 \u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>IDLE<\/strong> (Python&#8217;s Integrated Development Environment) \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f IDE Python, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Tkinter.<\/p>\n<\/li>\n<li>\n<p><strong>Thonny<\/strong> \u2014 \u044d\u0442\u043e IDE \u0434\u043b\u044f Python, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0446\u0435\u043b\u0438, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Tkinter.<\/p>\n<\/li>\n<li>\n<p><strong>Matplotlib<\/strong> (\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 TkAgg) \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Python. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Tkinter \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0438\u0437 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>Pillow<\/strong> (PIL Fork) \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Tkinter.<\/p>\n<\/li>\n<li>\n<p><strong>Pmw<\/strong> (Python Mega Widgets) \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445 Tkinter.<\/p>\n<\/li>\n<li>\n<p><strong>SymPy<\/strong> (Plotting \u0441 Tkinter) \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 SymPy \u0434\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Tkinter \u0432 \u0441\u0432\u043e\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import tkinter as tk from tkinter import ttk, messagebox, filedialog  class TkinterDemoApp:     def __init__(self, root):         self.root = root         self.root.title(\"\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f Tkinter \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432\")         self.root.geometry(\"800x600\")         self.root.resizable(True, True)                  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0438\u043b\u0435\u0439         self.style = ttk.Style()         self.style.theme_use('clam')                  self.create_widgets()          def create_widgets(self):         # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443         self.main_frame = ttk.Frame(self.root, padding=\"10\")         self.main_frame.pack(fill=tk.BOTH, expand=True)                  # \u041f\u0430\u043d\u0435\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043e\u043a         self.notebook = ttk.Notebook(self.main_frame)         self.notebook.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)                  # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b\"         self.basic_tab = ttk.Frame(self.notebook)         self.notebook.add(self.basic_tab, text=\"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435\")         self.create_basic_widgets()                  # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b\"         self.advanced_tab = ttk.Frame(self.notebook)         self.notebook.add(self.advanced_tab, text=\"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435\")         self.create_advanced_widgets()                  # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f\"         self.actions_tab = ttk.Frame(self.notebook)         self.notebook.add(self.actions_tab, text=\"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f\")         self.create_actions_widgets()          def create_basic_widgets(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432\"\"\"         frame = ttk.LabelFrame(self.basic_tab, text=\"\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\", padding=\"10\")         frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)                  # \u041c\u0435\u0442\u043a\u0430 \u0438 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430         ttk.Label(frame, text=\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:\").grid(row=0, column=0, sticky=tk.W, pady=2)         self.username_entry = ttk.Entry(frame)         self.username_entry.grid(row=0, column=1, sticky=tk.EW, padx=5, pady=2)                  # \u041f\u0430\u0440\u043e\u043b\u044c         ttk.Label(frame, text=\"\u041f\u0430\u0440\u043e\u043b\u044c:\").grid(row=1, column=0, sticky=tk.W, pady=2)         self.password_entry = ttk.Entry(frame, show=\"*\")         self.password_entry.grid(row=1, column=1, sticky=tk.EW, padx=5, pady=2)                  # \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b         self.remember_var = tk.BooleanVar()         ttk.Checkbutton(frame, text=\"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043c\u0435\u043d\u044f\", variable=self.remember_var).grid(             row=2, column=0, columnspan=2, sticky=tk.W, pady=5)                  # \u0420\u0430\u0434\u0438\u043e\u043a\u043d\u043e\u043f\u043a\u0438         ttk.Label(frame, text=\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:\").grid(row=3, column=0, sticky=tk.W, pady=2)         self.radio_var = tk.StringVar(value=\"option1\")         ttk.Radiobutton(frame, text=\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 1\", value=\"option1\", variable=self.radio_var).grid(             row=4, column=0, sticky=tk.W)         ttk.Radiobutton(frame, text=\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 2\", value=\"option2\", variable=self.radio_var).grid(             row=4, column=1, sticky=tk.W)                  # \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a         ttk.Label(frame, text=\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0433\u043e\u0440\u043e\u0434:\").grid(row=5, column=0, sticky=tk.W, pady=2)         self.city_combo = ttk.Combobox(frame, values=[\"\u041c\u043e\u0441\u043a\u0432\u0430\", \"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\", \"\u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\", \"\u0415\u043a\u0430\u0442\u0435\u0440\u0438\u043d\u0431\u0443\u0440\u0433\"])         self.city_combo.grid(row=5, column=1, sticky=tk.EW, padx=5, pady=2)         self.city_combo.current(0)                  # \u0428\u043a\u0430\u043b\u0430 (Slider)         ttk.Label(frame, text=\"\u0423\u0440\u043e\u0432\u0435\u043d\u044c:\").grid(row=6, column=0, sticky=tk.W, pady=2)         self.scale = ttk.Scale(frame, from_=0, to=100, orient=tk.HORIZONTAL)         self.scale.grid(row=6, column=1, sticky=tk.EW, padx=5, pady=2)                  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0435\u0441\u0430 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u044f         frame.columnconfigure(1, weight=1)          def create_advanced_widgets(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432\"\"\"         frame = ttk.LabelFrame(self.advanced_tab, text=\"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\", padding=\"10\")         frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)                  # \u0414\u0435\u0440\u0435\u0432\u043e (Treeview)         self.tree = ttk.Treeview(frame, columns=(\"name\", \"age\", \"city\"), show=\"headings\")         self.tree.heading(\"name\", text=\"\u0418\u043c\u044f\")         self.tree.heading(\"age\", text=\"\u0412\u043e\u0437\u0440\u0430\u0441\u0442\")         self.tree.heading(\"city\", text=\"\u0413\u043e\u0440\u043e\u0434\")                  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435         self.tree.insert(\"\", tk.END, values=(\"\u0418\u0432\u0430\u043d \u0418\u0432\u0430\u043d\u043e\u0432\", 25, \"\u041c\u043e\u0441\u043a\u0432\u0430\"))         self.tree.insert(\"\", tk.END, values=(\"\u041f\u0435\u0442\u0440 \u041f\u0435\u0442\u0440\u043e\u0432\", 30, \"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\"))         self.tree.insert(\"\", tk.END, values=(\"\u0410\u043d\u043d\u0430 \u0421\u0438\u0434\u043e\u0440\u043e\u0432\u0430\", 22, \"\u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\"))                  self.tree.grid(row=0, column=0, columnspan=2, sticky=tk.NSEW, pady=5)                  # \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0431\u0430\u0440         self.progress = ttk.Progressbar(frame, orient=tk.HORIZONTAL, length=200, mode=\"determinate\")         self.progress.grid(row=1, column=0, columnspan=2, sticky=tk.EW, pady=5)                  # \u041f\u0430\u043d\u0435\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438         sub_notebook = ttk.Notebook(frame)         sub_notebook.grid(row=2, column=0, columnspan=2, sticky=tk.NSEW, pady=5)                  tab1 = ttk.Frame(sub_notebook)         tab2 = ttk.Frame(sub_notebook)                  sub_notebook.add(tab1, text=\"\u0412\u043a\u043b\u0430\u0434\u043a\u0430 1\")         sub_notebook.add(tab2, text=\"\u0412\u043a\u043b\u0430\u0434\u043a\u0430 2\")                  ttk.Label(tab1, text=\"\u042d\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\").pack(pady=20)         ttk.Label(tab2, text=\"\u042d\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\").pack(pady=20)                  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0435\u0441\u0430 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u044f         frame.columnconfigure(0, weight=1)         frame.rowconfigure(0, weight=1)          def create_actions_widgets(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\"\"\"         frame = ttk.LabelFrame(self.actions_tab, text=\"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f\", padding=\"10\")         frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)                  # \u041a\u043d\u043e\u043f\u043a\u0438         ttk.Button(frame, text=\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\", command=self.show_message).grid(             row=0, column=0, sticky=tk.EW, padx=5, pady=5)                  ttk.Button(frame, text=\"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\", command=self.start_progress).grid(             row=0, column=1, sticky=tk.EW, padx=5, pady=5)                  ttk.Button(frame, text=\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b\", command=self.open_file).grid(             row=1, column=0, sticky=tk.EW, padx=5, pady=5)                  ttk.Button(frame, text=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b\", command=self.save_file).grid(             row=1, column=1, sticky=tk.EW, padx=5, pady=5)                  # \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439         self.text = tk.Text(frame, wrap=tk.WORD, height=10)         self.scroll = ttk.Scrollbar(frame, orient=tk.VERTICAL, command=self.text.yview)         self.text.configure(yscrollcommand=self.scroll.set)                  self.text.grid(row=2, column=0, columnspan=2, sticky=tk.NSEW, pady=5)         self.scroll.grid(row=2, column=2, sticky=tk.NS, pady=5)                  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0435\u0441\u0430 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u044f         frame.columnconfigure(0, weight=1)         frame.columnconfigure(1, weight=1)         frame.rowconfigure(2, weight=1)          def show_message(self):         \"\"\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439\"\"\"         username = self.username_entry.get()         city = self.city_combo.get()         level = self.scale.get()                  message = f\"\u0418\u043c\u044f: {username}\\n\u0413\u043e\u0440\u043e\u0434: {city}\\n\u0423\u0440\u043e\u0432\u0435\u043d\u044c: {level:.0f}\"         messagebox.showinfo(\"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\", message)          def start_progress(self):         \"\"\"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u0430\"\"\"         self.progress[\"value\"] = 0         self.root.after(100, self.update_progress)          def update_progress(self):         \"\"\"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\"\"\"         if self.progress[\"value\"] &lt; 100:             self.progress[\"value\"] += 5             self.root.after(100, self.update_progress)          def open_file(self):         \"\"\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430\"\"\"         file_path = filedialog.askopenfilename(             title=\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b\",             filetypes=((\"\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b\", \"*.txt\"), (\"\u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b\", \"*.*\"))         )         if file_path:             try:                 with open(file_path, 'r', encoding='utf-8') as file:                     content = file.read()                     self.text.delete(1.0, tk.END)                     self.text.insert(tk.END, content)             except Exception as e:                 messagebox.showerror(\"\u041e\u0448\u0438\u0431\u043a\u0430\", f\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b:\\n{str(e)}\")          def save_file(self):         \"\"\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430\"\"\"         file_path = filedialog.asksaveasfilename(             title=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b\",             defaultextension=\".txt\",             filetypes=((\"\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b\", \"*.txt\"), (\"\u0412\u0441\u0435 \u0444\u0430\u0439\u043b\u044b\", \"*.*\"))         )         if file_path:             try:                 with open(file_path, 'w', encoding='utf-8') as file:                     file.write(self.text.get(1.0, tk.END))                 messagebox.showinfo(\"\u0423\u0441\u043f\u0435\u0445\", \"\u0424\u0430\u0439\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\")             except Exception as e:                 messagebox.showerror(\"\u041e\u0448\u0438\u0431\u043a\u0430\", f\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b:\\n{str(e)}\")  if __name__ == \"__main__\":     root = tk.Tk()     app = TkinterDemoApp(root)     root.mainloop()<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5d0\/97a\/ee5\/5d097aee5799d46a881be1674413d84c.png\" width=\"1666\" height=\"1310\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5d0\/97a\/ee5\/5d097aee5799d46a881be1674413d84c.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5d0\/97a\/ee5\/5d097aee5799d46a881be1674413d84c.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7d4\/9c5\/782\/7d49c5782ce5f8043ab085b3658ccddd.png\" width=\"1668\" height=\"1316\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7d4\/9c5\/782\/7d49c5782ce5f8043ab085b3658ccddd.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7d4\/9c5\/782\/7d49c5782ce5f8043ab085b3658ccddd.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b92\/197\/cec\/b92197cec4a645e465fa18c6bf0c9374.png\" width=\"1670\" height=\"1318\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b92\/197\/cec\/b92197cec4a645e465fa18c6bf0c9374.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b92\/197\/cec\/b92197cec4a645e465fa18c6bf0c9374.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f0\/7a2\/dab\/7f07a2dab075dcc7879d1beff67667e9.png\" width=\"1258\" height=\"976\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7f0\/7a2\/dab\/7f07a2dab075dcc7879d1beff67667e9.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f0\/7a2\/dab\/7f07a2dab075dcc7879d1beff67667e9.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4f5\/51a\/7dd\/4f551a7dd049f0cc431b239eb1889680.png\" width=\"1676\" height=\"1320\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4f5\/51a\/7dd\/4f551a7dd049f0cc431b239eb1889680.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4f5\/51a\/7dd\/4f551a7dd049f0cc431b239eb1889680.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<h2>Qt<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/198\/b43\/e60\/198b43e6035c5dc20a4d1bf26006892f.png\" width=\"830\" height=\"333\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/198\/b43\/e60\/198b43e6035c5dc20a4d1bf26006892f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/198\/b43\/e60\/198b43e6035c5dc20a4d1bf26006892f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 Qt \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0432 1991 \u0433\u043e\u0434\u0443 \u0432 \u043d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Trolltech, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0425\u0430\u0430\u0432\u0430\u0440\u0434\u043e\u043c \u041d\u043e\u0440\u0434\u043e\u043c \u0438 \u042d\u0439\u0440\u0438\u043a\u043e\u043c \u0427\u0443\u043c\u0431\u0441\u043e\u043c. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0432\u044b\u0448\u043b\u0430 \u0432 1995 \u0433\u043e\u0434\u0443. \u0412 2008 \u0433\u043e\u0434\u0443 Trolltech \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0430 Nokia, \u043f\u043e\u0437\u0436\u0435 Qt \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043a Digia, \u0430 \u0441 2014 \u0433\u043e\u0434\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 The Qt Company. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 C++ \u0438 \u0441\u0442\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. <\/p>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0432\u0435\u0437\u0434 \u043d\u0430 <\/strong><a href=\"https:\/\/github.com\/qt\/qtbase\"><strong>GitHub<\/strong><\/a>: 2,7k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u043c\u043c\u0438\u0442\u044b<\/strong>: \u0441\u0432\u044b\u0448\u0435 72k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/strong>: 6.9.0.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430: <\/strong>8 \u0430\u043f\u0440\u0435\u043b\u044f 2025 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430: <\/strong>17 \u0430\u043f\u0440\u0435\u043b\u044f 2025 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>Qt \u2014 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c (GPL v3). \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0435 \u0434\u0435\u043b\u044f\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0443\u044e \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e. \u041f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d Qt \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Windows, macOS, Linux, Android, iOS, \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0438 \u0434\u0430\u0436\u0435 WebAssembly. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 C++ \u0438 OpenGL \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0438\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 2D\/3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0439 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 Qt Designer \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0437\u0430\u0439\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0438 IoT-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<p><strong>\u0414\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043e\u0434\u0438\u043d \u043a\u043e\u0434 \u0434\u043b\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u0442\u0438\u043b\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f C++ \u0438 OpenGL \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u0442\u044f\u0436\u0435\u043b\u044b\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/strong>: Qt Designer \u0438 QML \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u042d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/strong>: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0435\u0442\u0435\u0439, \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0430 \u0438 3D-\u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043e\u0431\u0438\u043b\u0438\u0435 API \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u0431\u043e\u0440\u043e\u043a<\/strong>: \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 Qt \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u043e\u0431\u044a\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/strong>: \u0441\u0431\u043e\u0440\u043a\u0430 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 2025 \u0433\u043e\u0434\u0443 Qt \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u2014 \u043e\u0442 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u041f\u041e \u0438 \u043c\u0435\u0434\u0438\u0430\u0446\u0435\u043d\u0442\u0440\u043e\u0432 \u0434\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0432 \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f\u0445 \u0438 IoT. \u0412\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439, \u043d\u043e \u043e\u043d\u0430 \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u0430 \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438. <\/p>\n<p><strong>\u0412 \u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>VLC Media Player <\/strong>\u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0435\u0439\u0448\u0438\u0445 \u043c\u0435\u0434\u0438\u0430\u043f\u043b\u0435\u0435\u0440\u043e\u0432, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 Qt.<\/p>\n<\/li>\n<li>\n<p><strong>Telegram Desktop <\/strong>\u2014<strong> <\/strong>\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 Telegram \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Qt.<\/p>\n<\/li>\n<li>\n<p><strong>KDE Plasma<\/strong> \u2014 \u0432\u0441\u044f \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 KDE, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0442\u043e\u043b Plasma \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 Qt.<\/p>\n<\/li>\n<li>\n<p><strong>Autodesk Maya <\/strong>\u2014 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u041f\u041e \u0434\u043b\u044f 3D-\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Qt \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Google Earth<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Qt \u0434\u043b\u044f \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>Blender<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Qt \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Spotify (\u0440\u0430\u043d\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438)<\/strong> \u2014 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 Spotify \u0440\u0430\u043d\u0435\u0435 \u0431\u044b\u043b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 Qt.<\/p>\n<\/li>\n<li>\n<p><strong>Wolfram Mathematica<\/strong> \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b Mathematica \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Qt.<\/p>\n<\/li>\n<li>\n<p><strong>Scribus <\/strong>\u2014 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0435\u0440\u0441\u0442\u043a\u0438 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>LumaFusion<\/strong> \u2014 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434\u0435\u043e\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Qt \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f: <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import sys from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,                             QHBoxLayout, QLabel, QPushButton, QLineEdit,                             QComboBox, QCheckBox, QRadioButton, QSlider,                             QProgressBar, QSpinBox, QDoubleSpinBox, QTextEdit,                             QListWidget, QTabWidget, QMessageBox, QInputDialog) from PyQt6.QtCore import Qt, QTimer from PyQt6.QtGui import QIcon, QPixmap   class MainWindow(QMainWindow):     def __init__(self):         super().__init__()                  self.setWindowTitle(\"PyQt6 Widgets Demo\")         self.setGeometry(100, 100, 800, 600)                  # \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434\u0436\u0435\u0442 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 layout         central_widget = QWidget()         self.setCentralWidget(central_widget)         main_layout = QVBoxLayout()         central_widget.setLayout(main_layout)                  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432         self.tabs = QTabWidget()         main_layout.addWidget(self.tabs)                  # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438         self.create_basic_widgets_tab()         # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u0441 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438 \u0432\u0432\u043e\u0434\u0430         self.create_input_widgets_tab()         # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u0441 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438         self.create_indicator_widgets_tab()         # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438         self.create_container_widgets_tab()                  # \u0421\u0442\u0430\u0442\u0443\u0441 \u0431\u0430\u0440         self.statusBar().showMessage(\"\u0413\u043e\u0442\u043e\u0432\u043e\")          def create_basic_widgets_tab(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438\"\"\"         tab = QWidget()         layout = QVBoxLayout()         tab.setLayout(layout)                  # \u041c\u0435\u0442\u043a\u0430 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c         label = QLabel(\"\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f PyQt6 Widgets\")         label.setAlignment(Qt.AlignmentFlag.AlignCenter)         font = label.font()         font.setPointSize(16)         label.setFont(font)         layout.addWidget(label)                  # \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435         image_label = QLabel()         pixmap = QPixmap(\":images\/python-logo.png\")  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441         if not pixmap.isNull():             image_label.setPixmap(pixmap.scaled(200, 200, Qt.AspectRatioMode.KeepAspectRatio))         image_label.setAlignment(Qt.AlignmentFlag.AlignCenter)         layout.addWidget(image_label)                  # \u041a\u043d\u043e\u043f\u043a\u0438         btn_layout = QHBoxLayout()                  btn1 = QPushButton(\"\u041e\u0431\u044b\u0447\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430\")         btn1.clicked.connect(self.on_button_click)         btn_layout.addWidget(btn1)                  btn2 = QPushButton(QIcon(\":images\/python-logo.png\"), \"\u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u0438\u043a\u043e\u043d\u043a\u043e\u0439\")         btn2.clicked.connect(self.on_button_click)         btn_layout.addWidget(btn2)                  btn3 = QPushButton(\"\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430\")         btn3.setEnabled(False)         btn_layout.addWidget(btn3)                  layout.addLayout(btn_layout)                  # \u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f         layout.addWidget(QLabel(\"&lt;hr&gt;\"), 1)                  # \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435         self.line_edit = QLineEdit()         self.line_edit.setPlaceholderText(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u0437\u0434\u0435\u0441\u044c...\")         self.line_edit.textChanged.connect(self.on_text_changed)         layout.addWidget(self.line_edit)                  self.tabs.addTab(tab, \"\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b\")          def create_input_widgets_tab(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438 \u0432\u0432\u043e\u0434\u0430\"\"\"         tab = QWidget()         layout = QVBoxLayout()         tab.setLayout(layout)                  # \u041a\u043e\u043c\u0431\u043e\u0431\u043e\u043a\u0441 (\u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a)         combo_label = QLabel(\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:\")         layout.addWidget(combo_label)                  self.combo_box = QComboBox()         self.combo_box.addItems([\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 1\", \"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 2\", \"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 3\", \"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 4\"])         self.combo_box.currentIndexChanged.connect(self.on_combo_changed)         layout.addWidget(self.combo_box)                  # \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b         check_label = QLabel(\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u043f\u0446\u0438\u0438:\")         layout.addWidget(check_label)                  self.check1 = QCheckBox(\"\u041e\u043f\u0446\u0438\u044f 1\")         self.check1.stateChanged.connect(self.on_check_changed)         layout.addWidget(self.check1)                  self.check2 = QCheckBox(\"\u041e\u043f\u0446\u0438\u044f 2\")         self.check2.stateChanged.connect(self.on_check_changed)         layout.addWidget(self.check2)                  # \u0420\u0430\u0434\u0438\u043e \u043a\u043d\u043e\u043f\u043a\u0438         radio_label = QLabel(\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0434\u0438\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442:\")         layout.addWidget(radio_label)                  self.radio1 = QRadioButton(\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 A\")         self.radio1.toggled.connect(self.on_radio_toggled)         layout.addWidget(self.radio1)                  self.radio2 = QRadioButton(\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 B\")         self.radio2.toggled.connect(self.on_radio_toggled)         layout.addWidget(self.radio2)                  self.radio3 = QRadioButton(\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 C\")         self.radio3.toggled.connect(self.on_radio_toggled)         layout.addWidget(self.radio3)                  # \u0421\u043b\u0430\u0439\u0434\u0435\u0440         slider_label = QLabel(\"\u0420\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:\")         layout.addWidget(slider_label)                  self.slider = QSlider(Qt.Orientation.Horizontal)         self.slider.setMinimum(0)         self.slider.setMaximum(100)         self.slider.setValue(50)         self.slider.valueChanged.connect(self.on_slider_changed)         layout.addWidget(self.slider)                  # \u0421\u043f\u0438\u043d\u0431\u043e\u043a\u0441\u044b         spin_layout = QHBoxLayout()                  self.spin_box = QSpinBox()         self.spin_box.setRange(0, 100)         self.spin_box.setValue(25)         self.spin_box.valueChanged.connect(self.on_spin_changed)         spin_layout.addWidget(self.spin_box)                  self.double_spin = QDoubleSpinBox()         self.double_spin.setRange(0, 10)         self.double_spin.setSingleStep(0.1)         self.double_spin.setValue(2.5)         self.double_spin.valueChanged.connect(self.on_double_spin_changed)         spin_layout.addWidget(self.double_spin)                  layout.addLayout(spin_layout)                  self.tabs.addTab(tab, \"\u0412\u0438\u0434\u0436\u0435\u0442\u044b \u0432\u0432\u043e\u0434\u0430\")          def create_indicator_widgets_tab(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438\"\"\"         tab = QWidget()         layout = QVBoxLayout()         tab.setLayout(layout)                  # \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0431\u0430\u0440         progress_label = QLabel(\"\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0431\u0430\u0440:\")         layout.addWidget(progress_label)                  self.progress_bar = QProgressBar()         self.progress_bar.setRange(0, 100)         self.progress_bar.setValue(0)         layout.addWidget(self.progress_bar)                  # \u041a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430         self.progress_btn = QPushButton(\"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\")         self.progress_btn.clicked.connect(self.start_progress)         layout.addWidget(self.progress_btn)                  # \u0422\u0430\u0439\u043c\u0435\u0440 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0431\u0430\u0440\u0430         self.progress_timer = QTimer()         self.progress_timer.timeout.connect(self.update_progress)         self.progress_value = 0                  # \u041c\u0435\u0442\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439         self.value_label = QLabel(\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c\")         self.value_label.setAlignment(Qt.AlignmentFlag.AlignCenter)         layout.addWidget(self.value_label)                  self.tabs.addTab(tab, \"\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b\")          def create_container_widgets_tab(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438\"\"\"         tab = QWidget()         layout = QVBoxLayout()         tab.setLayout(layout)                  # \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440         text_edit_label = QLabel(\"\u0422\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440:\")         layout.addWidget(text_edit_label)                  self.text_edit = QTextEdit()         self.text_edit.setPlaceholderText(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u0437\u0434\u0435\u0441\u044c...\")         layout.addWidget(self.text_edit)                  # \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c         text_btn_layout = QHBoxLayout()                  clear_btn = QPushButton(\"\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c\")         clear_btn.clicked.connect(self.text_edit.clear)         text_btn_layout.addWidget(clear_btn)                  get_text_btn = QPushButton(\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\")         get_text_btn.clicked.connect(self.show_text)         text_btn_layout.addWidget(get_text_btn)                  layout.addLayout(text_btn_layout)                  # \u0421\u043f\u0438\u0441\u043e\u043a         list_label = QLabel(\"\u0421\u043f\u0438\u0441\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:\")         layout.addWidget(list_label)                  self.list_widget = QListWidget()         self.list_widget.addItems([\"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 1\", \"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 2\", \"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 3\"])         self.list_widget.itemClicked.connect(self.on_list_item_clicked)         layout.addWidget(self.list_widget)                  # \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c         list_btn_layout = QHBoxLayout()                  add_item_btn = QPushButton(\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")         add_item_btn.clicked.connect(self.add_list_item)         list_btn_layout.addWidget(add_item_btn)                  remove_item_btn = QPushButton(\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")         remove_item_btn.clicked.connect(self.remove_list_item)         list_btn_layout.addWidget(remove_item_btn)                  layout.addLayout(list_btn_layout)                  self.tabs.addTab(tab, \"\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b\")          # \u041c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439     def on_button_click(self):         sender = self.sender()         QMessageBox.information(self, \"\u041a\u043d\u043e\u043f\u043a\u0430 \u043d\u0430\u0436\u0430\u0442\u0430\", f\"\u041d\u0430\u0436\u0430\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0430: {sender.text()}\")          def on_text_changed(self, text):         self.statusBar().showMessage(f\"\u0422\u0435\u043a\u0441\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d: {text}\", 2000)          def on_combo_changed(self, index):         self.value_label.setText(f\"\u0412\u044b\u0431\u0440\u0430\u043d \u043a\u043e\u043c\u0431\u043e\u0431\u043e\u043a\u0441: {self.combo_box.currentText()} (\u0438\u043d\u0434\u0435\u043a\u0441 {index})\")          def on_check_changed(self, state):         sender = self.sender()         checked = \"\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430\" if state else \"\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430\"         self.value_label.setText(f\"\u041e\u043f\u0446\u0438\u044f {sender.text()} {checked}\")          def on_radio_toggled(self, checked):         if checked:             sender = self.sender()             self.value_label.setText(f\"\u0412\u044b\u0431\u0440\u0430\u043d \u0440\u0430\u0434\u0438\u043e-\u0432\u0430\u0440\u0438\u0430\u043d\u0442: {sender.text()}\")          def on_slider_changed(self, value):         self.value_label.setText(f\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430: {value}\")          def on_spin_changed(self, value):         self.value_label.setText(f\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u043d\u0431\u043e\u043a\u0441\u0430: {value}\")          def on_double_spin_changed(self, value):         self.value_label.setText(f\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 double \u0441\u043f\u0438\u043d\u0431\u043e\u043a\u0441\u0430: {value:.2f}\")          def start_progress(self):         if not self.progress_timer.isActive():             self.progress_value = 0             self.progress_bar.setValue(0)             self.progress_timer.start(100)             self.progress_btn.setText(\"\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\")         else:             self.progress_timer.stop()             self.progress_btn.setText(\"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\")          def update_progress(self):         self.progress_value += 1         self.progress_bar.setValue(self.progress_value)                  if self.progress_value &gt;= 100:             self.progress_timer.stop()             self.progress_btn.setText(\"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\")             QMessageBox.information(self, \"\u0413\u043e\u0442\u043e\u0432\u043e\", \"\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d!\")          def show_text(self):         text = self.text_edit.toPlainText()         if text:             QMessageBox.information(self, \"\u0422\u0435\u043a\u0441\u0442\", text)         else:             QMessageBox.warning(self, \"\u041e\u0448\u0438\u0431\u043a\u0430\", \"\u0422\u0435\u043a\u0441\u0442 \u043d\u0435 \u0432\u0432\u0435\u0434\u0435\u043d!\")          def on_list_item_clicked(self, item):         self.value_label.setText(f\"\u0412\u044b\u0431\u0440\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430: {item.text()}\")          def add_list_item(self):         text, ok = QInputDialog.getText(self, \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\", \"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430:\")         if ok and text:             self.list_widget.addItem(text)          def remove_list_item(self):         current_item = self.list_widget.currentItem()         if current_item:             self.list_widget.takeItem(self.list_widget.row(current_item))   if __name__ == \"__main__\":     app = QApplication(sys.argv)          # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0438\u043b\u044c \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f     app.setStyle(\"Fusion\")          window = MainWindow()     window.show()          sys.exit(app.exec())<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/af1\/426\/55e\/af142655ee78d6226b2c1e61597fe0f3.png\" width=\"839\" height=\"649\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/af1\/426\/55e\/af142655ee78d6226b2c1e61597fe0f3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/af1\/426\/55e\/af142655ee78d6226b2c1e61597fe0f3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/730\/bc6\/ac9\/730bc6ac98a326f0dddfb21492bec466.png\" width=\"691\" height=\"544\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/730\/bc6\/ac9\/730bc6ac98a326f0dddfb21492bec466.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/730\/bc6\/ac9\/730bc6ac98a326f0dddfb21492bec466.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/77b\/128\/39c\/77b12839cae2f06413907f1c297c98b3.png\" width=\"829\" height=\"646\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/77b\/128\/39c\/77b12839cae2f06413907f1c297c98b3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/77b\/128\/39c\/77b12839cae2f06413907f1c297c98b3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f2\/d08\/3d3\/7f2d083d3dcf7c61dc1cfb65ed2ba663.png\" width=\"833\" height=\"657\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7f2\/d08\/3d3\/7f2d083d3dcf7c61dc1cfb65ed2ba663.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f2\/d08\/3d3\/7f2d083d3dcf7c61dc1cfb65ed2ba663.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7dc\/71e\/fa2\/7dc71efa2538e03d4cff57da8156be6b.png\" width=\"833\" height=\"657\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/7dc\/71e\/fa2\/7dc71efa2538e03d4cff57da8156be6b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7dc\/71e\/fa2\/7dc71efa2538e03d4cff57da8156be6b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/182\/50f\/808\/18250f8082e70587f5fb97b54ad63d62.png\" width=\"846\" height=\"663\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/182\/50f\/808\/18250f8082e70587f5fb97b54ad63d62.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/182\/50f\/808\/18250f8082e70587f5fb97b54ad63d62.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 QMainWindow \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u043a\u043b\u0430\u0434\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0438\u0441\u0442\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430 UI \u0438 \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0435: QLabel, QPushButton, QLineEdit.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445: QComboBox, QCheckBox, QRadioButton, QSlider, QSpinBox.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b: QProgressBar \u0441 QTimer.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b: QTextEdit, QListWidget, QTabWidget.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043a \u0441\u043b\u043e\u0442\u0430\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043b\u0438\u043a\u043e\u0432, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0442. \u0434.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 QMessageBox \u0434\u043b\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 QInputDialog.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u0442\u0443\u0441-\u0431\u0430\u0440.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<h2>Kivy<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/409\/35b\/e4f\/40935be4f3e027df2a323bab7f886cef.png\" width=\"1534\" height=\"743\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/409\/35b\/e4f\/40935be4f3e027df2a323bab7f886cef.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/409\/35b\/e4f\/40935be4f3e027df2a323bab7f886cef.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>Kivy \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 \u0444\u0435\u0432\u0440\u0430\u043b\u0435 2011 \u0433\u043e\u0434\u0430 \u043a\u0430\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 PyMT (Python MultiTouch). \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u2014 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Kivy Organization, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0442\u0430\u043a\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432, \u043a\u0430\u043a \u041c\u0430\u0442\u044c\u0435 \u0412\u0438\u0440\u0431\u0435\u043b (Mathieu Virbel, \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u0430\u043a @tito). \u041f\u0440\u043e\u0435\u043a\u0442 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u0438\u0437 PyMT, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0430\u0447-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0432 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a.<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0432\u0435\u0437\u0434 \u043d\u0430 <\/strong><a href=\"http:\/\/github.com\/kivy\/kivy\"><strong>GitHub<\/strong><\/a>: 18,2k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u043c\u043c\u0438\u0442\u044b<\/strong>: \u043f\u043e\u0447\u0442\u0438 13k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/strong>: 2.3.1.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430: <\/strong>26 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2024 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430: <\/strong>8 \u0430\u043f\u0440\u0435\u043b\u044f 2025 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Python \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c (NUI), \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0430\u0447. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Windows, macOS, Linux, Android, iOS \u0438 \u0434\u0430\u0436\u0435 Raspberry Pi. Kivy \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 OpenGL ES 2.0 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u0447\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0438 \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a Kv, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u043e \u043e\u043d\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438 \u0434\u043b\u044f \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0438\u0433\u0440.<\/p>\n<p><strong>\u0414\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043e\u0434\u0438\u043d \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u2014 \u043e\u0442 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u0430 \u0434\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u0443\u043b\u044c\u0442\u0438\u0442\u0430\u0447<\/strong>: \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043e\u0434<\/strong>: \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f MIT \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0440\u0430\u0444\u0438\u043a\u0430<\/strong>: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 OpenGL \u0434\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u041d\u0435 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0438\u0434<\/strong>: Kivy \u0440\u0438\u0441\u0443\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b, \u0447\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442 \u0438\u0445 \u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0438\u043b\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, iOS \u0438\u043b\u0438 Windows).<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/strong>: \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (SDL2, GStreamer \u0438 \u0434\u0440.), \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 Windows.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0440\u0443\u0442\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/strong>: \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 Kivy.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/strong>: \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 APK \u0434\u043b\u044f Android \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 10 \u041c\u0431 \u0438\u0437-\u0437\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 2025 \u0433\u043e\u0434\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0449\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u0430 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0441 \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0430\u0447. \u042d\u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0438 \u0442\u0435\u0440\u043f\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435. <\/p>\n<p><strong>\u0412 \u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p>Python \u0434\u043b\u044f Android (Pydroid 3) \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 Python, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>KivyMD. \u0425\u043e\u0442\u044f \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 Kivy, KivyMD \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 \u0441\u0442\u0438\u043b\u0435 Material Design, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445.<\/p>\n<\/li>\n<li>\n<p>Buildozer \u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Kivy \u0434\u043b\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f\u043c\u0438 Kivy.<\/p>\n<\/li>\n<li>\n<p>TouchViz \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442 NASA \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0439 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u0435\u043d\u0441\u043e\u0440\u043d\u044b\u0445 \u044d\u043a\u0440\u0430\u043d\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>Bord \u043e\u0442 Novation \u2014 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435-\u043a\u043e\u043c\u043f\u0430\u043d\u044c\u043e\u043d \u0434\u043b\u044f \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f Novation Launchpad.<\/p>\n<\/li>\n<li>\n<p>Plyer \u2014\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e-\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u0432\u043e\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u0435\u043a \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kivy \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0442\u0435\u043c\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c Kivy:<\/p>\n<pre><code class=\"python\">pip install kivy<\/code><\/pre>\n<p>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Kivy \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438:<\/p>\n<pre><code class=\"python\">from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.uix.button import Button from kivy.uix.textinput import TextInput from kivy.uix.slider import Slider from kivy.uix.switch import Switch from kivy.uix.progressbar import ProgressBar from kivy.uix.image import Image from kivy.clock import Clock from kivy.graphics import Color, Rectangle from kivy.core.window import Window  class KivyWidgetsDemo(BoxLayout):     def __init__(self, **kwargs):         super().__init__(**kwargs)         self.orientation = 'vertical'         self.spacing = 15         self.padding = 30                  # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0444\u043e\u043d         with self.canvas.before:             Color(0.95, 0.95, 0.95, 1)  # \u0421\u0435\u0440\u044b\u0439 \u0444\u043e\u043d             self.rect = Rectangle(size=Window.size, pos=self.pos)                  # \u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u043d\u0430         Window.bind(size=self._update_rect)                  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0438\u0434\u0436\u0435\u0442\u044b         self._add_widgets()          def _update_rect(self, instance, value):         self.rect.size = value          def _add_widgets(self):         \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432\"\"\"                  # \u041c\u0435\u0442\u043a\u0430 (Label)         self.label = Label(             text='\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 Kivy',             font_size='24sp',             color=(0.1, 0.2, 0.6, 1),             bold=True         )         self.add_widget(self.label)                  # \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 (TextInput)         self.text_input = TextInput(             hint_text='\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u0437\u0434\u0435\u0441\u044c',             size_hint=(1, None),             height=40,             multiline=False         )         self.text_input.bind(text=self.on_text_change)         self.add_widget(self.text_input)                  # \u041a\u043d\u043e\u043f\u043a\u0430 (Button)         self.button = Button(             text='\u041d\u0430\u0436\u043c\u0438 \u043c\u0435\u043d\u044f',             size_hint=(0.5, None),             height=50,             pos_hint={'center_x': 0.5},             background_color=(0.4, 0.7, 0.9, 1)         )         self.button.bind(on_press=self.on_button_press)         self.add_widget(self.button)                  # \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c (Switch)         self.switch = Switch(             active=False,             pos_hint={'center_x': 0.5}         )         self.switch.bind(active=self.on_switch_active)         self.add_widget(self.switch)                  # \u0421\u043b\u0430\u0439\u0434\u0435\u0440 (Slider)         self.slider = Slider(             min=0,             max=100,             value=30,             step=1,             size_hint=(1, None),             height=40         )         self.slider.bind(value=self.on_slider_change)         self.add_widget(self.slider)                  # \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 (ProgressBar)         self.progress = ProgressBar(             max=100,             value=30,             size_hint=(1, None),             height=30         )         self.add_widget(self.progress)                  # \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (Image)         self.image = Image(             source='kivy-logo-black-512.png',  # \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u0435 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0444\u0430\u0439\u043b             size_hint=(1, None),             height=150,             allow_stretch=True         )         self.add_widget(self.image)                  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u0430 \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443         Clock.schedule_interval(self.update_progress, 0.1)          def on_text_change(self, instance, value):         self.label.text = f'\u0412\u044b \u0432\u0432\u0435\u043b\u0438: {value}'          def on_button_press(self, instance):         self.label.text = '\u041a\u043d\u043e\u043f\u043a\u0430 \u043d\u0430\u0436\u0430\u0442\u0430!'         instance.text = '\u0421\u043f\u0430\u0441\u0438\u0431\u043e!'          def on_switch_active(self, instance, value):         status = '\u0432\u043a\u043b\u044e\u0447\u0435\u043d' if value else '\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d'         self.label.text = f'\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c {status}'          def on_slider_change(self, instance, value):         self.progress.value = value         self.label.text = f'\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435: {int(value)}'          def update_progress(self, dt):         if self.progress.value &lt; 100:             self.progress.value += 1         else:             self.progress.value = 0  class KivyDemoApp(App):     def build(self):         self.title = 'Kivy Widgets Demo'         return KivyWidgetsDemo()  if __name__ == '__main__':     KivyDemoApp().run()<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f03\/c41\/bda\/f03c41bdac98d1f2913151cc87469d4f.png\" width=\"837\" height=\"679\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f03\/c41\/bda\/f03c41bdac98d1f2913151cc87469d4f.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f03\/c41\/bda\/f03c41bdac98d1f2913151cc87469d4f.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb1\/0d6\/90f\/bb10d690f2ac2c87eeb7c262e67a18d1.png\" width=\"847\" height=\"654\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bb1\/0d6\/90f\/bb10d690f2ac2c87eeb7c262e67a18d1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb1\/0d6\/90f\/bb10d690f2ac2c87eeb7c262e67a18d1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p><strong>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0427\u0435\u0442\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b<\/strong>:<\/p>\n<ul>\n<li>\n<p>Label \u2014 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>Button \u2014 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>TextInput \u2014 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>Slider \u2014 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>Switch \u2014 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044c.<\/p>\n<\/li>\n<li>\n<p>ProgressBar \u2014 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>Image \u2014 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (bind).<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Clock.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0410\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u043a \u0440\u0430\u0437\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 canvas \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0444\u043e\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 pos_hint \u0438 size_hint \u0434\u043b\u044f \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<h2>BeeWare Toga<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a4\/56c\/021\/1a456c021f40fbca93c91437c47b36c7.png\" width=\"1853\" height=\"656\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/1a4\/56c\/021\/1a456c021f40fbca93c91437c47b36c7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a4\/56c\/021\/1a456c021f40fbca93c91437c47b36c7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>Toga \u2014 \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 BeeWare, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0420\u0430\u0441\u0441\u0435\u043b\u043e\u043c \u041a\u0438\u0442\u043e\u043c-\u041c\u0430\u0433\u0435 (Russell Keith-Magee) \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432 2014 \u0433\u043e\u0434\u0443, \u043d\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u0437\u0436\u0435, \u0441\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0441\u043b\u0435 2020 \u0433\u043e\u0434\u0430.<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0432\u0435\u0437\u0434 \u043d\u0430 <\/strong><a href=\"https:\/\/github.com\/beeware\/toga\"><strong><u>GitHub<\/u><\/strong><\/a>: 4,7k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u043c\u043c\u0438\u0442\u044b<\/strong>: \u0441\u0432\u044b\u0448\u0435 10k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/strong>: 0.5.0.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430: <\/strong>14 \u043c\u0430\u0440\u0442\u0430 2025 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430: <\/strong>14 \u0430\u043f\u0440\u0435\u043b\u044f 2025 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>Toga \u2014 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 GUI-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438\u0437 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b BeeWare, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Python. \u041e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 Windows, macOS, Linux (GTK), Android, iOS \u0438 \u0434\u0430\u0436\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435) \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u044d\u043a\u0435\u043d\u0434\u044b. Toga \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u0442\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435, \u0433\u0434\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043b\u0435\u0433\u043a\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 pip, \u0430 \u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0437\u0434\u0435. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u2014 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0434\u043b\u044f \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u0430 \u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 Briefcase \u2014 \u0435\u0449\u0435 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0430\u043f\u043f\u044b.<\/p>\n<p><strong>\u0414\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u041d\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0435\u043e\u0442\u043b\u0438\u0447\u0438\u043c\u044b\u043c \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435, \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/strong>: \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e pip install.<\/p>\n<\/li>\n<li>\n<p><strong>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 BeeWare<\/strong>: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 Briefcase \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>Python-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: API \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u044f\u0437\u044b\u043a\u0430, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0435 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432<\/strong>: \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Qt \u0438\u043b\u0438 Tkinter, Toga \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/strong>: \u0441\u043a\u0443\u0434\u043d\u0430\u044f, \u0447\u0442\u043e \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u044f\u0435\u0442 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u043e\u0433\u0434\u0430 \u0438\u0434\u0435\u0442 \u0432 \u0443\u0449\u0435\u0440\u0431 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0445 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043d\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 BeeWare, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043f\u043e \u0437\u0440\u0435\u043b\u043e\u0441\u0442\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0443 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c. \u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 BeeWare Toga \u0441 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import toga from toga.style import Pack from toga.style.pack import CENTER, COLUMN, ROW   class TogaDemoApp(toga.App):    def startup(self):        \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438\"\"\"        self.name = \"Toga Demo App\"         # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e        self.main_window = toga.MainWindow(title=self.name, size=(800, 600))         # \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 ScrollContainer \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u043e\u0440\u043c        main_box = toga.ScrollContainer(style=Pack(direction=COLUMN, margin=10))         # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0438        self.tabs = toga.OptionContainer(style=Pack(flex=1))         # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0438        self.tabs.content.append(\"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435\", self.create_basic_widgets())        self.tabs.content.append(\"\u0412\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445\", self.create_input_widgets())        self.tabs.content.append(\"\u0421\u043f\u0438\u0441\u043a\u0438\", self.create_list_widgets())        self.tabs.content.append(\"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f\", self.create_action_widgets())         main_box.content = self.tabs         # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430        self.main_window.content = main_box        self.main_window.show()     def create_basic_widgets(self):        \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438\"\"\"        box = toga.Box(style=Pack(direction=COLUMN, margin=10))         # \u041c\u0435\u0442\u043a\u0430        label = toga.Label(            \"\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 BeeWare Toga\",            style=Pack(margin=(0, 5), font_size=16, text_align=CENTER),        )        box.add(label)         # \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c        box.add(toga.Divider(style=Pack(margin_top=10, margin_bottom=10)))         # \u041a\u043d\u043e\u043f\u043a\u0438        btn_box = toga.Box(style=Pack(direction=ROW, margin=5))         btn1 = toga.Button(            \"\u041e\u0431\u044b\u0447\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430\",            on_press=self.on_button_press,            style=Pack(margin=5, flex=1),        )        btn_box.add(btn1)         btn2 = toga.Button(            \"\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430\", enabled=False, style=Pack(margin=5, flex=1)        )        btn_box.add(btn2)         box.add(btn_box)         # \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0438\u043a\u043e\u043d\u043a\u0443)        try:            image = toga.Image(\"resources\/icon.png\")            imageview = toga.ImageView(                image, style=Pack(margin=10, width=100, height=100)            )            box.add(imageview)        except FileNotFoundError:            box.add(toga.Label(\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\", style=Pack(color=\"red\")))         # \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435        self.text_input = toga.TextInput(            placeholder=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442...\", style=Pack(margin=5)        )        self.text_input.on_change = self.on_text_change        box.add(self.text_input)         # \u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442        self.multiline_text = toga.MultilineTextInput(            placeholder=\"\u041c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442...\", style=Pack(margin=5, height=100)        )         box.add(self.multiline_text)         return box     def create_input_widgets(self):        \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438 \u0432\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"        box = toga.Box(style=Pack(direction=COLUMN, margin=10))         # \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b        self.checkbox1 = toga.Switch(\"\u041e\u043f\u0446\u0438\u044f 1\", on_change=self.on_switch_change)        self.checkbox2 = toga.Switch(            \"\u041e\u043f\u0446\u0438\u044f 2\", value=True, on_change=self.on_switch_change        )        box.add(self.checkbox1)        box.add(self.checkbox2)         box.add(toga.Divider(style=Pack(margin_top=10, margin_bottom=10)))         # \u0421\u043b\u0430\u0439\u0434\u0435\u0440        self.slider = toga.Slider(            min=0,            max=100,            value=50,            on_change=self.on_slider_change,            style=Pack(margin=5),        )        box.add(toga.Label(\"\u0420\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:\", style=Pack(margin_left=5)))        box.add(self.slider)        self.slider_value_label = toga.Label(\"50\", style=Pack(text_align=CENTER))        box.add(self.slider_value_label)         return box     def create_list_widgets(self):        \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u0432\"\"\"        box = toga.Box(style=Pack(direction=COLUMN, margin=10))         # \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a        self.simple_list = toga.DetailedList(            data=[                {                    \"icon\": toga.Icon(\"resources\/icon.png\"),                    \"title\": \"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 1\",                    \"subtitle\": \"\",                },                {                    \"icon\": toga.Icon(\"resources\/icon.png\"),                    \"title\": \"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 2\",                    \"subtitle\": \"\",                },                {                    \"icon\": toga.Icon(\"resources\/icon.png\"),                    \"title\": \"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 3\",                    \"subtitle\": \"\",                },            ],            on_select=self.on_list_select,            style=Pack(margin=5, height=100),        )        box.add(toga.Label(\"\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a:\", style=Pack(margin_left=5)))        box.add(self.simple_list)         # \u0422\u0430\u0431\u043b\u0438\u0446\u0430 (\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a)        table_data = [            (\"\u0418\u0432\u0430\u043d\", 25, \"\u041c\u043e\u0441\u043a\u0432\u0430\"),            (\"\u041c\u0430\u0440\u0438\u044f\", 30, \"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\"),            (\"\u0410\u043b\u0435\u043a\u0441\u0435\u0439\", 28, \"\u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\"),        ]        self.table = toga.Table(            headings=[\"\u0418\u043c\u044f\", \"\u0412\u043e\u0437\u0440\u0430\u0441\u0442\", \"\u0413\u043e\u0440\u043e\u0434\"],            data=table_data,            on_select=self.on_table_select,            style=Pack(margin=5, height=150),        )        box.add(toga.Label(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430:\", style=Pack(margin_left=5)))        box.add(self.table)         # \u0414\u0435\u0440\u0435\u0432\u043e        tree_data = {            (\"\u0420\u043e\u0441\u0441\u0438\u044f\",): [                (\"\u041c\u043e\u0441\u043a\u0432\u0430\", \"\u0421\u0442\u043e\u043b\u0438\u0446\u0430\"),                (\"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\", \"\u041a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u0430\u044f \u0441\u0442\u043e\u043b\u0438\u0446\u0430\"),            ],            (\"\u0421\u0428\u0410\",): [                (\"\u041d\u044c\u044e-\u0419\u043e\u0440\u043a\", \"\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0446\u0435\u043d\u0442\u0440\"),                (\"\u041b\u043e\u0441-\u0410\u043d\u0434\u0436\u0435\u043b\u0435\u0441\", \"\u041a\u0438\u043d\u043e\u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f\"),            ],        }        self.tree = toga.Tree(            headings=[\"\u0413\u043e\u0440\u043e\u0434\", \"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\"],            data=tree_data,            on_select=self.on_tree_select,            style=Pack(margin=5, height=150),        )        box.add(toga.Label(\"\u0414\u0435\u0440\u0435\u0432\u043e:\", style=Pack(margin_left=5)))        box.add(self.tree)         return box     def create_action_widgets(self):        \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\"\"\"        box = toga.Box(style=Pack(direction=COLUMN, margin=10))         # \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439        btn_box = toga.Box(style=Pack(direction=ROW, margin=5))         # \u041a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0430        dialog_btn = toga.Button(            \"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433\", on_press=self.show_dialog, style=Pack(margin=5, flex=1)        )        btn_box.add(dialog_btn)         # \u041a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430        file_btn = toga.Button(            \"\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b\", on_press=self.select_file, style=Pack(margin=5, flex=1)        )        btn_box.add(file_btn)         box.add(btn_box)         # \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f        self.progress_bar = toga.ProgressBar(            max=100, value=0, running=False, style=Pack(margin=10)        )        box.add(self.progress_bar)         # \u041a\u043d\u043e\u043f\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u043e\u043c        progress_btn_box = toga.Box(style=Pack(direction=ROW, margin=5))         start_btn = toga.Button(            \"\u0421\u0442\u0430\u0440\u0442\", on_press=self.start_progress, style=Pack(margin=5, flex=1)        )        progress_btn_box.add(start_btn)         stop_btn = toga.Button(            \"\u0421\u0442\u043e\u043f\", on_press=self.stop_progress, style=Pack(margin=5, flex=1)        )        progress_btn_box.add(stop_btn)         box.add(progress_btn_box)         # WebView (\u0431\u0440\u0430\u0443\u0437\u0435\u0440)        self.webview = toga.WebView(style=Pack(margin=5, height=200))        box.add(toga.Label(\"WebView:\", style=Pack(margin_left=5)))        box.add(self.webview)         # \u041a\u043d\u043e\u043f\u043a\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 URL        url_box = toga.Box(style=Pack(direction=ROW, margin=5))         self.url_input = toga.TextInput(            placeholder=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 URL\",            value=\"https:\/\/beeware.org\",            style=Pack(margin=5, flex=3),        )        url_box.add(self.url_input)         load_btn = toga.Button(            \"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c\", on_press=self.load_url, style=Pack(margin=5, flex=1)        )        url_box.add(load_btn)         box.add(url_box)         return box     # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439    def on_button_press(self, widget):        self.main_window.info_dialog(            \"\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435\", f\"\u041a\u043d\u043e\u043f\u043a\u0430 '{widget.text}' \u0431\u044b\u043b\u0430 \u043d\u0430\u0436\u0430\u0442\u0430!\"        )     def on_text_change(self, widget):        print(f\"\u0422\u0435\u043a\u0441\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d: {widget.value}\")     def on_switch_change(self, widget):        state = \"\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430\" if widget.value else \"\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430\"        print(f\"\u041e\u043f\u0446\u0438\u044f '{widget.text}' {state}\")     def on_date_change(self, widget):        selected_date = (            widget.value.strftime(\"%d.%m.%Y\") if widget.value else \"\u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u0430\"        )        print(f\"\u0412\u044b\u0431\u0440\u0430\u043d\u0430 \u0434\u0430\u0442\u0430: {selected_date}\")     def on_time_change(self, widget):        selected_time = widget.value.strftime(\"%H:%M\") if widget.value else \"\u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e\"        print(f\"\u0412\u044b\u0431\u0440\u0430\u043d\u043e \u0432\u0440\u0435\u043c\u044f: {selected_time}\")     def on_slider_change(self, widget):        self.slider_value_label.text = str(int(widget.value))        print(f\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430: {widget.value}\")     def on_list_select(self, widget):        if widget.selection:            print(f\"\u0412\u044b\u0431\u0440\u0430\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430: {widget.selection}\")     def on_table_select(self, widget):        if widget.selection:            name, age, city = widget.selection            print(f\"\u0412\u044b\u0431\u0440\u0430\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430: {name}, {age} \u043b\u0435\u0442, {city}\")     def on_tree_select(self, widget):        if widget.selection:            city, desc = widget.selection            print(f\"\u0412\u044b\u0431\u0440\u0430\u043d \u0443\u0437\u0435\u043b \u0434\u0435\u0440\u0435\u0432\u0430: {city} - {desc}\")     def show_dialog(self, widget):        self.main_window.question_dialog(            \"\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\",            \"\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435?\",            on_result=self.dialog_result,        )     def dialog_result(self, widget, result):        if result:            print(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\")        else:            print(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043c\u0435\u043d\u0438\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\")     def select_file(self, widget):        try:            file_path = self.main_window.open_file_dialog(                title=\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0439\u043b\", multiselect=False            )            if file_path:                print(f\"\u0412\u044b\u0431\u0440\u0430\u043d \u0444\u0430\u0439\u043b: {file_path}\")        except ValueError as exception:            print(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430: {exception}\")     def start_progress(self, widget):        self.progress_bar.start()        print(\"\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\")     def stop_progress(self, widget):        self.progress_bar.stop()        print(\"\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\")     def load_url(self, widget):        url = self.url_input.value.strip()        if url:            if not url.startswith((\"http:\/\/\", \"https:\/\/\")):                url = \"https:\/\/\" + url            self.webview.url = url            print(f\"\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c URL: {url}\")   def main():    return TogaDemoApp(        \"BeeWare Toga Demo\",        app_id=\"beeware.toga.demo\",        app_name=\"Example\",        icon=\"resources\/icon\",    )   if __name__ == \"__main__\":    app = main()    app.main_loop()<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/61c\/183\/698\/61c18369898e8440914382651b8ea4d1.png\" width=\"833\" height=\"637\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/61c\/183\/698\/61c18369898e8440914382651b8ea4d1.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/61c\/183\/698\/61c18369898e8440914382651b8ea4d1.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a5a\/b96\/f6d\/a5ab96f6d3a5cc85285581bd6cea1894.png\" width=\"843\" height=\"639\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a5a\/b96\/f6d\/a5ab96f6d3a5cc85285581bd6cea1894.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a5a\/b96\/f6d\/a5ab96f6d3a5cc85285581bd6cea1894.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/162\/b37\/e35\/162b37e358ece9656258ad0fe587e148.png\" width=\"828\" height=\"627\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/162\/b37\/e35\/162b37e358ece9656258ad0fe587e148.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/162\/b37\/e35\/162b37e358ece9656258ad0fe587e148.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2dc\/00f\/25f\/2dc00f25fb094e68c5066f51948e62a3.png\" width=\"846\" height=\"663\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2dc\/00f\/25f\/2dc00f25fb094e68c5066f51948e62a3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2dc\/00f\/25f\/2dc00f25fb094e68c5066f51948e62a3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p><strong>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"http:\/\/toga.App\">toga.App<\/a> \u043a\u0430\u043a \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u043f\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0430\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e OptionContainer.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0438\u0441\u0442\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430 UI \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0435: Label, Button, TextInput, MultilineTextInput, ImageView.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0432\u043e\u0434 \u0434\u0430\u043d\u043d\u044b\u0445: Switch, DatePicker, TimePicker, Slider.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043f\u0438\u0441\u043a\u0438: ListBox, Table, Tree.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f: ProgressBar, WebView.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u0430\u043b\u043e\u0433\u0438: info_dialog, question_dialog, open_file_dialog.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 on_press, on_change, on_select.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 BeeWare Toga<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c (\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Windows, macOS, Linux, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445).<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 resources \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u0444\u0430\u0439\u043b \u0438\u043a\u043e\u043d\u043a\u0438 icon.png.<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0412 \u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f BeeWare Toga \u0434\u043b\u044f GUI:<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><strong>Cricket<\/strong> \u2014 \u044d\u0442\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 Python, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 BeeWare. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Toga \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Podium<\/strong> \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 Toga, \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 BeeWare.<\/p>\n<\/li>\n<li>\n<p><strong>Travel Tips<\/strong> \u2014 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\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\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Toga \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 BeeWare.<\/p>\n<\/li>\n<\/ul>\n<p>BeeWare Toga \u2014 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u043b\u043e\u0434\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 PyQt \u0438\u043b\u0438 wxPython, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0435\u0433\u043e, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u2014 \u0447\u0430\u0441\u0442\u044c \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b BeeWare \u0438\u043b\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/div>\n<\/details>\n<h2>WxPython<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b9\/fe9\/b48\/2b9fe9b488c18c2e93d30d1940bd1250.png\" width=\"1840\" height=\"742\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2b9\/fe9\/b48\/2b9fe9b488c18c2e93d30d1940bd1250.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b9\/fe9\/b48\/2b9fe9b488c18c2e93d30d1940bd1250.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>Python-\u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 wxWidgets, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 C++. wxPython \u0441\u043e\u0437\u0434\u0430\u043b \u0414\u0436\u0443\u043b\u0438\u0430\u043d \u0421\u043c\u0430\u0440\u0442 (Julian Smart) \u0432 1992 \u0433\u043e\u0434\u0443.\u00a0<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0432\u0435\u0437\u0434 \u043d\u0430 <\/strong><a href=\"https:\/\/github.com\/wxWidgets\/Phoenix\"><strong><u>GitHub<\/u><\/strong><\/a>: 1,4k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u043c\u043c\u0438\u0442\u044b<\/strong>: \u0441\u0432\u044b\u0448\u0435 5,9k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/strong>: 4.2.2.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430: <\/strong>10 \u0430\u043f\u0440\u0435\u043b\u044f 2025 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430: <\/strong>12 \u0430\u043f\u0440\u0435\u043b\u044f 2025 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>wxPython \u0434\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c wxWidgets \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0434\u043b\u044f Windows, macOS \u0438 Linux. \u041e\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435. \u0412 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u2014 \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439. \u041f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0442, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0438\u043b\u0438 IDE. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 pip, \u043d\u043e \u0432\u0430\u0436\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Python (\u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 3.8).<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 wxPython \u043d\u0430 GitHub \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Phoenix (\u0424\u0435\u043d\u0438\u043a\u0441), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0438\u043c\u044f \u0431\u044b\u043b\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 wxPython \u2014 \u043f\u043e\u043b\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\u00a0<\/p>\n<p><strong>\u0414\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0438\u0434<\/strong>: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u043e\u0433\u0430\u0442\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b<\/strong>: \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0435\u0434\u0438\u043d\u044b\u0439 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u041e\u0421.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e<\/strong>: \u0434\u043e\u043b\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p><strong>\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c<\/strong>: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043c\u0430\u043a\u0435\u0442\u044b.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043a\u0440\u0443\u0442\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0437-\u0437\u0430 \u043e\u0431\u0438\u043b\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0430\u0437\u043c\u0435\u0440<\/strong>: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u044f\u0436\u0435\u043b\u0435\u0435 \u0438\u0437-\u0437\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 wxWidgets.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/strong>: \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u0433\u043e\u0434\u0430\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>wxPython \u0432 2025 \u0433\u043e\u0434\u0443 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u043e\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0445 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u042d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 GUI, \u043d\u043e \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u043c.<\/p>\n<p><strong>\u0412 \u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>Dropbox<\/strong> \u2014 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.\u00a0<\/p>\n<\/li>\n<li>\n<p><strong>BitTorrent<\/strong> \u2014 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 BitTorrent, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0411\u0440\u044d\u043c\u043e\u043c \u041a\u043e\u044d\u043d\u043e\u043c. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b wxPython \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0438\u0441\u043a Google<\/strong> \u2014 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 Google.<\/p>\n<\/li>\n<li>\n<p><strong>Editra<\/strong> \u2014 \u044d\u0442\u043e \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0434\u043b\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u0440\u043e\u0435\u043a\u0442 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u041a\u0440\u0438\u043a\u043e\u043c \u041c\u0430\u0446\u0446\u0438\u043e\u0442\u0442\u0438 (Cody Precord), \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 wxPython.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import wx  class MyFrame(wx.Frame):     def __init__(self, parent, title):         super(MyFrame, self).__init__(parent, title=title, size=(600, 400))                  self.panel = wx.Panel(self)         self.sizer = wx.BoxSizer(wx.VERTICAL)                  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b         self.create_widgets()                  # \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439         self.bind_events()                  self.panel.SetSizer(self.sizer)         self.Centre()         self.Show()          def create_widgets(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438\"\"\"                  # \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0435\u043a\u0441\u0442         self.title = wx.StaticText(self.panel, label=\"\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f wxPython \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432\")         self.title.SetFont(wx.Font(14, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))         self.sizer.Add(self.title, 0, wx.ALL | wx.CENTER, 10)                  # \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430         self.text_ctrl = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE, size=(400, 100))         self.sizer.Add(self.text_ctrl, 0, wx.ALL | wx.EXPAND, 10)                  # \u041a\u043d\u043e\u043f\u043a\u0438         button_sizer = wx.BoxSizer(wx.HORIZONTAL)                  self.btn_ok = wx.Button(self.panel, label=\"OK\")         self.btn_cancel = wx.Button(self.panel, label=\"Cancel\")         self.btn_clear = wx.Button(self.panel, label=\"Clear\")                  button_sizer.Add(self.btn_ok, 0, wx.ALL, 5)         button_sizer.Add(self.btn_cancel, 0, wx.ALL, 5)         button_sizer.Add(self.btn_clear, 0, wx.ALL, 5)                  self.sizer.Add(button_sizer, 0, wx.CENTER)                  # \u0427\u0435\u043a\u0431\u043e\u043a\u0441         self.checkbox = wx.CheckBox(self.panel, label=\"\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u044e\")         self.sizer.Add(self.checkbox, 0, wx.ALL, 10)                  # \u0420\u0430\u0434\u0438\u043e-\u043a\u043d\u043e\u043f\u043a\u0438         radio_box = wx.RadioBox(self.panel,                                 label=\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\",                                choices=[\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 1\", \"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 2\", \"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 3\"],                                majorDimension=1,                                style=wx.RA_SPECIFY_COLS)         self.sizer.Add(radio_box, 0, wx.ALL | wx.EXPAND, 10)                  # \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a         choices = [\"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 1\", \"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 2\", \"\u042d\u043b\u0435\u043c\u0435\u043d\u0442 3\"]         self.combo = wx.ComboBox(self.panel, choices=choices, style=wx.CB_READONLY)         self.sizer.Add(self.combo, 0, wx.ALL | wx.EXPAND, 10)                  # \u041f\u043e\u043b\u0437\u0443\u043d\u043e\u043a         self.slider = wx.Slider(self.panel, minValue=0, maxValue=100, style=wx.SL_HORIZONTAL | wx.SL_LABELS)         self.sizer.Add(self.slider, 0, wx.ALL | wx.EXPAND, 10)          def bind_events(self):         \"\"\"\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\"\"\"         self.btn_ok.Bind(wx.EVT_BUTTON, self.on_ok)         self.btn_cancel.Bind(wx.EVT_BUTTON, self.on_cancel)         self.btn_clear.Bind(wx.EVT_BUTTON, self.on_clear)         self.checkbox.Bind(wx.EVT_CHECKBOX, self.on_check)         self.combo.Bind(wx.EVT_COMBOBOX, self.on_combo)         self.slider.Bind(wx.EVT_SLIDER, self.on_slide)          def on_ok(self, event):         \"\"\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 OK\"\"\"         wx.MessageBox(\"\u0412\u044b \u043d\u0430\u0436\u0430\u043b\u0438 OK!\", \"\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f\", wx.OK | wx.ICON_INFORMATION)          def on_cancel(self, event):         \"\"\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 Cancel\"\"\"         self.Close()          def on_clear(self, event):         \"\"\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 Clear\"\"\"         self.text_ctrl.Clear()          def on_check(self, event):         \"\"\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\"\"\"         state = \"\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430\" if self.checkbox.GetValue() else \"\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0430\"         self.text_ctrl.AppendText(f\"\u041e\u043f\u0446\u0438\u044f {state}\\n\")          def on_combo(self, event):         \"\"\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u044b\u0431\u043e\u0440\u0430 \u0432 \u043a\u043e\u043c\u0431\u043e\u0431\u043e\u043a\u0441\u0435\"\"\"         selection = self.combo.GetStringSelection()         self.text_ctrl.AppendText(f\"\u0412\u044b\u0431\u0440\u0430\u043d: {selection}\\n\")          def on_slide(self, event):         \"\"\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u0430\"\"\"         value = self.slider.GetValue()         self.text_ctrl.AppendText(f\"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u0430: {value}\\n\")  if __name__ == \"__main__\":     app = wx.App()     frame = MyFrame(None, \"wxPython Demo\")     app.MainLoop()<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b wxPython:<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b<\/strong>:<\/p>\n<ul>\n<li>\n<p>wx.Frame \u2014 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>wx.Panel \u2014 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>wx.BoxSizer \u2014 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0412\u0438\u0434\u0436\u0435\u0442\u044b<\/strong>:<\/p>\n<ul>\n<li>\n<p>wx.StaticText \u2014 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u043c\u0435\u0442\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>wx.TextCtrl \u2014 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 (\u043e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0435\/\u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0435).<\/p>\n<\/li>\n<li>\n<p>wx.Button \u2014 \u043a\u043d\u043e\u043f\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>wx.CheckBox \u2014 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.<\/p>\n<\/li>\n<li>\n<p>wx.RadioBox \u2014 \u0433\u0440\u0443\u043f\u043f\u0430 \u0440\u0430\u0434\u0438\u043e\u043a\u043d\u043e\u043f\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>wx.ComboBox \u2014 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p>wx.Slider \u2014 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 Bind().<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a, \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430, \u043a\u043e\u043c\u0431\u043e\u0431\u043e\u043a\u0441\u0430 \u0438 \u043f\u043e\u043b\u0437\u0443\u043d\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 wxPython (pip install wxPython). \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fb9\/d41\/90f\/fb9d4190f314a17e1ab5c3ef0f17f2ef.png\" width=\"633\" height=\"420\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/fb9\/d41\/90f\/fb9d4190f314a17e1ab5c3ef0f17f2ef.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fb9\/d41\/90f\/fb9d4190f314a17e1ab5c3ef0f17f2ef.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/831\/cf9\/0ff\/831cf90ff41d1875986a823965acb224.png\" width=\"626\" height=\"431\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/831\/cf9\/0ff\/831cf90ff41d1875986a823965acb224.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/831\/cf9\/0ff\/831cf90ff41d1875986a823965acb224.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<h2>Remi<\/h2>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/82d\/fd7\/83f\/82dfd783fd4b882a5a9afe2c81cca644.png\" width=\"1852\" height=\"693\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/82d\/fd7\/83f\/82dfd783fd4b882a5a9afe2c81cca644.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/82d\/fd7\/83f\/82dfd783fd4b882a5a9afe2c81cca644.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>Remi \u0441\u043e\u0437\u0434\u0430\u043d \u0414\u0430\u0432\u0438\u0434\u043e\u043c \u0420\u043e\u0437\u043e\u0439 (Davide Rosa, \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u0430\u043a @dddomodossola) \u0438 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 2015 \u0433\u043e\u0434\u0443. \u041f\u0440\u043e\u0435\u043a\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0443 open-source.<\/p>\n<ul>\n<li>\n<p><strong>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0432\u0435\u0437\u0434 \u043d\u0430 <\/strong><a href=\"https:\/\/github.com\/rawpython\/remi\"><strong><u>GitHub<\/u><\/strong><\/a>: 3,6k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u043c\u043c\u0438\u0442\u044b<\/strong>: \u0441\u0432\u044b\u0448\u0435 1,4k.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f<\/strong>: 2022.7.27.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430: <\/strong>27 \u0438\u044e\u043b\u044f 2022 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430: <\/strong>9 \u043c\u0430\u0440\u0442\u0430 2025 \u0433\u043e\u0434\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>Remi (Remote Interface) \u2014 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 GUI \u0434\u043b\u044f Python, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u0432\u0435\u0431-\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. \u041e\u043d\u0430 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u0430\u043a Kivy \u0438\u043b\u0438 PyGObject, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 HTML. \u041a\u043e\u0434 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 Python, \u0430 Remi \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0435\u0433\u043e \u0432 HTML \u0438 JavaScript, \u0447\u0442\u043e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u043d\u0430\u0442\u044c \u0432\u0435\u0431-\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u0435\u0441\u0438\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 100 \u041a\u0431, \u0447\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0432\u0430\u0436\u043d\u0430 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 Raspberry Pi. \u0415\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u0438 \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445.<\/p>\n<p><strong>\u0414\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u041b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 (Windows, Linux, macOS, Android).<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430<\/strong>: \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c HTML\/CSS\/JavaScript, \u0442\u043e\u043b\u044c\u043a\u043e Python.<\/p>\n<\/li>\n<li>\n<p><strong>\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f<\/strong>: \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 Qt \u0438\u043b\u0438 GTK+.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0438\u0434<\/strong>: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0438\u0436\u0435, \u0447\u0435\u043c \u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>Remi \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432, \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0432\u0440\u043e\u0434\u0435 Raspberry Pi \u0438\u043b\u0438 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439, \u0433\u0434\u0435 \u0432\u0430\u0436\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438\u043b\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0435\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442\u044c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Remi \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u0430\u043c\u0438:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from remi import gui from remi import start, App   class RemiWidgetsExample(App):     def __init__(self, *args):         super(RemiWidgetsExample, self).__init__(*args)      def main(self):         # \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440         container = gui.VBox(width=500, height=500, margin='0px auto')         container.style['overflow'] = 'auto'         container.style['padding'] = '20px'         container.style['font-family'] = 'Arial, sans-serif'          # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a         title = gui.Label('\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 Remi', width='100%', height='30px')         title.style['font-size'] = '24px'         title.style['text-align'] = 'center'         title.style['margin-bottom'] = '20px'         container.append(title)          # 1. \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f         self.btn = gui.Button('\u041d\u0430\u0436\u043c\u0438 \u043c\u0435\u043d\u044f', width=200, height=100)         self.btn.style['margin'] = '10px auto'         self.btn.onclick.do(self.on_button_pressed)         container.append(self.btn)          # 2. \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435         self.text_input = gui.TextInput(width=300, height=150)         self.text_input.style['margin'] = '10px auto'         self.text_input.set_text('\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u0437\u0434\u0435\u0441\u044c')         container.append(self.text_input)          # 3. \u041c\u0435\u0442\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430         self.output_label = gui.Label('\u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442', width='90%')         self.output_label.style['margin'] = '10px auto'         self.output_label.style['padding'] = '10px'         self.output_label.style['background-color'] = '#f0f0f0'         container.append(self.output_label)          # 4. \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a         self.dropdown = gui.DropDown(width=200, height=30)         self.dropdown.style['margin'] = '10px auto'         for item in ['\u0412\u0430\u0440\u0438\u0430\u043d\u0442 1', '\u0412\u0430\u0440\u0438\u0430\u043d\u0442 2', '\u0412\u0430\u0440\u0438\u0430\u043d\u0442 3']:             self.dropdown.append(gui.DropDownItem(item))         self.dropdown.onchange.do(self.on_dropdown_change)         container.append(self.dropdown)          # 5. \u0427\u0435\u043a\u0431\u043e\u043a\u0441         self.checkbox = gui.CheckBoxLabel('\u0421\u043e\u0433\u043b\u0430\u0441\u0435\u043d \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c\u0438', width=200)         self.checkbox.style['margin'] = '10px auto'         self.checkbox.onchange.do(self.on_checkbox_change)         container.append(self.checkbox)          # 6. \u0421\u043b\u0430\u0439\u0434\u0435\u0440         self.slider = gui.Slider(min=0, max=100, step=1, width=300)         self.slider.style['margin'] = '20px auto'         self.slider_label = gui.Label('\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435: 50', width=300)         self.slider_label.style['margin'] = '0 auto'         self.slider.onchange.do(self.on_slider_change)         container.append(self.slider)         container.append(self.slider_label)          # 7. \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435         try:             self.image = gui.Image('\/res:logo.png', width=100, height=100)             self.image.style['margin'] = '10px auto'             container.append(self.image)         except:             pass          return container      # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439     def on_button_pressed(self, widget):         self.output_label.set_text(f'\u041a\u043d\u043e\u043f\u043a\u0430 \u043d\u0430\u0436\u0430\u0442\u0430! \u0422\u0435\u043a\u0441\u0442: {self.text_input.get_text()}')      def on_dropdown_change(self, widget, value):         self.output_label.set_text(f'\u0412\u044b\u0431\u0440\u0430\u043d: {value}')      def on_checkbox_change(self, widget, value):         status = \"\u0414\u0430\" if value else \"\u041d\u0435\u0442\"         self.output_label.set_text(f'\u0421\u043e\u0433\u043b\u0430\u0441\u0435\u043d: {status}')      def on_slider_change(self, widget, value):         self.slider_label.set_text(f'\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435: {value}')   # \u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f if __name__ == \"__main__\":     start(RemiWidgetsExample, address='0.0.0.0', port=0,            multiple_instance=False, enable_file_cache=True,            update_interval=0.1, start_browser=True)<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a52\/d6b\/610\/a52d6b610b3107dfb6a15d28d1087791.png\" width=\"935\" height=\"729\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a52\/d6b\/610\/a52d6b610b3107dfb6a15d28d1087791.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a52\/d6b\/610\/a52d6b610b3107dfb6a15d28d1087791.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ad9\/d70\/600\/ad9d706009965554fb41a13e7e9aaa81.png\" width=\"931\" height=\"733\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ad9\/d70\/600\/ad9d706009965554fb41a13e7e9aaa81.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ad9\/d70\/600\/ad9d706009965554fb41a13e7e9aaa81.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/438\/297\/507\/438297507f93b6eeaef712c8073f4078.png\" width=\"942\" height=\"727\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/438\/297\/507\/438297507f93b6eeaef712c8073f4078.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/438\/297\/507\/438297507f93b6eeaef712c8073f4078.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p><strong>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0442 <code>App<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 main() \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b<\/strong>:<\/p>\n<ul>\n<li>\n<p><code>Button<\/code> \u2014 \u043a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><code>TextInput<\/code> \u2014 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><code>Label<\/code> \u2014 \u043c\u0435\u0442\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><code>DropDown<\/code> \u2014 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p><code>CheckBoxLabel<\/code> \u2014 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p><code>Slider<\/code> \u2014 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><code>Image<\/code> \u2014 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u0412\u0441\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e CSS-\u0441\u0442\u0438\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (VBox).<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u043a\u043e\u0434 \u0432 \u0444\u0430\u0439\u043b <code>remi_example.py<\/code> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435:<\/p>\n<pre><code class=\"python\">python remi_example.py<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<\/div>\n<\/details>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 remi \u043d\u0435 \u0442\u0430\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430 \u0432 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445<\/h3>\n<p>\u041f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0443 remi \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0430\u0431\u044b\u0445 \u043c\u0435\u0441\u0442:<\/p>\n<ul>\n<li>\n<p>\u041c\u0435\u043d\u044c\u0448\u0430\u044f \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041c\u0435\u043d\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438, \u043a\u0430\u043a \u0441\u0432\u044f\u0437\u043a\u0430 Flask\/Django + \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 JavaScript \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>Remi \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432, \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0445\u043e\u0447\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c GUI, \u043d\u0435 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u044f\u0441\u044c \u0432 \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443.<\/p>\n<h2>\u0427\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435<\/h2>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0442\u044c GUI-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f Python \u0432 2025 \u0433\u043e\u0434\u0443 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438: <\/p>\n<ul>\n<li>\n<p>Tkinter \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439.<\/p>\n<\/li>\n<li>\n<p>Qt \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0446\u0435\u043b\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>Kivy \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 Android \u0438 iOS. <\/p>\n<\/li>\n<li>\n<p>Toga \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043d\u0430 \u0434\u0435\u0441\u043a\u0442\u043e\u043f\u0435. <\/p>\n<\/li>\n<li>\n<p>wxPython \u0445\u043e\u0440\u043e\u0448 \u0434\u043b\u044f \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e\u0434 Windows, macOS \u0438 Linux.<\/p>\n<\/li>\n<li>\n<p>PyGObject \u2014 \u0434\u043b\u044f GNOME- \u0438 Linux-\u0441\u0440\u0435\u0434. <\/p>\n<\/li>\n<li>\n<p>Remi \u2014 \u043b\u0435\u0433\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 Raspberry Pi. <\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0441\u044b \u0438 \u043c\u0438\u043d\u0443\u0441\u044b. \u041b\u0443\u0447\u0448\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0430\u043c.<\/p>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0430\u0432\u043e\u0440\u0438\u0442\u044b, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u043e \u043d\u0438\u0445 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0411\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/903142\/\"> https:\/\/habr.com\/ru\/articles\/903142\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041b\u0435\u0448\u0430 \u0416\u0438\u0440\u044f\u043a\u043e\u0432, \u044f \u0442\u0435\u0445\u043b\u0438\u0434 \u0431\u044d\u043a\u0435\u043d\u0434-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u0438\u0442\u0440\u0438\u043d\u044b KION, \u0430 \u0435\u0449\u0435 \u0432 \u041c\u0422\u0421 \u044f \u0432\u043e\u0437\u0433\u043b\u0430\u0432\u043b\u044f\u044e Python-\u0433\u0438\u043b\u044c\u0434\u0438\u044e.<\/p>\n<p>\u0412 2025 \u0433\u043e\u0434\u0443 Python \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 (GUI) \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0434\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0412 \u044d\u0442\u043e\u0439 \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0435 \u2014 \u0448\u0435\u0441\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u0444\u0438\u0448\u043a\u0430\u043c\u0438. \u041f\u043e\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0441\u044f \u0432 \u043c\u0438\u0440 \u043a\u043d\u043e\u043f\u043e\u043a, \u043e\u043a\u043e\u043d \u0438 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u2014 \u043e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0438 \u0434\u043e \u044f\u0440\u043a\u0438\u0445 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 GitHub.<\/p>\n<h2>Tkinter<\/h2>\n<figure class=\"full-width\"><\/figure>\n<p>Tkinter \u043a\u0430\u043a Python-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 1990-\u0445, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u0438 \u0443\u0447\u0430\u0441\u0442\u0438\u0438 \u0413\u0432\u0438\u0434\u043e \u0432\u0430\u043d \u0420\u043e\u0441\u0441\u0443\u043c\u0430 (Guido van Rossum) \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u043d\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 Python. \u0412 \u0430\u043f\u0440\u0435\u043b\u0435 2025 \u0433\u043e\u0434\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Python (3.12+) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Tcl\/Tk 8.6.13.<\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0442\u043e \u044d\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Python \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438\u0437 \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0438, \u044f \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u0438 \u0437\u0432\u0435\u0437\u0434\u044b. \u041e\u043d\u0430 \u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u043d\u0430\u0431\u043e\u0440 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 (\u043a\u043d\u043e\u043f\u043a\u0438, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f, \u043c\u0435\u0442\u043a\u0438, \u043c\u0435\u043d\u044e \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435) \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u044b \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 (pack, grid, place) \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0430\u0437\u0430 \u2014 Tcl\/Tk, \u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0430\u044f (Windows, macOS, Linux). Tkinter \u043f\u0440\u043e\u0441\u0442 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u043d\u0435\u0442, \u0430 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u044e\u0437\u0435\u0440\u043e\u0432 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432. \u0415\u0449\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c ttk (Themed Tk), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u0442\u0438\u043b\u0435\u043c.<\/p>\n<p><strong>\u0414\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u0430<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u0434\u0435\u0442 \u0441 Python.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430<\/strong>: \u043b\u0435\u0433\u043a\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c Python \u0438 Tcl\/Tk.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong>: \u0437\u0440\u0435\u043b\u0430\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u0430\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043e\u0449\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b<\/strong>: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f \u0438 \u043a\u0430\u043d\u0432\u0430\u0441 (Canvas) \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/strong>:<\/p>\n<ul>\n<li>\n<p><strong>\u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434<\/strong>: \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b Tkinter \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u0442\u0430\u0440\u043e\u043c\u043e\u0434\u043d\u043e \u0431\u0435\u0437 ttk.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/strong>: \u043d\u0435\u0442 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0438\u043b\u0438 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u044d\u0442\u043e \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 GUI-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 2025 \u0433\u043e\u0434\u0443. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0446\u0435\u043d\u0438\u0442\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. \u0414\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b. \u041e \u043d\u0438\u0445 \u2014 \u043d\u0438\u0436\u0435.<\/p>\n<p><strong>\u0412 \u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>IDLE<\/strong> (Python&#8217;s Integrated Development Environment) \u2014 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f IDE Python, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Tkinter.<\/p>\n<\/li>\n<li>\n<p><strong>Thonny<\/strong> \u2014 \u044d\u0442\u043e IDE \u0434\u043b\u044f Python, \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0446\u0435\u043b\u0438, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Tkinter.<\/p>\n<\/li>\n<li>\n<p><strong>Matplotlib<\/strong> (\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 TkAgg) \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 Python. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Tkinter \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0438\u0437 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p><strong>Pillow<\/strong> (PIL Fork) \u2014 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 Tkinter.<\/p>\n<\/li>\n<li>\n<p><strong>Pmw<\/strong> (Python Mega Widgets) \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0432\u0435\u0440\u0445 Tkinter.<\/p>\n<\/li>\n<li>\n<p><strong>SymPy<\/strong> (Plotting \u0441 Tkinter) \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 SymPy \u0434\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Tkinter \u0432 \u0441\u0432\u043e\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import tkinter as tk from tkinter import ttk, messagebox, filedialog  class TkinterDemoApp:     def __init__(self, root):         self.root = root         self.root.title(\"\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f Tkinter \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432\")         self.root.geometry(\"800x600\")         self.root.resizable(True, True)                  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0438\u043b\u0435\u0439         self.style = ttk.Style()         self.style.theme_use('clam')                  self.create_widgets()          def create_widgets(self):         # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443         self.main_frame = ttk.Frame(self.root, padding=\"10\")         self.main_frame.pack(fill=tk.BOTH, expand=True)                  # \u041f\u0430\u043d\u0435\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043e\u043a         self.notebook = ttk.Notebook(self.main_frame)         self.notebook.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)                  # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b\"         self.basic_tab = ttk.Frame(self.notebook)         self.notebook.add(self.basic_tab, text=\"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435\")         self.create_basic_widgets()                  # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u044b\"         self.advanced_tab = ttk.Frame(self.notebook)         self.notebook.add(self.advanced_tab, text=\"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435\")         self.create_advanced_widgets()                  # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f\"         self.actions_tab = ttk.Frame(self.notebook)         self.notebook.add(self.actions_tab, text=\"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f\")         self.create_actions_widgets()          def create_basic_widgets(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432\"\"\"         frame = ttk.LabelFrame(self.basic_tab, text=\"\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\", padding=\"10\")         frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)                  # \u041c\u0435\u0442\u043a\u0430 \u0438 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430         ttk.Label(frame, text=\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:\").grid(row=0, column=0, sticky=tk.W, pady=2)         self.username_entry = ttk.Entry(frame)         self.username_entry.grid(row=0, column=1, sticky=tk.EW, padx=5, pady=2)                  # \u041f\u0430\u0440\u043e\u043b\u044c         ttk.Label(frame, text=\"\u041f\u0430\u0440\u043e\u043b\u044c:\").grid(row=1, column=0, sticky=tk.W, pady=2)         self.password_entry = ttk.Entry(frame, show=\"*\")         self.password_entry.grid(row=1, column=1, sticky=tk.EW, padx=5, pady=2)                  # \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b         self.remember_var = tk.BooleanVar()         ttk.Checkbutton(frame, text=\"\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043c\u0435\u043d\u044f\", variable=self.remember_var).grid(             row=2, column=0, columnspan=2, sticky=tk.W, pady=5)                  # \u0420\u0430\u0434\u0438\u043e\u043a\u043d\u043e\u043f\u043a\u0438         ttk.Label(frame, text=\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:\").grid(row=3, column=0, sticky=tk.W, pady=2)         self.radio_var = tk.StringVar(value=\"option1\")         ttk.Radiobutton(frame, text=\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 1\", value=\"option1\", variable=self.radio_var).grid(             row=4, column=0, sticky=tk.W)         ttk.Radiobutton(frame, text=\"\u0412\u0430\u0440\u0438\u0430\u043d\u0442 2\", value=\"option2\", variable=self.radio_var).grid(             row=4, column=1, sticky=tk.W)                  # \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a         ttk.Label(frame, text=\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0433\u043e\u0440\u043e\u0434:\").grid(row=5, column=0, sticky=tk.W, pady=2)         self.city_combo = ttk.Combobox(frame, values=[\"\u041c\u043e\u0441\u043a\u0432\u0430\", \"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\", \"\u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\", \"\u0415\u043a\u0430\u0442\u0435\u0440\u0438\u043d\u0431\u0443\u0440\u0433\"])         self.city_combo.grid(row=5, column=1, sticky=tk.EW, padx=5, pady=2)         self.city_combo.current(0)                  # \u0428\u043a\u0430\u043b\u0430 (Slider)         ttk.Label(frame, text=\"\u0423\u0440\u043e\u0432\u0435\u043d\u044c:\").grid(row=6, column=0, sticky=tk.W, pady=2)         self.scale = ttk.Scale(frame, from_=0, to=100, orient=tk.HORIZONTAL)         self.scale.grid(row=6, column=1, sticky=tk.EW, padx=5, pady=2)                  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0435\u0441\u0430 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u044f         frame.columnconfigure(1, weight=1)          def create_advanced_widgets(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432\"\"\"         frame = ttk.LabelFrame(self.advanced_tab, text=\"\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\", padding=\"10\")         frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)                  # \u0414\u0435\u0440\u0435\u0432\u043e (Treeview)         self.tree = ttk.Treeview(frame, columns=(\"name\", \"age\", \"city\"), show=\"headings\")         self.tree.heading(\"name\", text=\"\u0418\u043c\u044f\")         self.tree.heading(\"age\", text=\"\u0412\u043e\u0437\u0440\u0430\u0441\u0442\")         self.tree.heading(\"city\", text=\"\u0413\u043e\u0440\u043e\u0434\")                  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435         self.tree.insert(\"\", tk.END, values=(\"\u0418\u0432\u0430\u043d \u0418\u0432\u0430\u043d\u043e\u0432\", 25, \"\u041c\u043e\u0441\u043a\u0432\u0430\"))         self.tree.insert(\"\", tk.END, values=(\"\u041f\u0435\u0442\u0440 \u041f\u0435\u0442\u0440\u043e\u0432\", 30, \"\u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\"))         self.tree.insert(\"\", tk.END, values=(\"\u0410\u043d\u043d\u0430 \u0421\u0438\u0434\u043e\u0440\u043e\u0432\u0430\", 22, \"\u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\"))                  self.tree.grid(row=0, column=0, columnspan=2, sticky=tk.NSEW, pady=5)                  # \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0431\u0430\u0440         self.progress = ttk.Progressbar(frame, orient=tk.HORIZONTAL, length=200, mode=\"determinate\")         self.progress.grid(row=1, column=0, columnspan=2, sticky=tk.EW, pady=5)                  # \u041f\u0430\u043d\u0435\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438         sub_notebook = ttk.Notebook(frame)         sub_notebook.grid(row=2, column=0, columnspan=2, sticky=tk.NSEW, pady=5)                  tab1 = ttk.Frame(sub_notebook)         tab2 = ttk.Frame(sub_notebook)                  sub_notebook.add(tab1, text=\"\u0412\u043a\u043b\u0430\u0434\u043a\u0430 1\")         sub_notebook.add(tab2, text=\"\u0412\u043a\u043b\u0430\u0434\u043a\u0430 2\")                  ttk.Label(tab1, text=\"\u042d\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\").pack(pady=20)         ttk.Label(tab2, text=\"\u042d\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\").pack(pady=20)                  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0432\u0435\u0441\u0430 \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u043d\u0438\u044f         frame.columnconfigure(0, weight=1)         frame.rowconfigure(0, weight=1)          def create_actions_widgets(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\"\"\"         frame = ttk.LabelFrame(self.actions_tab, text=\"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f\", padding=\"10\")         frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)                  # \u041a\u043d\u043e\u043f\u043a\u0438         ttk.Button(frame, text=\"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\", command=self.show_message).grid(             row=0, column=0, sticky=tk.EW, padx=5, pady=5)                  ttk.Button(frame, text=\"\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\", command=self.start_progress).grid(             row=0, column=1, sticky=tk.EW, padx=5, pady=5)                  ttk.Button(frame, text=\"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b\", command=self.open_file).grid(             row=1, column=0, sticky=tk.EW, padx=5, pady=5)                  ttk.Button(frame, text=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b\", command=self.save_file).grid(             row=1, column=1,<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-456924","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/456924","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=456924"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/456924\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=456924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=456924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=456924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}