all added
This commit is contained in:
+321
@@ -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
@@ -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"
|
||||||
@@ -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"
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
@@ -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()
|
||||||
Reference in New Issue
Block a user