From cb20ef359c7bac9f47a36955785a64b7a1ec54a1 Mon Sep 17 00:00:00 2001 From: FishCat233 <50800434+FishCat233@users.noreply.github.com> Date: Sun, 11 Jan 2026 18:20:55 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(update):=20=E5=8A=A0=E4=BA=86=E4=B8=AA?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=9B=B4=E6=96=B0=E7=9A=84=E6=8C=89=E9=92=AE?= =?UTF-8?q?=EF=BC=8C=E4=BD=86=E6=98=AF=E6=B2=A1=E5=86=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SimpleCutPy.fbp | 226 ++++++++++++++++++++++++++++++-------------- src/SimpleCutPy.py | 14 ++- 2 files changed, 169 insertions(+), 71 deletions(-) diff --git a/src/SimpleCutPy.fbp b/src/SimpleCutPy.fbp index 6847138..3f08810 100644 --- a/src/SimpleCutPy.fbp +++ b/src/SimpleCutPy.fbp @@ -2078,77 +2078,163 @@ 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 0 - 1 - - 1 - - - 0 - 0 - wxID_ANY - 访问项目 - - 0 - - 0 - - - 0 + wxEXPAND + 1 + - 1 - ProjectWebBtn - 1 - - - protected - 1 - - - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - on_open_project_website_button_click + bSizer161 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 0 + 1 + + 1 + + + 0 + 0 + wxID_ANY + 访问项目 + + 0 + + 0 + + + 0 + + 1 + ProjectWebBtn + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + on_open_project_website_button_click + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 0 + 1 + + 1 + + + 0 + 0 + wxID_ANY + 检查更新 + + 0 + + 0 + + + 0 + + 1 + ProjectWebBtn1 + 1 + + + protected + 1 + + + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + on_check_update_button_click + + diff --git a/src/SimpleCutPy.py b/src/SimpleCutPy.py index 5fc45a6..555cd26 100644 --- a/src/SimpleCutPy.py +++ b/src/SimpleCutPy.py @@ -210,8 +210,16 @@ def __init__( self, parent ): bSizer8.Add( self.VersionText, 0, wx.ALL, 5 ) + bSizer161 = wx.BoxSizer( wx.HORIZONTAL ) + self.ProjectWebBtn = wx.Button( self.m_panel4, wx.ID_ANY, u"访问项目", wx.DefaultPosition, wx.DefaultSize, 0 ) - bSizer8.Add( self.ProjectWebBtn, 0, wx.ALL, 5 ) + bSizer161.Add( self.ProjectWebBtn, 0, wx.ALL, 5 ) + + self.ProjectWebBtn1 = wx.Button( self.m_panel4, wx.ID_ANY, u"检查更新", wx.DefaultPosition, wx.DefaultSize, 0 ) + bSizer161.Add( self.ProjectWebBtn1, 0, wx.ALL, 5 ) + + + bSizer8.Add( bSizer161, 1, wx.EXPAND, 5 ) self.m_panel4.SetSizer( bSizer8 ) @@ -239,6 +247,7 @@ def __init__( self, parent ): self.SizeControlMode.Bind( wx.EVT_CHOICE, self.on_size_control_mode_change ) self.ExportBtn.Bind( wx.EVT_BUTTON, self.on_export_button_click ) self.ProjectWebBtn.Bind( wx.EVT_BUTTON, self.on_open_project_website_button_click ) + self.ProjectWebBtn1.Bind( wx.EVT_BUTTON, self.on_check_update_button_click ) def __del__( self ): pass @@ -278,4 +287,7 @@ def on_export_button_click( self, event ): def on_open_project_website_button_click( self, event ): event.Skip() + def on_check_update_button_click( self, event ): + event.Skip() + From c7d3dfdd93160f238df3392381585d476d4c753a Mon Sep 17 00:00:00 2001 From: FishCat233 <50800434+FishCat233@users.noreply.github.com> Date: Sun, 11 Jan 2026 18:55:28 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(=E6=9B=B4=E6=96=B0=E6=A3=80=E6=9F=A5):?= =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 tools/version.py 实现版本检查和比较功能 - 在 SimpleCutMainFrame.py 中添加更新检查按钮事件处理 - 更新 pyproject.toml 添加 requests 依赖 - 修改 meta.py 中版本号格式 --- pyproject.toml | 1 + src/SimpleCutMainFrame.py | 31 +++++++++++++ src/meta.py | 2 +- src/tools/__init__.py | 0 src/tools/version.py | 97 +++++++++++++++++++++++++++++++++++++++ uv.lock | 69 ++++++++++++++++++++++++++++ 6 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 src/tools/__init__.py create mode 100644 src/tools/version.py diff --git a/pyproject.toml b/pyproject.toml index af14b6f..55e6ac8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,7 @@ dependencies = [ "logging>=0.4.9.6", "pydantic>=2.12.5", "pymediainfo>=7.0.1", + "requests>=2.32.5", "wxpython>=4.2.2", ] diff --git a/src/SimpleCutMainFrame.py b/src/SimpleCutMainFrame.py index f57b750..e1c2899 100644 --- a/src/SimpleCutMainFrame.py +++ b/src/SimpleCutMainFrame.py @@ -10,6 +10,7 @@ import webbrowser import wx +import tools.version import meta import SimpleCutPy @@ -162,6 +163,36 @@ def on_export_button_click(self, event): def on_open_project_website_button_click(self, event): webbrowser.open("https://github.com/FishCat233/SimpleCutPy") + def on_check_update_button_click(self, event): + """检查更新按钮点击事件""" + try: + update_info = tools.version.check_update() + except Exception as e: + logging.error(f"检查更新失败:{e}") + wx.MessageBox("检查更新失败,请稍后再试!", "错误", wx.OK | wx.ICON_ERROR) + return + + if update_info.has_new_version: + # 有新版本 + dlg = wx.MessageDialog( + self, + f"发现新版本 {update_info.latest_version}!\n当前版本:{update_info.current_version}\n\n是否打开下载页面?", + "检查更新", + wx.YES_NO | wx.ICON_INFORMATION, + ) + result = dlg.ShowModal() + dlg.Destroy() + + if result == wx.ID_YES: + webbrowser.open(update_info.release_url) + else: + # 当前已是最新版本 + wx.MessageBox( + f"当前已是最新版本 {update_info.current_version}!", + "检查更新", + wx.OK | wx.ICON_INFORMATION, + ) + def on_clear_all_button_click(self, event): self.core_controller.clear_all_files() logging.debug( diff --git a/src/meta.py b/src/meta.py index c91a341..e53422c 100644 --- a/src/meta.py +++ b/src/meta.py @@ -1 +1 @@ -VERSION = "0.5.0" +VERSION = "v0.5.0" diff --git a/src/tools/__init__.py b/src/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tools/version.py b/src/tools/version.py new file mode 100644 index 0000000..3136108 --- /dev/null +++ b/src/tools/version.py @@ -0,0 +1,97 @@ +from dataclasses import dataclass +import logging +import requests + +import meta + +CHECK_URL = "https://api.github.com/repos/FishCat233/SimpleCutPy/releases/latest" + + +@dataclass +class UpdateInfo: + """更新信息""" + + has_new_version: bool + current_version: str + latest_version: str + release_url: str + + +def check_update() -> UpdateInfo: + """检查更新 + + Returns: + UpdateInfo: 更新信息 + + Raises: + Exception: 反正会发出异常就对了 + """ + response = requests.get(CHECK_URL, timeout=10) + response.raise_for_status() + json_data = response.json() + + logging.debug( + f"检查更新,当前版本:{meta.VERSION},最新版本:{json_data['tag_name']}" + ) + + update_info = UpdateInfo( + has_new_version=is_new_version(meta.VERSION, json_data["tag_name"]), + current_version=meta.VERSION, + latest_version=json_data["tag_name"], + release_url=json_data["html_url"], + ) + + logging.debug(f"检查更新: {update_info}") + + return update_info + + +def is_new_version(current_version: str, latest_version: str) -> bool: + """判断是否有新版本 + + Args: + current_version (str): 当前版本号 + latest_version (str): 最新版本号 + + Returns: + bool: 是否有新版本 + """ + current_version_numbers, current_build = resolve_version(current_version) + latest_version_numbers, latest_build = resolve_version(latest_version) + + for current, latest in zip(current_version_numbers, latest_version_numbers): + if latest > current: + return True + elif latest < current: + return False + + return latest_build > current_build + + +def resolve_version(version: str) -> tuple[list[int], int]: + """解析版本号 + + Args: + version (str): 版本号字符串,例如 "v1.2.3-0000" 或 "1.2.3" + + Returns: + tuple[list[int], int]: 版本号的整数列表和构建号,例如 ([1, 2, 3], 0) 或 ([1, 2, 3], -1) + """ + version = version.lstrip("v") + + # 安全地分割版本号和构建号 + if "-" in version: + version_part, build_part = version.split("-", 1) # 只分割一次 + build_number = int(build_part) if build_part.isdigit() else -1 + else: + version_part = version + build_number = -1 + + # 安全地分割版本号部分 + try: + version_numbers = [int(part) for part in version_part.split(".")] + except ValueError: + # 如果版本号部分包含非数字,返回默认值 + version_numbers = [0] + + return version_numbers, build_number diff --git a/uv.lock b/uv.lock index 0e65021..5c91d3d 100644 --- a/uv.lock +++ b/uv.lock @@ -20,6 +20,49 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + [[package]] name = "logging" version = "0.4.9.6" @@ -163,6 +206,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, ] +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + [[package]] name = "setuptools" version = "80.9.0" @@ -180,6 +238,7 @@ dependencies = [ { name = "logging" }, { name = "pydantic" }, { name = "pymediainfo" }, + { name = "requests" }, { name = "wxpython" }, ] @@ -193,6 +252,7 @@ requires-dist = [ { name = "logging", specifier = ">=0.4.9.6" }, { name = "pydantic", specifier = ">=2.12.5" }, { name = "pymediainfo", specifier = ">=7.0.1" }, + { name = "requests", specifier = ">=2.32.5" }, { name = "wxpython", specifier = ">=4.2.2" }, ] @@ -220,6 +280,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + [[package]] name = "wxpython" version = "4.2.4"