{"id":338648,"date":"2022-09-22T15:01:10","date_gmt":"2022-09-22T15:01:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=338648"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=338648","title":{"rendered":"<span>GUI \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u043d\u0430 Python<\/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 loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/560\/7d5\/87a\/5607d587af4ac5bc6da195e976b21e26.png\" width=\"1280\" height=\"720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/560\/7d5\/87a\/5607d587af4ac5bc6da195e976b21e26.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0428\u0442\u043e\u0448. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043d\u0430\u0443\u0447\u0443 \u0432\u0430\u0441 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0437\u044b\u043a Python \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 PySide6 &#8212; \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Qt.<\/p>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043c\u0435\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0438, \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430. \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430. \u041f\u0443\u043b \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438. \u0421\u0438\u043b\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430 <a href=\"https:\/\/github.com\/lesskop\/password-generator\" rel=\"noopener noreferrer nofollow\">GitHub.<\/a><\/p>\n<h2>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435<\/h2>\n<p>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 <a href=\"https:\/\/www.python.org\/downloads\/\" rel=\"noopener noreferrer nofollow\">Python<\/a> \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e). \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Python \u0432\u0435\u0440\u0441\u0438\u0438 3.7+<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <code>password-generator<\/code> \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>venvPasswordGenerator<\/code><\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/pypi.org\/project\/PySide6\/\" rel=\"noopener noreferrer nofollow\">PySide6.<\/a><\/p>\n<p><code>pip install pyside6<\/code><\/p>\n<p><a href=\"https:\/\/doc.qt.io\/qtforpython\/index.html\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Qt for Python.<\/a><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <a href=\"https:\/\/doc.qt.io\/qt-6\/qtdesigner-manual.html\" rel=\"noopener noreferrer nofollow\">Qt Designer.<\/a> \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p><code>venv*\/Lib\/site-packages\/PySide6\/designer<\/code><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8c1\/01c\/656\/8c101c6563d780d0b051290d71a151fe.png\" alt=\"\u041e\u043a\u043d\u043e \u043d\u043e\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 Qt Designer\" title=\"\u041e\u043a\u043d\u043e \u043d\u043e\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 Qt Designer\" width=\"500\" height=\"478\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8c1\/01c\/656\/8c101c6563d780d0b051290d71a151fe.png\"\/><figcaption>\u041e\u043a\u043d\u043e \u043d\u043e\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 Qt Designer<\/figcaption><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <code>MainWindow<\/code>. \u0423\u0431\u0438\u0440\u0430\u0435\u043c <code>menubar<\/code> \u0438 <code>statusbar<\/code> <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/683\/61e\/4b9\/68361e4b9a3e76f7c380aaf6da0b63d1.png\" width=\"267\" height=\"167\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/683\/61e\/4b9\/68361e4b9a3e76f7c380aaf6da0b63d1.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u042f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u0435\u0433\u043e <code>main.ui<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u044f \u043c\u043e\u0433\u0443 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u043b\u0438 \u0435\u0449\u0435 \u0447\u0435\u0433\u043e-\u0442\u043e.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043a\u0438\u043d\u0435\u043c 4 <code>Horizontal Layout<\/code> \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0441 \u0437\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0435\u0439 <code>Ctrl<\/code>. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/627\/527\/471\/627527471e8d982cfcb639f4b2c18494.png\" width=\"876\" height=\"536\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/627\/527\/471\/627527471e8d982cfcb639f4b2c18494.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u044b\u0431\u0435\u0440\u0435\u043c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430. <code>centralwidget -> Lay Out Vertically<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/320\/4e6\/758\/3204e6758fcc816c82a1b0acdfe79c6b.png\" width=\"1026\" height=\"582\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/320\/4e6\/758\/3204e6758fcc816c82a1b0acdfe79c6b.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/h3>\n<p>\u0417\u0430\u043a\u0438\u043d\u0435\u043c \u043e\u0434\u043d\u0443 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043d\u0438\u0436\u043d\u044e\u044e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0443. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8bd\/6e0\/e68\/8bd6e0e68411ef58e8778148b563f916.png\" width=\"872\" height=\"542\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8bd\/6e0\/e68\/8bd6e0e68411ef58e8778148b563f916.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043c\u0435\u043b\u0430 2 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>checkable<\/code><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3d0\/e04\/132\/3d0e0413256f492420efbc198f309cfb.png\" width=\"406\" height=\"411\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3d0\/e04\/132\/3d0e0413256f492420efbc198f309cfb.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 3 \u0440\u0430\u0437\u0430. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0435\u043a\u0441\u0442. \u042f \u0434\u0443\u043c\u0430\u044e, \u0442\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0437\u0430 \u043a\u0430\u043a\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1e1\/820\/06d\/1e182006d9f3e757064f77d86a4ac326.png\" width=\"608\" height=\"144\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1e1\/820\/06d\/1e182006d9f3e757064f77d86a4ac326.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0434\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430. <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/752\/434\/386\/752434386c30562b76469204154e9ec7.png\" width=\"408\" height=\"270\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/752\/434\/386\/752434386c30562b76469204154e9ec7.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>checked<\/code> \u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u0445, \u043a\u0440\u043e\u043c\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c9b\/359\/adc\/c9b359adc13eef5633983c45f7c3ec43.png\" width=\"1016\" height=\"327\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c9b\/359\/adc\/c9b359adc13eef5633983c45f7c3ec43.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u0434\u043b\u0438\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044f<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u0438\u043d\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430. \u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0443 \u044f \u043d\u0430\u0437\u043e\u0432\u0443 <code>layout_length<\/code>, \u0441\u043b\u0430\u0439\u0434\u0435\u0440 &#8212; <code>slider_length<\/code>, \u0441\u0447\u0435\u0442\u0447\u0438\u043a &#8212; <code>spinbox_length<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/434\/46c\/9c1\/43446c9c1760c301f422aec9164f6dfc.png\" width=\"872\" height=\"405\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/434\/46c\/9c1\/43446c9c1760c301f422aec9164f6dfc.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f<\/h2>\n<p>\u0417\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043b\u0435\u0439\u0431\u043b. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c85\/06c\/f84\/c8506cf84a7adcba2499be2ce4b27b1e.png\" width=\"580\" height=\"268\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c85\/06c\/f84\/c8506cf84a7adcba2499be2ce4b27b1e.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443. <\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8fe\/1a5\/375\/8fe1a53757b54a1cfa4f7ddeaeedebcc.png\" width=\"405\" height=\"381\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8fe\/1a5\/375\/8fe1a53757b54a1cfa4f7ddeaeedebcc.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0432\u0432\u043e\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9e8\/e69\/6f1\/9e8e696f126d807177c2a27fbefd8008.png\" width=\"998\" height=\"353\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e8\/e69\/6f1\/9e8e696f126d807177c2a27fbefd8008.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u0440\u043e\u043b\u044f<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0432\u0441\u0442\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u041a\u0430\u043a \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 Line Edit? \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0432 Qt Designer \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b. \u041b\u0443\u0447\u0448\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u044f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0440\u044f\u0434\u043e\u043c \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p><code>Widget Box -> Containers -> Frame<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7ac\/8b9\/256\/7ac8b9256753efa15489f1f8ef84c1ea.png\" width=\"998\" height=\"207\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ac\/8b9\/256\/7ac8b9256753efa15489f1f8ef84c1ea.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b42\/da9\/20e\/b42da920eb95c2b820e6dd91040b66cf.png\" width=\"999\" height=\"227\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b42\/da9\/20e\/b42da920eb95c2b820e6dd91040b66cf.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c 2 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0443, \u0430 \u043d\u0435 \u0432\u043e \u0444\u0440\u0435\u0439\u043c. \u041f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0443\u0436\u043d\u043e \u0432 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u0440\u0430\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/653\/60f\/11a\/65360f11adc606a51bcd80166a826d5d.png\" width=\"996\" height=\"353\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/653\/60f\/11a\/65360f11adc606a51bcd80166a826d5d.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0449\u0435 \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0440\u0445\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u043a\u0430. \u041d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435, \u0432 Qt Designer \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0431\u044b\u0432\u0430\u0442\u044c. \u0415\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043b\u0435\u0439\u0431\u043b\u0430 \u0438 \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>pixmap<\/code>, \u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0438\u043a\u043e\u043d\u043a\u0443 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/916\/53e\/a17\/91653ea179bca7101f00c535e9a71fa3.png\" width=\"999\" height=\"383\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/916\/53e\/a17\/91653ea179bca7101f00c535e9a71fa3.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0418\u043a\u043e\u043d\u043a\u0438 Material Icons<\/h3>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 <a href=\"https:\/\/fonts.google.com\/icons?icon.set=Material+Icons\" rel=\"noopener noreferrer nofollow\">Material Icons.<\/a><\/p>\n<p>\u0421\u043a\u0430\u0447\u0430\u0435\u043c \u0431\u0435\u043b\u0443\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Alock%3A\" rel=\"noopener noreferrer nofollow\">\u0438\u043a\u043e\u043d\u043a\u0443 \u0437\u0430\u043c\u043a\u0430<\/a>. \u042f \u0432\u044b\u0431\u0435\u0440\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0438\u0434 &#8212; Outlined. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u044f\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439, \u043a\u0430\u043a \u0432\u0430\u043c \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c95\/c8a\/774\/c95c8a77402811b15c6f73faf34858dd.png\" width=\"799\" height=\"588\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c95\/c8a\/774\/c95c8a77402811b15c6f73faf34858dd.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u044c\u043c\u0435\u043c <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Arefresh%3A\" rel=\"noopener noreferrer nofollow\">Refresh.<\/a> \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 &#8212; <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Acontent_copy%3A\" rel=\"noopener noreferrer nofollow\">Content Copy.<\/a> \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044f &#8212; <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Avisibility%3A\" rel=\"noopener noreferrer nofollow\">Visibility<\/a> \u0438 <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Avisibility_off%3A\" rel=\"noopener noreferrer nofollow\">Visibility Off<\/a>. \u0414\u043b\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0447\u0435\u0440\u043d\u0443\u044e <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Akey%3A\" rel=\"noopener noreferrer nofollow\">\u0438\u043a\u043e\u043d\u043a\u0443 \u043a\u043b\u044e\u0447\u0430<\/a> \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>png<\/code> \u0438 \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0451 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u0438\u043a\u043e\u043d\u043e\u043a <code>ico<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/534\/a7a\/9ce\/534a7a9ce1b5228c3ff9079bbc6921fb.png\" alt=\"\u0418\u043a\u043e\u043d\u043a\u0438 \u0432 Windows File Explorer\" title=\"\u0418\u043a\u043e\u043d\u043a\u0438 \u0432 Windows File Explorer\" width=\"683\" height=\"189\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/534\/a7a\/9ce\/534a7a9ce1b5228c3ff9079bbc6921fb.png\"\/><figcaption>\u0418\u043a\u043e\u043d\u043a\u0438 \u0432 Windows File Explorer<\/figcaption><\/figure>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0438. \u041f\u043e\u0437\u0436\u0435 \u043c\u044b \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0432 Python \u043a\u043e\u0434. <code>Resource Browser -> Edit Resources -> New Resource File -> resources.qrc<\/code><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>icons<\/code><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/461\/2b3\/919\/4612b3919e3a36410efea51da058c3f4.png\" width=\"469\" height=\"347\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/461\/2b3\/919\/4612b3919e3a36410efea51da058c3f4.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u043a\u043e\u043d\u043e\u043a.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/808\/53e\/b97\/80853eb97f8aeb7ed1f8e3d00741ea1b.png\" width=\"470\" height=\"346\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/808\/53e\/b97\/80853eb97f8aeb7ed1f8e3d00741ea1b.png\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e9d\/758\/71a\/e9d75871a004f0d787072e51c4a1a1ba.png\" width=\"469\" height=\"221\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e9d\/758\/71a\/e9d75871a004f0d787072e51c4a1a1ba.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0438<\/h3>\n<p>\u0412 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0442\u0430\u0432\u0438\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u0437\u0430\u043c\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>icon -> Disabled On<\/code>. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Choose Resource<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5b5\/801\/445\/5b5801445eeb2df4866f0a421bf55b43.png\" width=\"800\" height=\"356\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5b5\/801\/445\/5b5801445eeb2df4866f0a421bf55b43.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>checkable<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u0442\u043e\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 2 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0421\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u043c <code>checked<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a65\/d99\/778\/a65d99778aac4a1c69c5dab26ca4c0c1.png\" width=\"566\" height=\"272\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a65\/d99\/778\/a65d99778aac4a1c69c5dab26ca4c0c1.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 <code>Normal Off<\/code> \u0431\u0435\u0440\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0432 <code>Normal On<\/code> &#8212; \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9ae\/cf6\/b98\/9aecf6b984b547b46203956b2e3ff3d9.png\" width=\"584\" height=\"297\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9ae\/cf6\/b98\/9aecf6b984b547b46203956b2e3ff3d9.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 <code>Normal On<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/78c\/2a7\/14a\/78c2a714a8b670bddfae1c2f8744168d.png\" width=\"539\" height=\"289\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/78c\/2a7\/14a\/78c2a714a8b670bddfae1c2f8744168d.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u0442\u0438\u043b\u0438\u0437\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h3>\n<p>\u0414\u043b\u044f \u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a CSS. \u041f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0432 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u042f \u043f\u0438\u0448\u0443 \u0432 Visual Studio Code, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435.<\/p>\n<h4>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e<\/h4>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <code>QMainWindow.css<\/code>. \u0414\u043b\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0446\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 <code>#121212<\/code>, \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430, \u0448\u0440\u0438\u0444\u0442 Verdana \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 16 \u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"css\">QWidget {     background-color: #121212;     color: white;     font-family: Verdana;     font-size: 16pt;     margin: 10px; }<\/code><\/pre>\n<p> \u0414\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043f\u043b\u043e\u0448\u043d\u0443\u044e \u0441\u0435\u0440\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 2 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0441 \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. <\/p>\n<pre><code class=\"css\">QPushButton {     border: 2px solid gray;     border-radius: 5px; }<\/code><\/pre>\n<p>\u0412\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u0434 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>MainWindow<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0446\u0438\u0438 Change <code>styleSheet<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/26e\/1ce\/e67\/26e1cee67d9c71b8cf2da6b8d46b5d6b.png\" width=\"897\" height=\"363\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/26e\/1ce\/e67\/26e1cee67d9c71b8cf2da6b8d46b5d6b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c.<\/p>\n<pre><code class=\"css\">QPushButton#btn_lower, #btn_upper, #btn_digits, #btn_special {     padding: 10px; }<\/code><\/pre>\n<p> \u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0446\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0439 <code>#090<\/code>. <\/p>\n<pre><code class=\"css\">QPushButton:hover {     border-color: #090; }<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e 4 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"css\">QPushButton:pressed {     border: 4px solid #090;     border-radius: 5px; }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430 \u0444\u043e\u043d \u0442\u0435\u043c\u043d\u043e-\u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 <code>#006300<\/code>.<\/p>\n<pre><code class=\"css\">QPushButton:checked {     background-color: #006300;     border-color: #090; }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>QMainWindow.css<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"css\">QWidget {     background-color: #121212;     color: white;     font-family: Verdana;     font-size: 16pt;     margin: 10px; }  QPushButton {     border: 2px solid gray;     border-radius: 5px; }  QPushButton#btn_lower, #btn_upper, #btn_digits, #btn_special {     padding: 10px; }  QPushButton:hover {     border-color: #090; }  QPushButton:pressed {     border: 4px solid #090;     border-radius: 5px; }  QPushButton:checked {     background-color: #006300;     border-color: #090; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0435\u0432\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448 <code>Ctrl + R<\/code><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d0c\/649\/138\/d0c649138d9cba22e4530b7fb07a7247.png\" width=\"507\" height=\"447\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d0c\/649\/138\/d0c649138d9cba22e4530b7fb07a7247.png\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u0418\u043a\u043e\u043d\u043a\u0430 \u0437\u0430\u043c\u043a\u0430<\/h4>\n<p>\u0423\u0431\u0435\u0440\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0438\u043b\u044f <code>border: none;<\/code><\/p>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440 100 \u043d\u0430 100 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/83e\/ada\/149\/83eada14943ee2e1803c67aafc2c98ae.png\" width=\"976\" height=\"568\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/83e\/ada\/149\/83eada14943ee2e1803c67aafc2c98ae.png\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u0424\u0440\u0435\u0439\u043c \u043f\u0430\u0440\u043e\u043b\u044f<\/h4>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u0443, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a. \u0423\u0431\u0435\u0440\u0435\u043c \u043e\u0442\u0441\u0442\u0443\u043f \u0434\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"css\">QFrame {     border: 2px solid gray;     border-radius: 5px;     margin-right: 0; }  QFrame:hover {     border-color: #090; }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 <code>Maximum<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/faa\/c8a\/ac6\/faac8aac6ad802d171a32493f5e2545e.png\" width=\"967\" height=\"496\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/faa\/c8a\/ac6\/faac8aac6ad802d171a32493f5e2545e.png\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u041f\u043e\u043b\u0435 \u043f\u0430\u0440\u043e\u043b\u044f<\/h4>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0443\u0431\u0435\u0440\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u044b. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 20 \u043f\u043e\u0438\u043d\u0442\u043e\u0432.<\/p>\n<pre><code class=\"css\">QLineEdit {     border: none;     margin: 0;     font-size: 20pt; }<\/code><\/pre>\n<h4>\u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438<\/h4>\n<p>\u0414\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0430\u043a \u0436\u0435 \u0443\u0431\u0435\u0440\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u044b. \u0415\u0449\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0444\u043e\u043d \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 30 \u043d\u0430 30 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"css\">QPushButton {     border: none;     margin: 0;     background-color: transparent; }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/51a\/69e\/33c\/51a69e33cfb7a66fdb10c868836d1e71.png\" width=\"885\" height=\"477\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/51a\/69e\/33c\/51a69e33cfb7a66fdb10c868836d1e71.png\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u041a\u043d\u043e\u043f\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f<\/h4>\n<p>\u0414\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043a\u043e\u043d\u043a\u0438 52 \u043d\u0430 52 \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u0422\u0430\u043a \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043a\u043d\u043e\u043f\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0434\u0442\u0438 \u0440\u043e\u0432\u043d\u043e \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0430. \u0423\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0430\u0432\u044b\u0439 \u0438 \u043b\u0435\u0432\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f.<\/p>\n<pre><code class=\"css\">QPushButton {     margin-right: 0;     margin-left: 0; }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e8d\/508\/e90\/e8d508e9080838951160254dd261b8b1.png\" width=\"884\" height=\"472\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e8d\/508\/e90\/e8d508e9080838951160254dd261b8b1.png\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u041a\u043d\u043e\u043f\u043a\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430<\/h4>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0438\u043a\u043e\u043d\u043a\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0442\u043d\u043e \u043f\u0440\u0438\u043b\u0435\u0433\u0430\u0435\u0442 \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c. \u042f \u043d\u0430\u0448\u0435\u043b \u0440\u0430\u0437\u043c\u0435\u0440 42 \u043d\u0430 42 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0423\u0431\u0435\u0440\u0435\u043c \u043e\u0442\u0441\u0442\u0443\u043f \u0434\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"css\">QPushButton {     padding: 5px;     margin-left: 0; }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e17\/837\/c8e\/e17837c8ec7163755b469cdd5a9d0c63.png\" width=\"887\" height=\"471\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e17\/837\/c8e\/e17837c8ec7163755b469cdd5a9d0c63.png\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u0421\u043b\u0430\u0439\u0434\u0435\u0440<\/h4>\n<p>\u0414\u043b\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>groove<\/code> \u0443\u0431\u0435\u0440\u0435\u043c \u0446\u0432\u0435\u0442 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u044b\u0441\u043e\u0442\u0443 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0413\u0440\u0443\u0432 &#8212; \u044d\u0442\u043e \u043b\u0438\u043d\u0438\u044f \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430, \u0438\u043b\u0438 &#171;\u0436\u0435\u043b\u043e\u0431\u043e\u043a&#187;, &#171;\u043a\u0430\u043d\u0430\u0432\u043a\u0430&#187;, &#171;\u0431\u043e\u0440\u043e\u0437\u0434\u0430&#187;, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0438\u0442\u044c \u0433\u0443\u0433\u043b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0443.<\/p>\n<pre><code class=\"css\">QSlider::groove:horizontal {     background-color: transparent;     height: 5px; }<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0432\u0430 \u043e\u0442 \u0440\u0443\u0447\u043a\u0438 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0446\u0432\u0435\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u043f\u0441\u0435\u0432\u0434\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>sub-page<\/code><\/p>\n<pre><code class=\"css\">QSlider::sub-page:horizontal {     background-color: #090; }<\/code><\/pre>\n<p> \u0421\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u0440\u0443\u0447\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u0440\u044b\u0439 \u0446\u0432\u0435\u0442. \u041f\u0441\u0435\u0432\u0434\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>add-page<\/code><\/p>\n<pre><code class=\"css\">QSlider::add-page:horizontal {     background-color: gray; }<\/code><\/pre>\n<p>\u0420\u0443\u0447\u043a\u0443 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0431\u0435\u043b\u043e\u0439 \u0441 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 22 \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043e\u0442\u0441\u0442\u0443\u043f\u0430\u043c\u0438 \u0441\u043d\u0438\u0437\u0443 \u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u043f\u043e -8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"css\">QSlider::handle:horizontal {     background-color: white;     width: 22px;     border-radius: 10px;     margin-top: -8px;     margin-bottom: -8px; }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 100 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 12.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eeb\/aed\/877\/eebaed8776ba14421ce537ba7ff7d235.png\" width=\"892\" height=\"479\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eeb\/aed\/877\/eebaed8776ba14421ce537ba7ff7d235.png\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u0421\u0447\u0435\u0442\u0447\u0438\u043a<\/h4>\n<p>\u0421\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438. <\/p>\n<pre><code class=\"css\">QSpinBox {     border: 2px solid gray;     border-radius: 5px;     background: transparent;     padding: 2px; }  QSpinBox:hover {     border-color: #009900; }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0443 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u0438 \u0443\u0431\u0435\u0440\u0435\u043c \u044d\u0442\u0438 \u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/024\/aa4\/ea4\/024aa4ea45bf227c8143c2d58d792c67.png\" width=\"890\" height=\"520\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/024\/aa4\/ea4\/024aa4ea45bf227c8143c2d58d792c67.png\"\/><figcaption><\/figcaption><\/figure>\n<h4>\u041b\u0435\u0439\u0431\u043b\u044b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u0435\u0439\u0431\u043b\u044b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041c\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0445\u043e\u0442\u0438\u043c, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0430\u0432\u0438\u043c \u0443 \u0434\u0432\u0443\u0445 \u043b\u0435\u0439\u0431\u043b\u043e\u0432 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 <code>Maximum<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4d7\/747\/714\/4d7747714d5b165cfb895202ec177347.png\" width=\"860\" height=\"650\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4d7\/747\/714\/4d7747714d5b165cfb895202ec177347.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0414\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0448\u0442\u0440\u0438\u0445\u0438<\/h3>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f 542 \u043d\u0430 418 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u0443\u0433\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043a\u0430\u043a \u0432\u0430\u043c \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/235\/9e8\/717\/2359e871764cd124c219c53035f5b5e4.png\" width=\"968\" height=\"537\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/235\/9e8\/717\/2359e871764cd124c219c53035f5b5e4.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 <code>windowTitle<\/code>. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u0432 <code>windowIcon<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4fc\/a7f\/6de\/4fca7f6dea064a549f598af15973a224.png\" width=\"925\" height=\"458\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4fc\/a7f\/6de\/4fca7f6dea064a549f598af15973a224.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0443\u0440\u0441\u043e\u0440 <code>Pointing Hand<\/code> \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/358\/3e5\/5ec\/3583e55ecee7304713ee4182f599c983.png\" width=\"940\" height=\"516\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/358\/3e5\/5ec\/3583e55ecee7304713ee4182f599c983.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0431\u0435\u0440\u0435\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u043b\u0435\u0439\u0431\u043b\u043e\u0432. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439.<\/p>\n<p>\u0428\u0442\u043e\u0448. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0433\u043e\u0442\u043e\u0432, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u0442\u0430\u043f\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/34b\/fa6\/deb\/34bfa6debc8f04bd3a71bc11e45e3690.png\" width=\"618\" height=\"522\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/34b\/fa6\/deb\/34bfa6debc8f04bd3a71bc11e45e3690.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b <code>pyside6-rcc<\/code>, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0444\u043b\u0430\u0433 <code>-o<\/code> \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435.<\/p>\n<p><code>pyside6-rcc resources.qrc -o resources.py<\/code><\/p>\n<p>\u0424\u0430\u0439\u043b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <code>pyside6-uic<\/code><\/p>\n<p><code>pyside6-uic main.ui -o ui_main.py<\/code><\/p>\n<p>\u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0445\u043e\u0447\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b \u0432 \u043a\u043e\u043d\u0446\u0435 <code>_rc<\/code> \u043a \u0444\u0430\u0439\u043b\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0430 \u044f \u043d\u0435 \u0445\u043e\u0447\u0443. \u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c <code>import resources_rc<\/code> \u043d\u0430 <code>import resources<\/code><\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u0434<\/h2>\n<p>\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0441\u0440\u0435\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 PyCharm \u0438\u043b\u0438 Visual Studio Code. Vim-\u0435\u0440\u044b, \u043d\u0435 \u0431\u0435\u0439\u0442\u0435.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f &#8212; <code>app.py<\/code>. \u042f \u0432\u0441\u0442\u0430\u0432\u043b\u044e \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u043d\u0438\u043f\u043f\u0435\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0444\u0430\u0439\u043b\u043e\u043c \u0434\u0438\u0437\u0430\u0439\u043d\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043d\u0438\u043f\u043f\u0435\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import sys  from PySide6.QtWidgets import QApplication, QMainWindow  from ui_main import Ui_MainWindow   class App(QMainWindow):     def __init__(self):         super(App, self).__init__()         self.ui = Ui_MainWindow()         self.ui.setupUi(self)   if __name__ == \"__main__\":     app = QApplication(sys.argv)      window = App()     window.show()      sys.exit(app.exec())<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u043c\u0435\u043d\u044f\u044e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <code>App<\/code> \u043d\u0430 <code>PasswordGenerator<\/code><\/p>\n<h3>\u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043d\u043e\u043f\u043e\u043a<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u043a \u043a\u043d\u043e\u043f\u043a\u0430\u043c &#8212; <code>buttons.py<\/code>. \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 string \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0443\u043b\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0412\u043e\u0437\u044c\u043c\u0435\u043c ascii_lowercase, ascii_uppercase, digits \u0438 punctuation. <\/p>\n<pre><code class=\"python\">from string import ascii_lowercase, ascii_uppercase, digits, punctuation<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442.<\/p>\n<pre><code class=\"python\">ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz' ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' digits = '0123456789' punctuation = r\"\"\"!\"#$%&amp;'()*+,-.\/:;&lt;=>?@[\\]^_`{|}~\"\"\"<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043a \u044d\u0442\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c.  <\/p>\n<pre><code class=\"python\">from enum import Enum  class Characters(Enum):     btn_upper = ascii_uppercase     btn_lower = ascii_lowercase     btn_digits = digits     btn_special = punctuation<\/code><\/pre>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u043b. \u041d\u0430\u043c \u044d\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438.<\/p>\n<pre><code class=\"python\">CHARACTER_NUMBER = {     'btn_lower': len(Characters.btn_lower.value),     'btn_upper': len(Characters.btn_upper.value),     'btn_digits': len(Characters.btn_digits.value),     'btn_special': len(Characters.btn_special.value) }<\/code><\/pre>\n<h3>\u041c\u043e\u0434\u0443\u043b\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 &#8212; <code>password.py<\/code>. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u043b\u0438\u043d\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 secrets. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0438\u0437 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0438\u0445 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>join<\/code><\/p>\n<pre><code class=\"python\">import secrets  def create_new(length: int, characters: str) -> str:     return \"\".join(secrets.choice(characters) for _ in range(length))<\/code><\/pre>\n<h4>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044e \u043f\u0430\u0440\u043e\u043b\u044f<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438. \u0412 \u043d\u0435\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0443 \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"H=log_2N^L=L \\times log_2N\" alt=\"H=log_2N^L=L \\times log_2N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/526\/7fe\/d72\/5267fed728bb17238b8363dae3996c6a.svg\" width=\"217\" height=\"24\"\/><\/p>\n<p>\u0433\u0434\u0435\u00a0<em>N<\/em>\u00a0\u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0430\u00a0<em>L<\/em>\u00a0\u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043f\u0430\u0440\u043e\u043b\u0435.\u00a0<em>H<\/em>\u00a0\u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432 \u0431\u0438\u0442\u0430\u0445.  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044e 2 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 math. <\/p>\n<pre><code class=\"python\">from math import log2<\/code><\/pre>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u043d\u043e\u0435 \u0434\u043e 2 \u0437\u043d\u0430\u043a\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u044f\u0442\u043e\u0439.<\/p>\n<pre><code class=\"python\">def get_entropy(length: int, character_number: int) -> float:     entropy = length * log2(character_number)     return round(entropy, 2)<\/code><\/pre>\n<h4>\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f<\/h4>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u043a \u0435\u0433\u043e \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u043f\u043e \u043d\u0438\u0436\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u0435. \u042f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430, \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u0445 \u0441\u0438\u043b\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0434\u0435\u043b\u0430\u044e \u0442\u0430\u043a: \u043d\u0438\u0447\u0442\u043e\u0436\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 0 \u0434\u043e 30 \u0431\u0438\u0442, \u0441\u043b\u0430\u0431\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 30, \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 50, \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 70 \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 120. <\/p>\n<pre><code class=\"python\">from enum import IntEnum  class StrengthToEntropy(IntEnum):     Pathetic = 0     Weak = 30     Good = 50     Strong = 70     Excellent = 120<\/code><\/pre>\n<h3>\u0421\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0441\u0438\u0433\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>valueChanged<\/code> \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"python\">  def connect_slider_to_spinbox(self) -> None:       self.ui.slider_length.valueChanged.connect(self.ui.spinbox_length.setValue)       self.ui.spinbox_length.valueChanged.connect(self.ui.slider_length.setValue)<\/code><\/pre>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<pre><code class=\"python\">class PasswordGenerator(QMainWindow):     def __init__(self):         ...         self.connect_slider_to_spinbox()<\/code><\/pre>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043b\u044f \u043f\u0430\u0440\u043e\u043b\u044f<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a. \u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 <code>chars<\/code>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0451 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u0430.<\/p>\n<pre><code class=\"python\">def get_characters(self) -> str:     chars = \"\"      for btn in buttons.Characters:         if getattr(self.ui, btn.name).isChecked():             chars += btn.value      return chars<\/code><\/pre>\n<h3>\u0421\u0442\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u043e\u043b\u044c<\/h3>\n<p>\u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e, \u043c\u0435\u0442\u043e\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u0440\u043e\u043b\u044f. \u0421\u0442\u0430\u0432\u0438\u043c \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>line_password<\/code> \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>setText<\/code>. \u0414\u043b\u0438\u043d\u0443 \u0431\u0435\u0440\u0435\u043c \u0438\u0437 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0438\u043b\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430, \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"python\">def set_password(self) -> None:     self.ui.line_password.setText(         password.create_new(             length=self.ui.slider_length.value(),             characters=self.get_characters())     )<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435.<\/p>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0438\u043b\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043f\u0430\u0440\u043e\u043b\u044f. <\/p>\n<pre><code class=\"python\">def connect_slider_to_spinbox(self) -> None:     ...     self.ui.spinbox_length.valueChanged.connect(self.set_password)<\/code><\/pre>\n<p>\u041f\u043e\u0437\u0430\u043b\u0438\u043f\u0430\u0435\u043c \u043d\u0430 \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 :3 <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/784\/67b\/708\/78467b7086648b036562b251d4c74dbf.gif\" width=\"536\" height=\"448\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/784\/67b\/708\/78467b7086648b036562b251d4c74dbf.gif\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043d\u0430\u0436\u0430\u0442\u0430 \u043d\u0438 \u043e\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 <code>IndexError<\/code>. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0438\u0449\u0430\u044f \u043f\u043e\u043b\u0435 \u043f\u0430\u0440\u043e\u043b\u044f.<\/p>\n<pre><code class=\"python\">def set_password(self) -> None:     try:         self.ui.line_password.setText(             password.create_new(                 length=self.ui.slider_length.value(),                 characters=self.get_characters())         )     except IndexError:         self.ui.line_password.clear()<\/code><\/pre>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/h3>\n<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u043e\u0442 \u0436\u0435, \u0447\u0442\u043e \u0438 \u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u043c, \u0430 \u043d\u0435 \u0441 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c.<\/p>\n<pre><code class=\"python\">def get_character_number(self) -> int:     num = 0      for btn in buttons.CHARACTER_NUMBER.items():         if getattr(self.ui, btn[0]).isChecked():             num += btn[1]      return num<\/code><\/pre>\n<h3>\u0421\u0442\u0430\u0432\u0438\u043c \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044e \u043f\u0430\u0440\u043e\u043b\u044f<\/h3>\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043b\u0435\u0439\u0431\u043b\u0430 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438. \u0411\u0435\u0440\u0435\u043c \u0434\u043b\u0438\u043d\u0443 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0430\u0440\u043e\u043b\u044f, \u0430 \u043d\u0435 \u0438\u0437 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0438\u043b\u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430, \u0442\u0430\u043a \u043d\u0443\u0436\u043d\u043e. \u0421\u0442\u0430\u0432\u0438\u043c \u0432 \u043b\u0435\u0439\u0431\u043b \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e f-\u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<pre><code class=\"python\">def set_entropy(self) -> None:     length = len(self.ui.line_password.text())     char_num = self.get_character_number()      self.ui.label_entropy.setText(         f\"Entropy: {password.get_entropy(length, char_num)} bit\"     )<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u0440\u043e\u043b\u044f.<\/p>\n<pre><code class=\"python\">def set_password(self) -> None:     ...      self.set_entropy()<\/code><\/pre>\n<p>\u0411\u0435\u0437 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f <code>ValueError<\/code>. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>get_entropy<\/code> \u043c\u043e\u0434\u0443\u043b\u044f <code>password<\/code>. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c 0.0. <\/p>\n<pre><code class=\"python\">def get_entropy(length: int, character_number: int) -> float:     try:         entropy = length * log2(character_number)     except ValueError:         return 0.0      return round(entropy, 2)<\/code><\/pre>\n<h3>\u0421\u0442\u0430\u0432\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043b\u0435\u0439\u0431\u043b\u0430 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044e \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. <\/p>\n<pre><code class=\"python\">def set_strength(self) -> None:     length = len(self.ui.line_password.text())     char_num = self.get_character_number()      for strength in password.StrengthToEntropy:         if password.get_entropy(length, char_num) >= strength.value:             self.ui.label_strength.setText(f\"Strength: {strength.name}\")<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043e\u043d\u0435\u0446 \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u0440\u043e\u043b\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7c1\/071\/628\/7c10716283af2a3f8d3c5c25db0b092c.gif\" width=\"536\" height=\"448\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7c1\/071\/628\/7c10716283af2a3f8d3c5c25db0b092c.gif\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u0442\u0430\u0432\u0438\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438<\/h3>\n<p>\u0417\u0430\u043f\u0438\u0448\u0443 \u0432 \u043c\u043e\u0434\u0443\u043b\u044c <code>buttons<\/code> \u043a\u043e\u0440\u0442\u0435\u0436 \u0441 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043a\u043d\u043e\u043f\u043e\u043a, \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c.<\/p>\n<pre><code class=\"python\">GENERATE_PASSWORD = (     'btn_refresh', 'btn_lower', 'btn_upper', 'btn_digits', 'btn_special' )<\/code><\/pre>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<pre><code class=\"python\">for btn in buttons.GENERATE_PASSWORD:     getattr(self.ui, btn).clicked.connect(self.set_password)<\/code><\/pre>\n<h3>\u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044f<\/h3>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f. \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u0430, \u0441\u0442\u0430\u0432\u0438\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u0445\u043e \u043c\u043e\u0434, \u0438\u043d\u0430\u0447\u0435 \u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0445\u043e \u043c\u043e\u0434 \u043f\u0430\u0440\u043e\u043b\u044f.<\/p>\n<pre><code class=\"python\">from PySide6.QtWidgets import QApplication, QMainWindow, QLineEdit  ...  def change_password_visibility(self) -> None:     if self.ui.btn_visibility.isChecked():         self.ui.line_password.setEchoMode(QLineEdit.Normal)     else:         self.ui.line_password.setEchoMode(QLineEdit.Password)<\/code><\/pre>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<pre><code class=\"python\">class PasswordGenerator(QMainWindow):     def __init__(self):         ...         self.ui.btn_visibility.clicked.connect(self.change_password_visibility)<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b5a\/f54\/838\/b5af54838b843d8f0acb7d6a393fce18.gif\" width=\"536\" height=\"448\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b5a\/f54\/838\/b5af54838b843d8f0acb7d6a393fce18.gif\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430, \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>clipboard<\/code> \u043a\u043b\u0430\u0441\u0441\u0430 <code>QApplication<\/code> \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0442\u0435\u043a\u0441\u0442.<\/p>\n<pre><code class=\"python\">def copy_to_clipboard(self) -> None:     QApplication.clipboard().setText(self.ui.line_password.text())<\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043a\u043b\u0430\u0441\u0441\u0430. \u042f \u0434\u0443\u043c\u0430\u044e, \u0432\u044b \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u0441\u044c.<\/p>\n<h3>\u041c\u0435\u043d\u044f\u0435\u043c \u043b\u0435\u0439\u0431\u043b\u044b \u043f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f<\/h3>\n<p>\u041e\u0441\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0442\u0440\u0438\u0445. \u041f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044f \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0420\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 <code>textEdited<\/code><\/p>\n<pre><code class=\"python\">def do_when_password_edit(self) -> None:     self.ui.line_password.textEdited.connect(self.set_entropy)     self.ui.line_password.textEdited.connect(self.set_strength)<\/code><\/pre>\n<p>\u0424\u0438\u0448\u043a\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0437 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a. \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u0441\u0430\u043c\u0438\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>buttons.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from string import ascii_lowercase, ascii_uppercase, digits, punctuation from enum import Enum   class Characters(Enum):     btn_lower = ascii_lowercase     btn_upper = ascii_uppercase     btn_digits = digits     btn_special = punctuation   CHARACTER_NUMBER = {     'btn_lower': len(Characters.btn_lower.value),     'btn_upper': len(Characters.btn_upper.value),     'btn_digits': len(Characters.btn_digits.value),     'btn_special': len(Characters.btn_special.value) }  GENERATE_PASSWORD = (     'btn_refresh', 'btn_lower', 'btn_upper', 'btn_digits', 'btn_special' )<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>password.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from enum import IntEnum from math import log2 import secrets   class StrengthToEntropy(IntEnum):     Pathetic = 0     Weak = 30     Good = 50     Strong = 70     Excellent = 120   def create_new(length: int, characters: str) -> str:     return ''.join(secrets.choice(characters) for _ in range(length))   def get_entropy(length: int, character_number: int) -> float:     try:         entropy = length * log2(character_number)     except ValueError:         return 0.0      return round(entropy, 2)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u041c\u0435\u043d\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p>\u0428\u0442\u043e\u0448. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0443 password-generator. \u0417\u0434\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0430\u043f\u043a\u0443 ui, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u0418\u0437 <code>ui_main.py<\/code> \u044f \u0443\u0431\u0440\u0430\u043b \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0435\u0433\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"python\">from ui.ui_main import Ui_MainWindow import ui.resources<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>app.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import sys  from PySide6.QtWidgets import QApplication, QMainWindow, QLineEdit  import buttons import password from ui.ui_main import Ui_MainWindow import ui.resources   class PasswordGenerator(QMainWindow):     def __init__(self):         super(PasswordGenerator, self).__init__()         self.ui = Ui_MainWindow()         self.ui.setupUi(self)          self.connect_slider_to_spinbox()         self.set_password()         self.do_when_password_edit()          for btn in buttons.GENERATE_PASSWORD:             getattr(self.ui, btn).clicked.connect(self.set_password)          self.ui.btn_visibility.clicked.connect(self.change_password_visibility)         self.ui.btn_copy.clicked.connect(self.copy_to_clipboard)      def connect_slider_to_spinbox(self) -> None:         self.ui.slider_length.valueChanged.connect(self.ui.spinbox_length.setValue)         self.ui.spinbox_length.valueChanged.connect(self.ui.slider_length.setValue)         self.ui.spinbox_length.valueChanged.connect(self.set_password)      def do_when_password_edit(self) -> None:         self.ui.line_password.textEdited.connect(self.set_entropy)         self.ui.line_password.textEdited.connect(self.set_strength)      def get_characters(self) -> str:         chars = ''          for btn in buttons.Characters:             if getattr(self.ui, btn.name).isChecked():                 chars += btn.value          return chars      def set_password(self) -> None:         try:             self.ui.line_password.setText(                 password.create_new(                     length=self.ui.slider_length.value(),                     characters=self.get_characters())             )         except IndexError:             self.ui.line_password.clear()          self.set_entropy()         self.set_strength()      def get_character_number(self) -> int:         num = 0          for btn in buttons.CHARACTER_NUMBER.items():             if getattr(self.ui, btn[0]).isChecked():                 num += btn[1]          return num      def set_entropy(self) -> None:         length = len(self.ui.line_password.text())         char_num = self.get_character_number()          self.ui.label_entropy.setText(             f'Entropy: {password.get_entropy(length, char_num)} bit'         )      def set_strength(self) -> None:         length = len(self.ui.line_password.text())         char_num = self.get_character_number()          for strength in password.StrengthToEntropy:             if password.get_entropy(length, char_num) >= strength.value:                 self.ui.label_strength.setText(f'Strength: {strength.name}')      def change_password_visibility(self) -> None:         if self.ui.btn_visibility.isChecked():             self.ui.line_password.setEchoMode(QLineEdit.Normal)         else:             self.ui.line_password.setEchoMode(QLineEdit.Password)      def copy_to_clipboard(self) -> None:         QApplication.clipboard().setText(self.ui.line_password.text())   if __name__ == \"__main__\":     app = QApplication(sys.argv)      window = PasswordGenerator()     window.show()      sys.exit(app.exec())<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>pip freeze > requirements.txt<\/code><\/p>\n<pre><code>PySide6==6.3.1 PySide6-Addons==6.3.1 PySide6-Essentials==6.3.1 shiboken6==6.3.1<\/code><\/pre>\n<h2>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439<\/h2>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 Git. <a href=\"https:\/\/git-scm.com\/downloads\" rel=\"noopener noreferrer nofollow\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/a>, \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0438. \u041f\u0440\u043e\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b <code>git init<\/code> \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432 PyCharm.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <code>.gitignore<\/code>. \u0411\u0443\u0434\u0435\u043c \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043f\u0430\u043f\u043a\u0443 PyCharm \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438 \u043f\u0438\u0442\u043e\u043d\u044f\u0447\u0438\u0439 \u043a\u044d\u0448. \u0414\u043b\u044f VS Code \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c <code>.vscode<\/code> <\/p>\n<pre><code>venv* .idea .vscode __pycache__<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0432 PyCharm \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043b\u044e\u0431\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435, \u0442\u043e \u043f\u0440\u043e\u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<p><code>git add .<\/code><\/p>\n<p><code>git commit -m \"Initial commit\"<\/code><\/p>\n<h2>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Windows<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u0423 Qt \u0435\u0441\u0442\u044c <a href=\"https:\/\/doc.qt.io\/qtforpython\/deployment.html\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f,<\/a> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0431\u0440\u0430\u043d\u044b \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 &#8212; \u044d\u0442\u043e <a href=\"https:\/\/pyinstaller.org\/en\/stable\/\" rel=\"noopener noreferrer nofollow\">PyInstaller. <\/a>\u041d\u0435\u0442, \u0432\u0440\u0443, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 &#8212; \u044d\u0442\u043e PyInstaller \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, <a href=\"https:\/\/pypi.org\/project\/auto-py-to-exe\/\" rel=\"noopener noreferrer nofollow\">auto-py-to-exe.<\/a> \u0412\u0441\u0435 \u044d\u0442\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0445\u043e\u0440\u043e\u0448\u0438 \u0441\u0432\u043e\u0435\u0439 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0438 \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438.<\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0448\u0435 &#8212; \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <a href=\"https:\/\/nuitka.net\/\" rel=\"noopener noreferrer nofollow\">Nuitka.<\/a> \u041e\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Qt, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445 \u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 MIT.<\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>pip install nuitka<\/code>. \u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>zstandard<\/code>, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b.<\/p>\n<p>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u043b\u0430\u0433\u0430 <code>--onefile<\/code>. \u0424\u043b\u0430\u0433 <code>--follow-imports<\/code> \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043b\u0430\u0433\u0438\u043d PySide6 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u043b\u0430\u0433\u0430 <code>--enable-plugin=pyside6<\/code>. \u0427\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 Windows \u0434\u043e\u0431\u0430\u0432\u0438\u043c <code>--windows-disable-console<\/code>. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u043b\u0430\u0433\u0430 <code>--windows-icon-from-ico<\/code><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043d\u0443\u0438\u0442\u043a\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0444\u043b\u0430\u0433 <code>--remove-output<\/code><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 \u0444\u043b\u0430\u0433 <code>-o<\/code>, \u043d\u043e \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c. <\/p>\n<p><code>nuitka --onefile --follow-imports --enable-plugin=pyside6 --windows-disable-console --windows-icon-from-ico=ui\\icons\\app-icon.ico --remove-output -o password-generator.exe app.py<\/code><\/p>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 16.7 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/963\/2f1\/cf1\/9632f1cf1c66577fe030f4949ae4ec52.png\" width=\"360\" height=\"265\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/963\/2f1\/cf1\/9632f1cf1c66577fe030f4949ae4ec52.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f Linux<\/h2>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 Ubuntu \u0432\u0435\u0440\u0441\u0438\u0438 22.04. \u0421 \u043d\u0443\u0438\u0442\u043a\u043e\u0439 \u0432\u044b\u0448\u043b\u043e \u0433\u0440\u043e\u043c\u0430\u0434\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 145 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 &#8212; \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. <\/p>\n<p><code>python -m nuitka --onefile --follow-imports --enable-plugin=pyside6 --remove-output app.py<\/code> <\/p>\n<p>\u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 <a href=\"https:\/\/doc.qt.io\/qtforpython\/deployment-pyinstaller.html\" rel=\"noopener noreferrer nofollow\">PyInstaller,<\/a> \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0448\u0435, 57,6 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442. \u0421 \u0438\u043a\u043e\u043d\u043a\u043e\u0439 \u0432 \u0434\u043e\u043a\u0431\u0430\u0440\u0435 \u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u043d\u0438\u043a\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0434\u0430, \u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u0430 \u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p><code>pyinstaller --name=\"Password Generator\" --windowed app.py<\/code><\/p>\n<h2>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f macOS<\/h2>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0432\u0435\u0440\u0441\u0438\u044e 10.15 Catalina. \u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434 macOS \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c  \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>--macos-create-app-bundle<\/code><\/p>\n<p><code>python3 -m nuitka --onefile --follow-imports --enable-plugin=pyside6 --macos-create-app-bundle --remove-output -o password-generator.app app.py<\/code><\/p>\n<p>\u0412\u044b\u0448\u043b\u043e \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a \u0436\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e, \u043a\u0430\u043a \u0438 \u043d\u0430 \u0432\u0438\u043d\u0434\u0435 &#8212; 18 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442. \u0421 \u0438\u043a\u043e\u043d\u043a\u043e\u0439 \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0431\u0438\u0440\u0430\u043b \u0431\u0435\u0437 \u043d\u0435\u0435.<\/p>\n<h2>\u0428\u0442\u043e\u0448<\/h2>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u043e\u043b\u0438, \u0434\u0435\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0441\u043b\u0430\u0431\u044b\u0435, \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u0430\u043c \u0441\u0447\u0430\u0441\u0442\u044c\u0435. \u0414\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0438.<\/p>\n<hr\/>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/632b619a9807468d86118905\" data-style=\"\" id=\"632b619a9807468d86118905\" width=\"\"><\/div>\n<p><a href=\"https:\/\/github.com\/lesskop\/password-generator\" rel=\"noopener noreferrer nofollow\">GitHub \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/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\/post\/689536\/\"> https:\/\/habr.com\/ru\/post\/689536\/<\/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\"><figcaption><\/figcaption><\/figure>\n<p>\u0428\u0442\u043e\u0448. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043d\u0430\u0443\u0447\u0443 \u0432\u0430\u0441 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0430\u0440\u043e\u043b\u0435\u0439 \u0441 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044f\u0437\u044b\u043a Python \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 PySide6 &#8212; \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Qt.<\/p>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043c\u0435\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0438, \u0441\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430. \u0414\u043b\u0438\u043d\u0430 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430. \u041f\u0443\u043b \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438. \u0421\u0438\u043b\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438.<\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430 <a href=\"https:\/\/github.com\/lesskop\/password-generator\" rel=\"noopener noreferrer nofollow\">GitHub.<\/a><\/p>\n<h2>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435<\/h2>\n<p>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 <a href=\"https:\/\/www.python.org\/downloads\/\" rel=\"noopener noreferrer nofollow\">Python<\/a> \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e). \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Python \u0432\u0435\u0440\u0441\u0438\u0438 3.7+<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <code>password-generator<\/code> \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0432 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>venvPasswordGenerator<\/code><\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/pypi.org\/project\/PySide6\/\" rel=\"noopener noreferrer nofollow\">PySide6.<\/a><\/p>\n<p><code>pip install pyside6<\/code><\/p>\n<p><a href=\"https:\/\/doc.qt.io\/qtforpython\/index.html\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Qt for Python.<\/a><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <a href=\"https:\/\/doc.qt.io\/qt-6\/qtdesigner-manual.html\" rel=\"noopener noreferrer nofollow\">Qt Designer.<\/a> \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p><code>venv*\/Lib\/site-packages\/PySide6\/designer<\/code><\/p>\n<figure class=\"\"><figcaption>\u041e\u043a\u043d\u043e \u043d\u043e\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 Qt Designer<\/figcaption><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c <code>MainWindow<\/code>. \u0423\u0431\u0438\u0440\u0430\u0435\u043c <code>menubar<\/code> \u0438 <code>statusbar<\/code> <\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u042f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u0435\u0433\u043e <code>main.ui<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u044f \u043c\u043e\u0433\u0443 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u043b\u0438 \u0435\u0449\u0435 \u0447\u0435\u0433\u043e-\u0442\u043e.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043a\u0438\u043d\u0435\u043c 4 <code>Horizontal Layout<\/code> \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0441 \u0437\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0435\u0439 <code>Ctrl<\/code>. <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u044b\u0431\u0435\u0440\u0435\u043c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430. <code>centralwidget -> Lay Out Vertically<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/h3>\n<p>\u0417\u0430\u043a\u0438\u043d\u0435\u043c \u043e\u0434\u043d\u0443 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u043d\u0438\u0436\u043d\u044e\u044e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0443. <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0427\u0442\u043e\u0431\u044b \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043c\u0435\u043b\u0430 2 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>checkable<\/code><\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 3 \u0440\u0430\u0437\u0430. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0435\u043a\u0441\u0442. \u042f \u0434\u0443\u043c\u0430\u044e, \u0442\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0437\u0430 \u043a\u0430\u043a\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u0434\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430. <\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>checked<\/code> \u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u0445, \u043a\u0440\u043e\u043c\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u0434\u043b\u0438\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044f<\/h3>\n<p>\u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u0438\u043d\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430. \u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0443 \u044f \u043d\u0430\u0437\u043e\u0432\u0443 <code>layout_length<\/code>, \u0441\u043b\u0430\u0439\u0434\u0435\u0440 &#8212; <code>slider_length<\/code>, \u0441\u0447\u0435\u0442\u0447\u0438\u043a &#8212; <code>spinbox_length<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f<\/h2>\n<p>\u0417\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043b\u0435\u0439\u0431\u043b. <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0430\u0432\u0438\u043c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443. <\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0432\u0432\u043e\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u0440\u043e\u043b\u044f<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0432\u0441\u0442\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430. \u041a\u0430\u043a \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 Line Edit? \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0432 Qt Designer \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b. \u041b\u0443\u0447\u0448\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u044f \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0440\u044f\u0434\u043e\u043c \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p><code>Widget Box -> Containers -> Frame<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c 2 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0443, \u0430 \u043d\u0435 \u0432\u043e \u0444\u0440\u0435\u0439\u043c. \u041f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0443\u0436\u043d\u043e \u0432 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u0440\u0430\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0415\u0449\u0435 \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u0435\u0440\u0445\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043c\u043a\u0430. \u041d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435, \u0432 Qt Designer \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0431\u044b\u0432\u0430\u0442\u044c. \u0415\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043b\u0435\u0439\u0431\u043b\u0430 \u0438 \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>pixmap<\/code>, \u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0438\u043a\u043e\u043d\u043a\u0443 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0438.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0418\u043a\u043e\u043d\u043a\u0438 Material Icons<\/h3>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u042f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 <a href=\"https:\/\/fonts.google.com\/icons?icon.set=Material+Icons\" rel=\"noopener noreferrer nofollow\">Material Icons.<\/a><\/p>\n<p>\u0421\u043a\u0430\u0447\u0430\u0435\u043c \u0431\u0435\u043b\u0443\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u0443\u044e <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Alock%3A\" rel=\"noopener noreferrer nofollow\">\u0438\u043a\u043e\u043d\u043a\u0443 \u0437\u0430\u043c\u043a\u0430<\/a>. \u042f \u0432\u044b\u0431\u0435\u0440\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0438\u0434 &#8212; Outlined. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u044f\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439, \u043a\u0430\u043a \u0432\u0430\u043c \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u0435.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u043e\u0437\u044c\u043c\u0435\u043c <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Arefresh%3A\" rel=\"noopener noreferrer nofollow\">Refresh.<\/a> \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430 &#8212; <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Acontent_copy%3A\" rel=\"noopener noreferrer nofollow\">Content Copy.<\/a> \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044f &#8212; <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Avisibility%3A\" rel=\"noopener noreferrer nofollow\">Visibility<\/a> \u0438 <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Avisibility_off%3A\" rel=\"noopener noreferrer nofollow\">Visibility Off<\/a>. \u0414\u043b\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0447\u0435\u0440\u043d\u0443\u044e <a href=\"https:\/\/fonts.google.com\/icons?selected=Material%20Icons%20Outlined%3Akey%3A\" rel=\"noopener noreferrer nofollow\">\u0438\u043a\u043e\u043d\u043a\u0443 \u043a\u043b\u044e\u0447\u0430<\/a> \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>png<\/code> \u0438 \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0451 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u0438\u043a\u043e\u043d\u043e\u043a <code>ico<\/code><\/p>\n<figure class=\"full-width\"><figcaption>\u0418\u043a\u043e\u043d\u043a\u0438 \u0432 Windows File Explorer<\/figcaption><\/figure>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/h3>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u043a\u043e\u043d\u043a\u0438. \u041f\u043e\u0437\u0436\u0435 \u043c\u044b \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0432 Python \u043a\u043e\u0434. <code>Resource Browser -> Edit Resources -> New Resource File -> resources.qrc<\/code><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>icons<\/code><\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u043a\u043e\u043d\u043e\u043a.<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<h3>\u041f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0438<\/h3>\n<p>\u0412 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0442\u0430\u0432\u0438\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u0437\u0430\u043c\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 <code>icon -> Disabled On<\/code>. \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>Choose Resource<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>checkable<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u0442\u043e\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 2 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0421\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u043c <code>checked<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 <code>Normal Off<\/code> \u0431\u0435\u0440\u0435\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0432 <code>Normal On<\/code> &#8212; \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432 <code>Normal On<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u0442\u0438\u043b\u0438\u0437\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/h3>\n<p>\u0414\u043b\u044f \u0441\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a CSS. \u041f\u0438\u0441\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0432 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435. \u042f \u043f\u0438\u0448\u0443 \u0432 Visual Studio Code, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435.<\/p>\n<h4>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u043a\u043d\u043e<\/h4>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <code>QMainWindow.css<\/code>. \u0414\u043b\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0436\u0435\u0442\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0446\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 <code>#121212<\/code>, \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430, \u0448\u0440\u0438\u0444\u0442 Verdana \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 16 \u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"css\">QWidget {     background-color: #121212;     color: white;     font-family: Verdana;     font-size: 16pt;     margin: 10px; }<\/code><\/pre>\n<p> \u0414\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043f\u043b\u043e\u0448\u043d\u0443\u044e \u0441\u0435\u0440\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 2 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0441 \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. <\/p>\n<pre><code class=\"css\">QPushButton {     border: 2px solid gray;     border-radius: 5px; }<\/code><\/pre>\n<p>\u0412\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u0434 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>MainWindow<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0446\u0438\u0438 Change <code>styleSheet<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c.<\/p>\n<pre><code class=\"css\">QPushButton#btn_lower, #btn_upper, #btn_digits, #btn_special {     padding: 10px; }<\/code><\/pre>\n<p> \u041f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0446\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u0437\u0435\u043b\u0435\u043d\u044b\u0439 <code>#090<\/code>. <\/p>\n<pre><code class=\"css\">QPushButton:hover {     border-color: #090; }<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e 4 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"css\">QPushButton:pressed {     border: 4px solid #090;     border-radius: 5px; }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430 \u0444\u043e\u043d \u0442\u0435\u043c\u043d\u043e-\u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 <code>#006300<\/code>.<\/p>\n<pre><code class=\"css\">QPushButton:checked {     background-color: #006300;     border-color: #090; }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>QMainWindow.css<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"css\">QWidget {     background-color: #121212;     color: white;     font-family: Verdana;     font-size: 16pt;     margin: 10px; }  QPushButton {     border: 2px solid gray;     border-radius: 5px; }  QPushButton#btn_lower, #btn_upper, #btn_digits, #btn_special {     padding: 10px; }  QPushButton:hover {     border-color: #090; }  QPushButton:pressed {     border: 4px solid #090;     border-radius: 5px; }  QPushButton:checked {     background-color: #006300;     border-color: #090; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0435\u0432\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448 <code>Ctrl + R<\/code><\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<h4>\u0418\u043a\u043e\u043d\u043a\u0430 \u0437\u0430\u043c\u043a\u0430<\/h4>\n<p>\u0423\u0431\u0435\u0440\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0438\u043b\u044f <code>border: none;<\/code><\/p>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440 100 \u043d\u0430 100 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>\u0424\u0440\u0435\u0439\u043c \u043f\u0430\u0440\u043e\u043b\u044f<\/h4>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u043b\u044f \u0444\u0440\u0435\u0439\u043c\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u0443, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a. \u0423\u0431\u0435\u0440\u0435\u043c \u043e\u0442\u0441\u0442\u0443\u043f \u0434\u043e \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"css\">QFrame {     border: 2px solid gray;     border-radius: 5px;     margin-right: 0; }  QFrame:hover {     border-color: #090; }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 <code>Maximum<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>\u041f\u043e\u043b\u0435 \u043f\u0430\u0440\u043e\u043b\u044f<\/h4>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0443\u0431\u0435\u0440\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u044b. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 20 \u043f\u043e\u0438\u043d\u0442\u043e\u0432.<\/p>\n<pre><code class=\"css\">QLineEdit {     border: none;     margin: 0;     font-size: 20pt; }<\/code><\/pre>\n<h4>\u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438<\/h4>\n<p>\u0414\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0430\u043a \u0436\u0435 \u0443\u0431\u0435\u0440\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u044b. \u0415\u0449\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439 \u0444\u043e\u043d \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 30 \u043d\u0430 30 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"css\">QPushButton {     border: none;     margin: 0;     background-color: transparent; }<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>\u041a\u043d\u043e\u043f\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f<\/h4>\n<p>\u0414\u043b\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043a\u043e\u043d\u043a\u0438 52 \u043d\u0430 52 \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u0422\u0430\u043a \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043a\u043d\u043e\u043f\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0434\u0442\u0438 \u0440\u043e\u0432\u043d\u043e \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0430. \u0423\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0430\u0432\u044b\u0439 \u0438 \u043b\u0435\u0432\u044b\u0439 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f.<\/p>\n<pre><code class=\"css\">QPushButton {     margin-right: 0;     margin-left: 0; }<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>\u041a\u043d\u043e\u043f\u043a\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430<\/h4>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0438\u043a\u043e\u043d\u043a\u0430 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0442\u043d\u043e \u043f\u0440\u0438\u043b\u0435\u0433\u0430\u0435\u0442 \u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c. \u042f \u043d\u0430\u0448\u0435\u043b \u0440\u0430\u0437\u043c\u0435\u0440 42 \u043d\u0430 42 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0423\u0431\u0435\u0440\u0435\u043c \u043e\u0442\u0441\u0442\u0443\u043f \u0434\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"css\">QPushButton {     padding: 5px;     margin-left: 0; }<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>\u0421\u043b\u0430\u0439\u0434\u0435\u0440<\/h4>\n<p>\u0414\u043b\u044f \u043f\u0441\u0435\u0432\u0434\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>groove<\/code> \u0443\u0431\u0435\u0440\u0435\u043c \u0446\u0432\u0435\u0442 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0432\u044b\u0441\u043e\u0442\u0443 5 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0413\u0440\u0443\u0432 &#8212; \u044d\u0442\u043e \u043b\u0438\u043d\u0438\u044f \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430, \u0438\u043b\u0438 &#171;\u0436\u0435\u043b\u043e\u0431\u043e\u043a&#187;, &#171;\u043a\u0430\u043d\u0430\u0432\u043a\u0430&#187;, &#171;\u0431\u043e\u0440\u043e\u0437\u0434\u0430&#187;, \u0435\u0441\u043b\u0438 \u0432\u0435\u0440\u0438\u0442\u044c \u0433\u0443\u0433\u043b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0447\u0438\u043a\u0443.<\/p>\n<pre><code class=\"css\">QSlider::groove:horizontal {     background-color: transparent;     height: 5px; }<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0432\u0430 \u043e\u0442 \u0440\u0443\u0447\u043a\u0438 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u0446\u0432\u0435\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u043f\u0441\u0435\u0432\u0434\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 <code>sub-page<\/code><\/p>\n<pre><code class=\"css\">QSlider::sub-page:horizontal {     background-color: #090; }<\/code><\/pre>\n<p> \u0421\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u0440\u0443\u0447\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u0440\u044b\u0439 \u0446\u0432\u0435\u0442. \u041f\u0441\u0435\u0432\u0434\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>add-page<\/code><\/p>\n<pre><code class=\"css\">QSlider::add-page:horizontal {     background-color: gray; }<\/code><\/pre>\n<p>\u0420\u0443\u0447\u043a\u0443 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430 \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0431\u0435\u043b\u043e\u0439 \u0441 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 22 \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0440\u0430\u0434\u0438\u0443\u0441\u043e\u043c 10 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043e\u0442\u0441\u0442\u0443\u043f\u0430\u043c\u0438 \u0441\u043d\u0438\u0437\u0443 \u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u043f\u043e -8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<pre><code class=\"css\">QSlider::handle:horizontal {     background-color: white;     width: 22px;     border-radius: 10px;     margin-top: -8px;     margin-bottom: -8px; }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 100 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 12.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>\u0421\u0447\u0435\u0442\u0447\u0438\u043a<\/h4>\n<p>\u0421\u0447\u0435\u0442\u0447\u0438\u043a \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438. <\/p>\n<pre><code class=\"css\">QSpinBox {     border: 2px solid gray;     border-radius: 5px;     background: transparent;     padding: 2px; }  QSpinBox:hover {     border-color: #009900; }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0443 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443 \u0438 \u0443\u0431\u0435\u0440\u0435\u043c \u044d\u0442\u0438 \u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h4>\u041b\u0435\u0439\u0431\u043b\u044b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u0435\u0439\u0431\u043b\u044b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041c\u044b \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0445\u043e\u0442\u0438\u043c, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0430\u0432\u0438\u043c \u0443 \u0434\u0432\u0443\u0445 \u043b\u0435\u0439\u0431\u043b\u043e\u0432 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 <code>Maximum<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0414\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0448\u0442\u0440\u0438\u0445\u0438<\/h3>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f 542 \u043d\u0430 418 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u0443\u0433\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043a\u0430\u043a \u0432\u0430\u043c \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 <code>windowTitle<\/code>. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0438\u043a\u043e\u043d\u043a\u0443 \u0432 <code>windowIcon<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0443\u0440\u0441\u043e\u0440 <code>Pointing Hand<\/code> \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0441\u043b\u0430\u0439\u0434\u0435\u0440\u0430.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0423\u0431\u0435\u0440\u0435\u043c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0438\u0437 \u043b\u0435\u0439\u0431\u043b\u043e\u0432. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439.<\/p>\n<p>\u0428\u0442\u043e\u0448. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0433\u043e\u0442\u043e\u0432, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u0442\u0430\u043f\u0443.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b <code>pyside6-rcc<\/code>, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0444\u043b\u0430\u0433 <code>-o<\/code> \u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435.<\/p>\n<p><code>pyside6-rcc resources.qrc -o resources.py<\/code><\/p>\n<p>\u0424\u0430\u0439\u043b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <code>pyside6-uic<\/code><\/p>\n<p><code>pyside6-uic main.ui -o ui_main.py<\/code><\/p>\n<p>\u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0445\u043e\u0447\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b \u0432 \u043a\u043e\u043d\u0446\u0435 <code>_rc<\/code> \u043a \u0444\u0430\u0439\u043b\u0443 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0430 \u044f \u043d\u0435 \u0445\u043e\u0447\u0443. \u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c <code>import resources_rc<\/code> \u043d\u0430 <code>import resources<\/code><\/p>\n<h2>\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u0434<\/h2>\n<p>\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u0441\u0440\u0435\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 PyCharm \u0438\u043b\u0438 Visual Studio Code. Vim-\u0435\u0440\u044b, \u043d\u0435 \u0431\u0435\u0439\u0442\u0435.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f &#8212; <code>app.py<\/code>. \u042f \u0432\u0441\u0442\u0430\u0432\u043b\u044e \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u043d\u0438\u043f\u043f\u0435\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u0444\u0430\u0439\u043b\u043e\u043c \u0434\u0438\u0437\u0430\u0439\u043d\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043d\u0438\u043f\u043f\u0435\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import sys  from PySide6.QtWidgets import QApplication, QMainWindow  from ui_main import Ui_MainWindow   class App(QMainWindow):     def __init__(self):         super(App, self).__init__()         self.ui = Ui_MainWindow()         self.ui.setupUi(self)   if __name__ == \"__main__\":     app =<\/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-338648","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/338648","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=338648"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/338648\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=338648"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=338648"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=338648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}