all added

This commit is contained in:
2024-05-16 22:13:17 +07:00
commit dc041a86bf
22 changed files with 1470 additions and 0 deletions
+321
View File
@@ -0,0 +1,321 @@
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### PyCharm template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### Python template
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Generated
+132
View File
@@ -0,0 +1,132 @@
# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
[[package]]
name = "customtkinter"
version = "5.2.2"
description = "Create modern looking GUIs with Python"
optional = false
python-versions = ">=3.7"
files = [
{file = "customtkinter-5.2.2-py3-none-any.whl", hash = "sha256:14ad3e7cd3cb3b9eb642b9d4e8711ae80d3f79fb82545ad11258eeffb2e6b37c"},
{file = "customtkinter-5.2.2.tar.gz", hash = "sha256:fd8db3bafa961c982ee6030dba80b4c2e25858630756b513986db19113d8d207"},
]
[package.dependencies]
darkdetect = "*"
packaging = "*"
[[package]]
name = "darkdetect"
version = "0.8.0"
description = "Detect OS Dark Mode from Python"
optional = false
python-versions = ">=3.6"
files = [
{file = "darkdetect-0.8.0-py3-none-any.whl", hash = "sha256:a7509ccf517eaad92b31c214f593dbcf138ea8a43b2935406bbd565e15527a85"},
{file = "darkdetect-0.8.0.tar.gz", hash = "sha256:b5428e1170263eb5dea44c25dc3895edd75e6f52300986353cd63533fe7df8b1"},
]
[package.extras]
macos-listener = ["pyobjc-framework-Cocoa"]
[[package]]
name = "packaging"
version = "24.0"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.7"
files = [
{file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"},
{file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
]
[[package]]
name = "pillow"
version = "10.3.0"
description = "Python Imaging Library (Fork)"
optional = false
python-versions = ">=3.8"
files = [
{file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"},
{file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"},
{file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"},
{file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"},
{file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"},
{file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"},
{file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"},
{file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"},
{file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"},
{file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"},
{file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"},
{file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"},
{file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"},
{file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"},
{file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"},
{file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"},
{file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"},
{file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"},
{file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"},
{file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"},
{file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"},
{file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"},
{file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"},
{file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"},
{file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"},
{file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"},
{file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"},
{file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"},
{file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"},
{file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"},
{file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"},
{file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"},
{file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"},
{file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"},
{file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"},
{file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"},
{file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"},
{file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"},
{file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"},
{file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"},
{file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"},
{file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"},
]
[package.extras]
docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
fpx = ["olefile"]
mic = ["olefile"]
tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
typing = ["typing-extensions"]
xmp = ["defusedxml"]
[metadata]
lock-version = "2.0"
python-versions = "^3.11"
content-hash = "31b3f447818ac6dd297bde6e1c3706f3b8b77c8340504a803a2be31cfccfa274"
+16
View File
@@ -0,0 +1,16 @@
[tool.poetry]
name = "custom-tkinter"
version = "0.1.0"
description = ""
authors = ["Dmitrium12 <belicdima8@gmail.com>"]
readme = "README.md"
[tool.poetry.dependencies]
python = "^3.11"
customtkinter = "^5.2.2"
pillow = "^10.3.0"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
+101
View File
@@ -0,0 +1,101 @@
import customtkinter as ctk
from PIL import Image
app = ctk.CTk()
app.geometry("800x600")
# Функция, вызываемая при нажатии на кнопку
def on_click():
print("Кнопка нажата")
# Стандартная кнопка
button_standard = ctk.CTkButton(app, text="Стандартная", command=on_click)
button_standard.pack(pady=(10, 0))
# Кнопка с измененными цветами
button_colored = ctk.CTkButton(
app,
text="Цветная",
fg_color="lightgreen",
hover_color="lightblue",
text_color="blue",
border_color="green",
border_width=2
)
button_colored.pack(pady=10)
# Кнопка с круглыми углами
button_rounded = ctk.CTkButton(app, text="Круглая", corner_radius=15)
button_rounded.pack(pady=10)
# Кнопка с изображением
button_with_image = ctk.CTkButton(
app,
text="С изображением",
image=ctk.CTkImage(
light_image=Image.open("data/image/image.png"),
dark_image=Image.open("data/image/image.png")
)
)
button_with_image.pack(pady=10)
# Кнопка с настройками шрифта
custom_font = ctk.CTkFont(family="Helvetica", size=12, weight="bold")
button_font = ctk.CTkButton(app, text="Шрифт", font=custom_font)
button_font.pack(pady=10)
# Не анимированная кнопка
button_animated = ctk.CTkButton(app, text="Не нимированная", hover=False, command=on_click)
button_animated.pack(pady=10)
# Кнопка в состоянии disabled
button_disabled = ctk.CTkButton(app, text="Неактивная", state=ctk.DISABLED)
button_disabled.pack(pady=10)
# Кнопка с изменением курсора
button_cursor = ctk.CTkButton(app, text="Курсор", cursor="hand2")
button_cursor.pack(pady=10)
# Кнопка с измененным размером текста
button_text_size = ctk.CTkButton(app, text="Размер текста", font=("Roboto Medium", -16))
button_text_size.pack(pady=10)
# Кнопка с изменением ширины и высоты
button_size = ctk.CTkButton(app, text="Ширина и высота", width=200, height=50)
button_size.pack(pady=10)
# Кнопка с состоянием 'disabled' и измененным цветом текста в этом состоянии
button_disabled_text_color = ctk.CTkButton(
app,
text="Неактивная с цветом текста",
state=ctk.DISABLED,
fg_color="gray",
text_color="red"
)
button_disabled_text_color.pack(pady=10)
# Кнопка с примером использования пользовательского курсора
button_custom_cursor = ctk.CTkButton(app, text="Пользовательский курсор", cursor="circle")
button_custom_cursor.pack(pady=10)
# Кнопка, демонстрирующая использование лямбда-функции в команде
button_lambda_command = ctk.CTkButton(
app,
text="Лямбда команда",
command=lambda: print("Лямбда команда активирована")
)
button_lambda_command.pack(pady=10)
# Демонстрация установки переменной состояния кнопки
button_toggle_state = ctk.CTkButton(
app,
text="Переключение состояния",
command=lambda: button_toggle_state.configure(
state=ctk.DISABLED if button_toggle_state.cget("state") == ctk.NORMAL else ctk.NORMAL
)
)
button_toggle_state.pack(pady=10)
app.mainloop()
+101
View File
@@ -0,0 +1,101 @@
import customtkinter as ctk
from tkinter import IntVar
# Инициализация основного окна приложения
app = ctk.CTk()
app.geometry("400x400")
# Инициализация переменной состояния для чекбокса
checkbox_state = IntVar()
# Функция обратного вызова для чекбокса
def checkbox_callback():
print("Чекбокс изменен!")
# Функция обратного вызова, отображающая состояние чекбокса
def state_checkbox_callback():
print(f"Чекбокс изменен: {checkbox_state.get()}")
# Базовый чекбокс
checkbox_basic = ctk.CTkCheckBox(app, text="Базовый чекбокс", command=checkbox_callback)
checkbox_basic.pack(pady=10)
# Чекбокс с измененными цветами
checkbox_colored = ctk.CTkCheckBox(
app,
text="Цветной чекбокс",
fg_color="lightblue",
hover_color="lightgreen",
text_color="blue"
)
checkbox_colored.pack(pady=10)
# Чекбокс с изменением шрифта текста
checkbox_font = ctk.CTkCheckBox(app, text="Чекбокс с шрифтом", font=("Arial", 12, "bold"))
checkbox_font.pack(pady=10)
# Чекбокс в начальном состоянии "выбрано"
checkbox_checked = ctk.CTkCheckBox(
app,
text="Изначально выбрано",
variable=ctk.IntVar(value=1)
)
checkbox_checked.pack(pady=10)
# Чекбокс в состоянии "disabled"
checkbox_disabled = ctk.CTkCheckBox(app, text="Неактивный чекбокс", state=ctk.DISABLED)
checkbox_disabled.pack(pady=10)
# Чекбокс с пользовательским размером
checkbox_custom_size = ctk.CTkCheckBox(
app,
text="Чекбокс большего размера",
width=150,
height=25
)
checkbox_custom_size.pack(pady=10)
# Чекбокс с использованием переменной состояния
checkbox_with_var = ctk.CTkCheckBox(
app,
text="Чекбокс с переменной",
variable=checkbox_state,
command=state_checkbox_callback
)
checkbox_with_var.pack(pady=10)
# Демонстрация динамического изменения свойств чекбокса
def toggle_checkbox_state():
if checkbox_with_var.get() == 0:
checkbox_with_var.select()
else:
checkbox_with_var.deselect()
# или можно просто использовать checkbox_with_var.toggle()
# и не потребуется даже условие
# только при использовании checkbox_with_var.toggle()
# будет вызываться функция state_checkbox_callback
toggle_btn = ctk.CTkButton(app, text="Переключить чекбокс", command=toggle_checkbox_state)
toggle_btn.pack(pady=10)
# Чекбокс с измененными параметрами для более тонкой кастомизации
checkbox_custom = ctk.CTkCheckBox(
app,
text="Кастомизированный чекбокс",
fg_color="lightgrey",
hover_color="lightblue",
checkmark_color="green",
text_color="black",
border_color="blue",
border_width=2,
corner_radius=5
)
checkbox_custom.pack(pady=10)
# Запуск главного цикла приложения
app.mainloop()
+92
View File
@@ -0,0 +1,92 @@
import customtkinter as ctk
from tkinter import StringVar
app = ctk.CTk()
app.geometry("400x800")
# Функция обратного вызова для выпадающего списка
def combobox_callback(_=None):
print(f"Выбрано: {combobox.get()}")
# Функция обратного вызова для выпадающего списка
def get_combobox_callback(_=None):
selected_item = combobox_advanced.get()
print(f"Выбрано: {selected_item}")
# Создание выпадающего списка с некоторыми опциями
options = ["Опция 1", "Опция 2", "Опция 3"]
combobox = ctk.CTkComboBox(app, values=options, command=combobox_callback)
combobox.pack(pady=20)
# Выпадающий список с измененными цветами
combobox_colored = ctk.CTkComboBox(
app,
values=options,
fg_color="lightblue",
button_color="lightgreen",
text_color="blue",
dropdown_text_color="green"
)
combobox_colored.pack(pady=20)
# Выпадающий список с изменением шрифта
combobox_font = ctk.CTkComboBox(
app,
values=options,
font=("Arial", 12, "bold"),
dropdown_font=("Arial", 10)
)
combobox_font.pack(pady=20)
# Выпадающий список с начальным выбранным значением
combobox_default_value = ctk.CTkComboBox(
app,
values=options,
variable=ctk.StringVar(value="Опция 2")
)
combobox_default_value.pack(pady=20)
# Выпадающий список в состоянии "disabled"
combobox_disabled = ctk.CTkComboBox(app, values=options, state=ctk.DISABLED)
combobox_disabled.pack(pady=20)
# Выпадающий список с пользовательским размером
combobox_custom_size = ctk.CTkComboBox(app, values=options, width=200, height=30)
combobox_custom_size.pack(pady=20)
# Создание выпадающего списка с расширенными опциями
options = ["Опция 1", "Опция 2", "Опция 3", "Опция 4"]
combobox_advanced = ctk.CTkComboBox(app, values=options, command=get_combobox_callback)
combobox_advanced.pack(pady=10)
# Установка значения по умолчанию
combobox_advanced.set("Опция 2")
# Создание StringVar для связывания с выпадающим списком
variable = StringVar(value="Опция 3")
combobox_with_var = ctk.CTkComboBox(app, values=options, variable=variable)
combobox_with_var.pack(pady=10)
# Демонстрация динамического изменения опций
def update_options():
new_options = ["Новая Опция 1", "Новая Опция 2", "Новая Опция 3"]
combobox.configure(values=new_options)
update_btn = ctk.CTkButton(app, text="Обновить опции", command=update_options)
update_btn.pack(pady=10)
# Выпадающий список с пользовательскими стилями
combobox_styled = ctk.CTkComboBox(
app,
values=options,
button_hover_color="red",
dropdown_hover_color="lightblue"
)
combobox_styled.pack(pady=10)
app.mainloop()
+53
View File
@@ -0,0 +1,53 @@
import customtkinter as ctk
app = ctk.CTk()
app.geometry("500x350")
# Функция для изменения шрифта виджета
def change_font(widget, name, size, style):
widget.configure(font=(name, size, style))
# Создание метки с базовым шрифтом
label = ctk.CTkLabel(app, text="Текст с базовым шрифтом", font=("Helvetica", 12))
label.pack(pady=10)
# Создание кнопки, шрифт которой можно изменить
button = ctk.CTkButton(app, text="Кнопка с изменяемым шрифтом")
button.pack(pady=10)
# Создание списка шрифтов
font_list = ["Helvetica", "Arial", "Times", "Courier"]
font_size = 12
font_style = "normal"
# Переключение между шрифтами
def rotate_font():
global font_list, font_size, font_style
current_font = font_list.pop(0) # Получаем первый шрифт из списка и удаляем его
font_list.append(current_font) # Добавляем шрифт обратно в конец списка
change_font(button, current_font, font_size, font_style)
button.configure(
text=f"Шрифт: {current_font}, Размер: {font_size}, Стиль: {font_style}"
)
rotate_button = ctk.CTkButton(app, text="Сменить шрифт кнопки", command=rotate_font)
rotate_button.pack(pady=10)
# Изменение размера шрифта
def change_size():
global font_size
font_size = 12 if font_size == 16 else 16 # Переключение между размерами 12 и 16
style = "bold" if font_size == 16 else "normal"
change_font(button, font_list[-1], font_size, style)
button.configure(text=f"Шрифт: {font_list[-1]}, Размер: {font_size}, Стиль: {style}")
size_button = ctk.CTkButton(app, text="Изменить размер шрифта", command=change_size)
size_button.pack(pady=10)
app.mainloop()
+25
View File
@@ -0,0 +1,25 @@
import customtkinter
class MyFrame(customtkinter.CTkFrame):
def __init__(self, master, **kwargs):
super().__init__(master, **kwargs)
# add widgets onto the frame, for example:
self.label = customtkinter.CTkLabel(self)
self.label.grid(row=0, column=0, padx=20)
class App(customtkinter.CTk):
def __init__(self):
super().__init__()
self.geometry("400x200")
self.grid_rowconfigure(0, weight=1) # configure grid system
self.grid_columnconfigure(0, weight=1)
self.my_frame = MyFrame(master=self)
self.my_frame.grid(row=0, column=0, padx=20, pady=20, sticky="nsew")
app = App()
app.mainloop()
+41
View File
@@ -0,0 +1,41 @@
import customtkinter as ctk
from tkinter import Toplevel
def open_advanced_input_dialog():
# Создание дополнительного окна
dialog = Toplevel(app)
dialog.geometry("300x200")
dialog.title("Advanced Input Dialog")
# Виджеты для ввода текста
label = ctk.CTkLabel(dialog, text="Введите ваше имя:")
label.pack(pady=20)
input_entry = ctk.CTkEntry(dialog, width=250, placeholder_text="Имя")
input_entry.pack(pady=10)
# Функция для обработки введенных данных
def submit():
response = input_entry.get()
print(f"Полученное имя: {response}")
dialog.destroy()
submit_button = ctk.CTkButton(dialog, text="Отправить", command=submit)
submit_button.pack(pady=20)
# Улучшенное оформление диалога
dialog.configure(highlightcolor='black') # задание фона диалогового окна
app = ctk.CTk()
app.geometry("400x250")
open_dialog_button = ctk.CTkButton(
app,
text="Открыть продвинутый диалог ввода",
command=open_advanced_input_dialog
)
open_dialog_button.pack(pady=50)
app.mainloop()
+47
View File
@@ -0,0 +1,47 @@
import customtkinter as ctk
from PIL import Image
app = ctk.CTk()
app.geometry("500x500")
# Дополнительный пример с использованием изображения через PIL
# Замените "example.png" на путь к вашему изображению
try:
label_pil_image = ctk.CTkLabel(app, image=ctk.CTkImage(
light_image=Image.open("data/image/image.png"),
dark_image=Image.open("data/image/image.png")
))
label_pil_image.pack(pady=20)
except FileNotFoundError:
print("Файл изображения не найден")
# Метка с многострочным текстом и выравниванием
label_multiline = ctk.CTkLabel(
app,
text="Многострочный\nтекст с выравниванием",
justify="left",
width=200,
height=100
)
label_multiline.pack(pady=10)
# Метка с определенной высотой и автоматическим переносом текста
label_wraplength = ctk.CTkLabel(
app,
text="Текст с автоматическим переносом при достижении определенной ширины.",
wraplength=200
)
label_wraplength.pack(pady=10)
# Демонстрация использования различных параметров текста
label_text_features = ctk.CTkLabel(
app,
text="Различные стили текста",
font=("Arial", 14),
text_color="darkred",
fg_color="lightgrey",
corner_radius=10
)
label_text_features.pack(pady=10)
app.mainloop()
+66
View File
@@ -0,0 +1,66 @@
import customtkinter as ctk
from tkinter import StringVar
app = ctk.CTk()
app.geometry("400x300")
# Функция обратного вызова для CTkOptionMenu
def option_menu_callback(option):
print(f"Выбрано: {option}")
# Создаем переменную для хранения выбранного значения
selected_option = StringVar(value="Опция 1")
# Создание CTkOptionMenu с несколькими опциями
options = ["Опция 1", "Опция 2", "Опция 3"]
option_menu = ctk.CTkOptionMenu(
app,
variable=selected_option,
values=options,
command=option_menu_callback
)
option_menu.pack(pady=20)
# CTkOptionMenu с измененным внешним видом
option_menu_custom = ctk.CTkOptionMenu(
app,
variable=selected_option,
values=options,
command=option_menu_callback,
fg_color="lightblue",
button_color="grey",
dropdown_hover_color="lightgrey",
bg_color="lightgreen"
)
option_menu_custom.pack(pady=20)
# CTkOptionMenu с измененным шрифтом и цветом текста
option_menu_font = ctk.CTkOptionMenu(
app,
variable=selected_option,
values=options,
command=option_menu_callback,
font=("Arial", 12),
text_color="blue",
dropdown_font=("Arial", 10),
dropdown_text_color="darkblue"
)
option_menu_font.pack(pady=20)
# Установка начального выбранного значения через переменную
selected_option.set("Опция 2")
# Динамическое обновление списка опций
def update_options():
new_options = ["Новая Опция 1", "Новая Опция 2", "Новая Опция 3"]
option_menu.configure(values=new_options)
option_menu.set("Новая Опция 1")
update_options_button = ctk.CTkButton(app, text="Обновить опции", command=update_options)
update_options_button.pack(pady=20)
app.mainloop()
+51
View File
@@ -0,0 +1,51 @@
import customtkinter as ctk
from tkinter import DoubleVar
import time
app = ctk.CTk()
app.geometry("400x200")
# Создание переменной для прогресса
progress_var = DoubleVar(value=0)
# Функция для обновления прогресса
def start_progress():
progress = progress_var.get()
if progress < 100:
progress += 10
progress_var.set(progress)
app.after(100, start_progress) # Обновляем каждые 100 мс
else:
progress_var.set(0) # Сброс прогресса после достижения 100%
# Создание CTkProgressBar
progress_bar = ctk.CTkProgressBar(app, variable=progress_var, width=350, height=25)
progress_bar.pack(pady=40)
# Запуск прогресса
start_progress()
def simulate_long_process():
# Функция для имитации длительного процесса
current_value = 0
while current_value <= 100:
time.sleep(0.05) # Имитация задержки
progress_bar.set(current_value)
current_value += 1
if current_value > 100:
# Опционально: сбросить прогресс после завершения
progress_bar.set(0)
# Создание CTkProgressBar с расширенными настройками
progress_bar = ctk.CTkProgressBar(app, width=300, height=20, progress_color="green",
fg_color="gray", corner_radius=8)
progress_bar.pack(pady=20)
# Можно было бы запустить simulate_long_process в фоновом потоке для обновления
# прогресс-бара, но для простоты этот код не включает многопоточность.
app.mainloop()
+90
View File
@@ -0,0 +1,90 @@
import customtkinter as ctk
from tkinter import IntVar
app = ctk.CTk()
app.geometry("400x300")
selected_option = IntVar(value=0)
def radio_button_callback():
print(f"Выбрано значение: {selected_option.get()}")
radio_button_1 = ctk.CTkRadioButton(
app,
text="Вариант 1",
variable=selected_option,
value=1,
command=radio_button_callback
)
radio_button_1.pack(pady=10)
radio_button_2 = ctk.CTkRadioButton(
app,
text="Вариант 2",
variable=selected_option,
value=2,
command=radio_button_callback
)
radio_button_2.pack(pady=10)
radio_button_3 = ctk.CTkRadioButton(
app,
text="Вариант 3",
variable=selected_option,
value=3,
command=radio_button_callback
)
radio_button_3.pack(pady=10)
new_selected_option = IntVar()
def option_changed():
print(f"Выбрана опция: {new_selected_option.get()}")
radio_button_1 = ctk.CTkRadioButton(
app,
text="Опция 1",
variable=new_selected_option,
value=1,
command=option_changed,
fg_color="lightgrey",
hover_color="grey",
text_color="black"
)
radio_button_1.pack(pady=10)
radio_button_2 = ctk.CTkRadioButton(
app,
text="Опция 2",
variable=new_selected_option,
value=2,
command=option_changed,
fg_color="lightblue",
hover_color="blue",
text_color="white"
)
radio_button_2.pack(pady=10)
radio_button_3 = ctk.CTkRadioButton(
app,
text="Опция 3",
variable=new_selected_option,
value=3,
command=option_changed,
fg_color="lightgreen",
hover_color="green",
text_color="black"
)
radio_button_3.pack(pady=10)
def change_properties():
radio_button_3.configure(text="Измененная Опция 3", fg_color="purple",
text_color="white")
change_properties_button = ctk.CTkButton(
app,
text="Изменить свойства Опции 3",
command=change_properties
)
change_properties_button.pack(pady=20)
app.mainloop()
+60
View File
@@ -0,0 +1,60 @@
import customtkinter as ctk
app = ctk.CTk()
app.geometry("500x400")
# Создание прокручиваемой рамки
scrollable_frame = ctk.CTkScrollableFrame(
app,
width=480,
height=350,
scrollbar_fg_color="gray",
corner_radius=10
)
scrollable_frame.pack(pady=20)
# Добавление множества виджетов для демонстрации прокрутки
for i in range(30):
label = ctk.CTkLabel(
scrollable_frame,
text=f"Элемент {i + 1}",
height=30,
fg_color=("white", "gray")
)
label.pack(pady=5, padx=10, fill='x')
# Создание прокручиваемой рамки с дополнительными настройками внешнего вида
scrollable_frame = ctk.CTkScrollableFrame(
app,
width=480,
height=350,
scrollbar_button_color="gray",
corner_radius=10,
scrollbar_fg_color="lightgrey",
scrollbar_button_hover_color="darkgrey"
)
scrollable_frame.pack(pady=20, expand=True, fill="both")
# Добавление множества виджетов для демонстрации прокрутки
for i in range(50):
button = ctk.CTkButton(scrollable_frame, text=f"Кнопка {i + 1}", height=30)
button.pack(pady=5, padx=10, fill='x')
# Динамическое изменение свойств скроллбара и рамки
def update_scrollbar_properties():
scrollable_frame.configure(
scrollbar_button_color="blue",
scrollbar_button_hover_color="navy",
scrollbar_fg_color="white"
)
update_button = ctk.CTkButton(
scrollable_frame,
text="Обновить свойства скроллбара",
command=update_scrollbar_properties
)
update_button.pack(pady=10)
app.mainloop()
+48
View File
@@ -0,0 +1,48 @@
import customtkinter as ctk
from tkinter import Canvas
app = ctk.CTk()
app.geometry("500x400")
# Создание холста
canvas = Canvas(app, bg="white", height=500, width=400)
canvas.pack(side="left", fill="both", expand=True)
# Создание скроллбара
scrollbar = ctk.CTkScrollbar(app, orientation="vertical", command=canvas.yview)
scrollbar.pack(side="right", fill="y")
# Конфигурация холста для прокрутки
canvas.configure(yscrollcommand=scrollbar.set)
canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
# Добавление элементов на холст для демонстрации прокрутки
for i in range(50):
canvas.create_text(
200,
i * 20,
text=f"Элемент {i + 1}",
font=("Helvetica", 10),
fill="black"
)
def update_scrollbar_style():
scrollbar.configure(
button_color="red",
button_hover_color="darkred",
bg_color="blue",
fg_color="yellow",
corner_radius=0
)
# Кнопка для обновления стиля скроллбаров
style_button = ctk.CTkButton(
app,
text="Обновить стиль скроллбаров",
command=update_scrollbar_style
)
style_button.pack(side="bottom", pady=20)
app.mainloop()
+24
View File
@@ -0,0 +1,24 @@
import customtkinter as ctk
from tkinter import Tk
def on_option_change(value):
print(f"Выбрана опция: {value}")
app = ctk.CTk()
app.geometry("300x200")
# Создание виджета CTkSegmentedButton
options = ["Опция 1", "Опция 2", "Опция 3"]
segmented_button = ctk.CTkSegmentedButton(app, values=options, command=on_option_change)
segmented_button.configure(
text_color_disabled="lightgrey",
selected_color="blue",
selected_hover_color="darkgrey",
text_color="black",
font=("Arial", 12),
corner_radius=5,
)
segmented_button.pack(pady=20)
app.mainloop()
+37
View File
@@ -0,0 +1,37 @@
import customtkinter as ctk
def slider_changed(value):
# Функция, вызываемая при изменении значения слайдера
print(f"Текущее значение слайдера: {value}")
app = ctk.CTk()
app.geometry("500x300")
# Создание слайдера с расширенными настройками внешнего вида
slider = ctk.CTkSlider(app, from_=0, to=100, orientation="horizontal",
command=slider_changed, width=400, height=20)
slider.pack(pady=40)
# Применение продвинутых настроек к слайдеру
slider.configure(
button_color="blue", # Цвет кнопки ползунка
button_hover_color="navy", # Цвет кнопки ползунка при наведении
border_color="lightblue", # Цвет дорожки слайдера
progress_color="darkblue", # Цвет заполненной части слайдера
fg_color="grey", # Цвет неактивной части дорожки
button_corner_radius=10, # Радиус закругления кнопки
border_width=10 # Ширина дорожки
)
# Добавление кнопки для демонстрации управления значением слайдера из кода
def set_slider_value():
slider.set(50) # Установка значения слайдера на 50
button = ctk.CTkButton(app, text="Установить значение 50", command=set_slider_value)
button.pack(pady=20)
app.mainloop()
+43
View File
@@ -0,0 +1,43 @@
import customtkinter as ctk
def switch_callback():
print("Переключатель включен" if switch.get() else "Переключатель выключен")
app = ctk.CTk()
app.geometry("400x300")
# Создание переключателя с расширенными параметрами настройки
switch = ctk.CTkSwitch(
app,
text="Включить опцию",
command=switch_callback,
width=100,
height=30
)
switch.pack(pady=20)
# Применение продвинутых настроек внешнего вида
switch.configure(
button_hover_color="blue", # Цвет активного состояния переключателя
border_color="darkblue", # Цвет активного состояния при наведении
text_color_disabled="grey", # Цвет неактивного состояния переключателя
button_color="white", # Цвет кнопки переключателя
text_color="black", # Цвет кнопки при наведении
progress_color="darkgrey", # Цвет неактивной кнопки
corner_radius=15, # Радиус закругления кнопки
bg_color="lightgrey", # Цвет фона переключателя
fg_color="black" # Цвет текста
)
# Добавление кнопки для демонстрации управления состоянием переключателя
def toggle_switch():
switch.toggle() # Переключение состояния
toggle_button = ctk.CTkButton(app, text="Переключить состояние", command=toggle_switch)
toggle_button.pack(pady=20)
app.mainloop()
+32
View File
@@ -0,0 +1,32 @@
import customtkinter as ctk
app = ctk.CTk()
app.geometry("600x450")
# Функция, вызываемая при смене вкладки
def on_tab_change():
print(f"Активная вкладка: {tab_view.get()}")
# Создание виджета вкладок с расширенными настройками
tab_view = ctk.CTkTabview(app, command=on_tab_change)
tab_view.pack(fill="both", expand=True, padx=20, pady=20)
# Создание содержимого для вкладок
for i in range(1, 5):
frame = ctk.CTkFrame(tab_view)
tab_view.add(name=f"Вкладка {i}")
label = ctk.CTkLabel(frame, text=f"Содержимое Вкладки {i}")
label.pack(pady=20)
# Настройка стилей вкладок
tab_view.configure(
fg_color="lightblue",
segmented_button_selected_color="blue",
text_color="white",
segmented_button_selected_hover_color="yellow",
)
app.mainloop()
+48
View File
@@ -0,0 +1,48 @@
import customtkinter as ctk
app = ctk.CTk()
app.geometry("500x300")
# Создание виджета текстового поля с расширенными настройками
textbox = ctk.CTkTextbox(app, width=350, height=50)
textbox.insert(0.0, "Введите текст здесь")
textbox.pack(pady=20)
# Продвинутые настройки внешнего вида и поведения
textbox.configure(
fg_color="lightgrey", # Цвет фона
text_color="black", # Цвет текста
corner_radius=8, # Радиус закругления углов
border_width=1, # Ширина границы
border_color="blue", # Цвет границы
bg_color="red", # Цвет подсветки при фокусе
font=("Arial", 12), # Шрифт текста
padx=10 # Отступ текста внутри поля
)
# Динамические функции для работы с текстом
def update_text():
textbox.insert(0.0, "Демонстрация изменения текста")
# Устанавливаем новый текст
def clear_text():
textbox.delete(0.0, "end") # Очищаем текст
def get_text():
print("Текущий текст:", textbox.get(0.0, "end"))
# Получаем и выводим текущий текст
update_button = ctk.CTkButton(app, text="Обновить текст", command=update_text)
update_button.pack(pady=5)
clear_button = ctk.CTkButton(app, text="Очистить текст", command=clear_text)
clear_button.pack(pady=5)
get_text_button = ctk.CTkButton(app, text="Получить текст", command=get_text)
get_text_button.pack(pady=5)
app.mainloop()
+42
View File
@@ -0,0 +1,42 @@
import customtkinter as ctk
app = ctk.CTk()
app.geometry("600x450")
def open_advanced_toplevel():
# Создание продвинутого вспомогательного окна
advanced_toplevel = ctk.CTkToplevel(app)
advanced_toplevel.geometry("400x300")
advanced_toplevel.title("Расширенное вспомогательное окно")
# Кастомизация внешнего вида окна
advanced_toplevel.configure(
fg_color='lightblue', # Цвет фона окна
resizable=(True, True) # Разрешить изменение размера окна
)
# Добавление виджетов
label = ctk.CTkLabel(advanced_toplevel, text="Это расширенное вспомогательное окно")
label.pack(pady=20)
entry = ctk.CTkEntry(advanced_toplevel, placeholder_text="Введите что-нибудь")
entry.pack(pady=20)
close_button = ctk.CTkButton(
advanced_toplevel,
text="Закрыть окно",
command=advanced_toplevel.destroy
)
close_button.pack(pady=20)
# Кнопка для открытия расширенного вспомогательного окна
open_window_button = ctk.CTkButton(
app,
text="Открыть расширенное вспомогательное окно",
command=open_advanced_toplevel
)
open_window_button.pack(pady=50)
app.mainloop()