From ce0ca2844bbf4a4351a7047a5cb66e24690fa6a8 Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Sat, 13 Apr 2024 18:08:14 +0900 Subject: [PATCH 1/7] =?UTF-8?q?[Update]=20Model=20:=20Update=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92threads=E5=87=A6=E7=90=86=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fncにプログレスの数値情報を設定できるように追加 - スプラッシュUIから処理が抜けるのでUIの修正が必要 --- controller.py | 4 +-- model.py | 68 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/controller.py b/controller.py index 054f0d6c..4eb48038 100644 --- a/controller.py +++ b/controller.py @@ -8,9 +8,9 @@ from utils import getKeyByValue, isUniqueStrings, strPctToInt import argparse # Common -def callbackUpdateSoftware(): +def callbackUpdateSoftware(fnc=None): setMainWindowGeometry() - model.updateSoftware() + model.updateSoftware(restart=True, fnc=fnc) def callbackRestartSoftware(): setMainWindowGeometry() diff --git a/model.py b/model.py index 0f844182..6b97a918 100644 --- a/model.py +++ b/model.py @@ -256,35 +256,51 @@ class Model: @staticmethod def updateSoftware(restart:bool=True, func=None): - filename = 'VRCT.zip' - program_name = 'VRCT.exe' - folder_name = '_internal' - tmp_directory_name = 'tmp' - batch_name = 'update.bat' - current_directory = config.PATH_LOCAL + def updateSoftwareTask(): + filename = 'VRCT.zip' + program_name = 'VRCT.exe' + folder_name = '_internal' + tmp_directory_name = 'tmp' + batch_name = 'update.bat' + current_directory = config.PATH_LOCAL - try: - res = requests_get(config.GITHUB_URL) - assets = res.json()['assets'] - url = [i["browser_download_url"] for i in assets if i["name"] == filename][0] - with tempfile.TemporaryDirectory() as tmp_path: - res = requests_get(url, stream=True) - file_size = int(res.headers.get('content-length', 0)) - total_chunk = 0 - with open(os_path.join(tmp_path, filename), 'wb') as file: - for chunk in res.iter_content(chunk_size=1024*5): - file.write(chunk) - if isinstance(func, Callable): + try: + res = requests_get(config.GITHUB_URL) + assets = res.json()['assets'] + url = [i["browser_download_url"] for i in assets if i["name"] == filename][0] + with tempfile.TemporaryDirectory() as tmp_path: + res = requests_get(url, stream=True) + file_size = int(res.headers.get('content-length', 0)) + total_chunk = 0 + with open(os_path.join(tmp_path, filename), 'wb') as file: + for chunk in res.iter_content(chunk_size=1024*5): + file.write(chunk) total_chunk += len(chunk) - func(total_chunk/file_size) + if isinstance(func, Callable): + func(total_chunk/file_size) + print(f"downloaded {total_chunk}/{file_size}") - with ZipFile(os_path.join(tmp_path, filename)) as zf: - zf.extractall(os_path.join(current_directory, tmp_directory_name)) - copyfile(os_path.join(current_directory, folder_name, "batch", batch_name), os_path.join(current_directory, batch_name)) - command = [os_path.join(current_directory, batch_name), program_name, folder_name, tmp_directory_name, str(restart)] - Popen(command, cwd=current_directory) - except Exception: - webbrowser.open(config.BOOTH_URL, new=2, autoraise=True) + with ZipFile(os_path.join(tmp_path, filename)) as zf: + total_files = len(zf.infolist()) + extracted_files = 0 + for file_info in zf.infolist(): + extracted_files += 1 + zf.extract(file_info, os_path.join(current_directory, tmp_directory_name)) + if isinstance(func, Callable): + func(extracted_files / total_files) + print(f"extracted {extracted_files}/{total_files}") + + copyfile(os_path.join(current_directory, folder_name, "batch", batch_name), os_path.join(current_directory, batch_name)) + command = [os_path.join(current_directory, batch_name), program_name, folder_name, tmp_directory_name, str(restart)] + Popen(command, cwd=current_directory) + except Exception as e: + import traceback + with open('error.log', 'a') as f: + traceback.print_exc(file=f) + webbrowser.open(config.BOOTH_URL, new=2, autoraise=True) + th_update_software = threadFnc(updateSoftwareTask) + th_update_software.daemon = True + th_update_software.start() @staticmethod def reStartSoftware(): From e51fd602bf54b781043ce1cd5e9d63634b03a2b2 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Sun, 14 Apr 2024 06:08:43 +0900 Subject: [PATCH 2/7] =?UTF-8?q?[bugfix]=20controller.py:=20=E5=BC=95?= =?UTF-8?q?=E6=95=B0=E5=90=8D=E3=81=8C=E9=81=95=E3=81=86=E3=81=93=E3=81=A8?= =?UTF-8?q?=E3=81=AB=E3=82=88=E3=82=8B=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AE?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=82fnc->func?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controller.py b/controller.py index 4eb48038..fb1d5f36 100644 --- a/controller.py +++ b/controller.py @@ -8,9 +8,9 @@ from utils import getKeyByValue, isUniqueStrings, strPctToInt import argparse # Common -def callbackUpdateSoftware(fnc=None): +def callbackUpdateSoftware(func=None): setMainWindowGeometry() - model.updateSoftware(restart=True, fnc=fnc) + model.updateSoftware(restart=True, func=func) def callbackRestartSoftware(): setMainWindowGeometry() From fe1c0a45d71c8bdb9c33a2e2a1d4485348e068cb Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Sun, 14 Apr 2024 07:35:34 +0900 Subject: [PATCH 3/7] =?UTF-8?q?[WIP/TEST]=20=E3=82=A2=E3=83=97=E3=83=87?= =?UTF-8?q?=E6=99=82=E3=81=AB=E3=83=97=E3=83=AD=E3=82=B0=E3=83=AC=E3=82=B9?= =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=92=E8=A1=A8=E7=A4=BA=E3=80=82=E2=80=BB?= =?UTF-8?q?WIP=20=E6=B3=A8=E6=84=8F=E4=BA=8B=E9=A0=85=E3=81=82=E3=82=8A=20?= =?UTF-8?q?=E3=83=BB=E4=BB=96=E3=81=AE=E3=82=A6=E3=82=A3=E3=83=B3=E3=83=89?= =?UTF-8?q?=E3=82=A6=E3=81=AB=E3=83=95=E3=82=A9=E3=83=BC=E3=82=AB=E3=82=B9?= =?UTF-8?q?=E3=82=92=E5=BD=93=E3=81=A6=E3=82=8B=E3=81=A8=E6=B6=88=E3=81=88?= =?UTF-8?q?=E3=81=BE=E3=81=99=E3=80=82=EF=BC=88=E5=BE=8C=E3=82=8D=E3=81=A7?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=AF=E5=8B=95=E3=81=84=E3=81=A6=E3=81=84?= =?UTF-8?q?=E3=82=8B=EF=BC=89=20=E3=83=BB=E3=83=80=E3=83=BC=E3=82=AF?= =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=89=E3=81=AE=E3=81=BF=E3=81=AE=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C=E3=81=A7=E3=81=99=E3=80=82=20=E3=83=BB=E3=81=A8?= =?UTF-8?q?=E3=82=8A=E3=81=82=E3=81=88=E3=81=9A=E3=81=AE=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=A7=E3=81=99=E3=80=82downloaded=E3=81=A8extracted?= =?UTF-8?q?=E3=81=A72=E5=9B=9E=E5=90=8C=E3=81=98=E3=82=82=E3=81=AE?= =?UTF-8?q?=E3=81=8C=E8=A1=A8=E7=A4=BA=E3=81=95=E3=82=8C=E3=81=BE=E3=81=99?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view.py | 5 +++- vrct_gui/_CreateConfirmationModal.py | 33 ++++++++++++++++++++++++-- vrct_gui/splash_window/SplashWindow.py | 27 +++++---------------- vrct_gui/ui_utils/ui_utils.py | 16 +++++++++++++ 4 files changed, 57 insertions(+), 24 deletions(-) diff --git a/view.py b/view.py index a7466fa8..ce468b76 100644 --- a/view.py +++ b/view.py @@ -1564,7 +1564,10 @@ class View(): vrct_gui.confirmation_modal.hide_buttons() vrct_gui.update() vrct_gui.confirmation_modal.update() - callFunctionIfCallable(self.view_variable.CALLBACK_UPDATE_SOFTWARE) + # vrct_gui.confirmation_modal.grab_set() #Tmp + def func(progress): + vrct_gui.confirmation_modal.updateDownloadProgress(progress=progress) + callFunctionIfCallable(self.view_variable.CALLBACK_UPDATE_SOFTWARE, func) diff --git a/vrct_gui/_CreateConfirmationModal.py b/vrct_gui/_CreateConfirmationModal.py index 7391a594..898e9c84 100644 --- a/vrct_gui/_CreateConfirmationModal.py +++ b/vrct_gui/_CreateConfirmationModal.py @@ -1,6 +1,6 @@ -from customtkinter import CTkToplevel, CTkFrame, CTkLabel, CTkFont +from customtkinter import CTkToplevel, CTkFrame, CTkLabel, CTkFont, CTkProgressBar -from .ui_utils import fadeInAnimation, setGeometryToCenterOfTheWidget, bindButtonFunctionAndColor +from .ui_utils import fadeInAnimation, setGeometryToCenterOfTheWidget, bindButtonFunctionAndColor, generateGradientColor from utils import callFunctionIfCallable @@ -13,6 +13,7 @@ class _CreateConfirmationModal(CTkToplevel): self.settings = settings self._view_variable = view_variable + self.is_showed_progressbar = False self.title("") self.overrideredirect(True) @@ -69,6 +70,18 @@ class _CreateConfirmationModal(CTkToplevel): self.modal_buttons_wrapper.grid(row=1, column=0, sticky="ew") + # Progress bar + self.progressbar_widget = CTkProgressBar( + self.modal_contents_wrapper, + height=8, + corner_radius=0, + fg_color="black", + # fg_color="#4b4c4f", + progress_color="gray", + ) + self.progressbar_widget.set(0) + + if modal_type == "information": self.modal_buttons_wrapper.grid_columnconfigure((0,2), weight=1) @@ -237,5 +250,21 @@ class _CreateConfirmationModal(CTkToplevel): return callFunctionIfCallable(self._view_variable.CALLBACK_HIDE_CONFIRMATION_MODAL) + + def updateDownloadProgress(self, progress:float): + if self.is_showed_progressbar is False: + self.progressbar_widget.place(relwidth=0.9, relx=0.5, rely=0.84, anchor="s") + self.is_showed_progressbar = True + self.update() + + progress_color = generateGradientColor( + value=progress, + color_start=[242, 242, 242], # RGB values for #f2f2f2 + color_end=[72, 164, 149], # RGB values for #48a495 + ) + self.progressbar_widget.configure(progress_color=progress_color) + self.progressbar_widget.set(progress) + self.update_idletasks() + def _grab_set(self): self.grab_set() diff --git a/vrct_gui/splash_window/SplashWindow.py b/vrct_gui/splash_window/SplashWindow.py index 3a1084c0..a0b5ad31 100644 --- a/vrct_gui/splash_window/SplashWindow.py +++ b/vrct_gui/splash_window/SplashWindow.py @@ -2,7 +2,7 @@ import math import time from customtkinter import CTkImage, CTkLabel, CTkToplevel, CTkProgressBar, CTkFrame -from ..ui_utils import openImageKeepAspectRatio, getImageFileFromUiUtils, setGeometryToCenterOfScreen, fadeInAnimation +from ..ui_utils import openImageKeepAspectRatio, getImageFileFromUiUtils, setGeometryToCenterOfScreen, fadeInAnimation, generateGradientColor class SplashWindow(CTkToplevel): def __init__(self): @@ -200,25 +200,6 @@ class SplashWindow(CTkToplevel): rotated_image = image.rotate(angle, expand=True) return rotated_image - # This making gradient color process was made by ChatGPT. - def generateGradientColor(self, value): - # 0の時の色と1の時の色を指定 - color_start = [242, 242, 242] # RGB values for #f2f2f2 - color_end = [72, 164, 149] # RGB values for #48a495 - - # 補完色を計算 - interpolated_color = [ - int(start + (end - start) * value) for start, end in zip(color_start, color_end) - ] - - # RGB値を0から255の範囲にクリップ - interpolated_color = [max(0, min(255, val)) for val in interpolated_color] - - # RGBを16進数に変換 - hex_color = "#{:02x}{:02x}{:02x}".format(*interpolated_color) - - return hex_color - def updateDownloadProgress(self, progress:float): if self.is_showed_weight_download_progressbar is False: @@ -232,7 +213,11 @@ class SplashWindow(CTkToplevel): self.is_showed_weight_download_progressbar = True self.update() - progress_color = self.generateGradientColor(progress) + progress_color = generateGradientColor( + value=progress, + color_start=[242, 242, 242], # RGB values for #f2f2f2 + color_end=[72, 164, 149], # RGB values for #48a495 + ) self.weight_download_progressbar_widget.configure(progress_color=progress_color) self.weight_download_progressbar_widget.set(progress) self.update_idletasks() diff --git a/vrct_gui/ui_utils/ui_utils.py b/vrct_gui/ui_utils/ui_utils.py index fc4b35e7..7af40855 100644 --- a/vrct_gui/ui_utils/ui_utils.py +++ b/vrct_gui/ui_utils/ui_utils.py @@ -71,6 +71,22 @@ def calculateUiSize(default_size, scaling_float, is_allowed_odd:bool=False, is_z return size +# This making gradient color process was made by ChatGPT. +def generateGradientColor(value, color_start, color_end): + # 補完色を計算 + interpolated_color = [ + int(start + (end - start) * value) for start, end in zip(color_start, color_end) + ] + + # RGB値を0から255の範囲にクリップ + interpolated_color = [max(0, min(255, val)) for val in interpolated_color] + + # RGBを16進数に変換 + hex_color = "#{:02x}{:02x}{:02x}".format(*interpolated_color) + + return hex_color + + def bindEnterAndLeaveColor(target_widgets, enter_color, leave_color): for target_widget in target_widgets: target_widget.bind("", lambda e, widgets=target_widgets: [w.configure(fg_color=enter_color) for w in widgets], "+") From 2b9717535b56011c25c750b51429f1dc80a3533a Mon Sep 17 00:00:00 2001 From: misyaguziya Date: Sun, 14 Apr 2024 14:38:59 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=F0=9F=90=9B[bugfix]=20Model=20:=20update?= =?UTF-8?q?=E3=81=AE=E5=87=A6=E7=90=86=E3=82=92threadFnc=E3=81=8B=E3=82=89?= =?UTF-8?q?Thread=E3=81=AE=E5=87=A6=E7=90=86=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model.py b/model.py index 6b97a918..01e51bd7 100644 --- a/model.py +++ b/model.py @@ -293,12 +293,12 @@ class Model: copyfile(os_path.join(current_directory, folder_name, "batch", batch_name), os_path.join(current_directory, batch_name)) command = [os_path.join(current_directory, batch_name), program_name, folder_name, tmp_directory_name, str(restart)] Popen(command, cwd=current_directory) - except Exception as e: + except Exception: import traceback with open('error.log', 'a') as f: traceback.print_exc(file=f) webbrowser.open(config.BOOTH_URL, new=2, autoraise=True) - th_update_software = threadFnc(updateSoftwareTask) + th_update_software = Thread(target=updateSoftwareTask) th_update_software.daemon = True th_update_software.start() From 3413f6e498f93660863e3eda8af0cbb6a1d62142 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Wed, 17 Apr 2024 08:31:06 +0900 Subject: [PATCH 5/7] [Update] Add "tmp/" to gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 52825c27..4abb9718 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +tmp/ build/ dist/ /config.json From 680ca8a955e5e067e4035006f059638eb93d3dd3 Mon Sep 17 00:00:00 2001 From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com> Date: Wed, 17 Apr 2024 15:44:14 +0900 Subject: [PATCH 6/7] =?UTF-8?q?[Update]=20=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=83=88=E6=99=82=E5=B0=82=E7=94=A8=E3=81=AE?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=82=92=E8=BF=BD=E5=8A=A0=E3=80=82=E2=80=BB?= =?UTF-8?q?=E5=A4=B1=E6=95=97=E3=81=97=E3=81=9F=E6=99=82=E3=81=AE=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AA=E3=81=A9=E3=80=81=E6=94=B9=E8=89=AF=E3=81=AE?= =?UTF-8?q?=E4=BD=99=E5=9C=B0=E3=81=82=E3=82=8A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- img/chato_delivering.png | Bin 0 -> 1271 bytes img/chato_unpackaging.png | Bin 0 -> 679 bytes img/downloading_unpackaging_d.png | Bin 0 -> 3633 bytes img/downloading_unpackaging_u.png | Bin 0 -> 3634 bytes img/unpackage_icon.png | Bin 0 -> 1382 bytes img/vrct_update_process.png | Bin 0 -> 1618 bytes model.py | 4 +- view.py | 12 +- vrct_gui/updating_window/UpdatingWindow.py | 176 +++++++++++++++++++++ vrct_gui/updating_window/__init__.py | 1 + vrct_gui/vrct_gui.py | 4 + 11 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 img/chato_delivering.png create mode 100644 img/chato_unpackaging.png create mode 100644 img/downloading_unpackaging_d.png create mode 100644 img/downloading_unpackaging_u.png create mode 100644 img/unpackage_icon.png create mode 100644 img/vrct_update_process.png create mode 100644 vrct_gui/updating_window/UpdatingWindow.py create mode 100644 vrct_gui/updating_window/__init__.py diff --git a/img/chato_delivering.png b/img/chato_delivering.png new file mode 100644 index 0000000000000000000000000000000000000000..d38f1447d82e791fb68cc95846c3c9da086e2f86 GIT binary patch literal 1271 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 literal 0 HcmV?d00001 diff --git a/img/unpackage_icon.png b/img/unpackage_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd8e7d245e3cfcc95e4b3debe0a246c79d1efbc GIT binary patch literal 1382 zcmV-s1)2JZP) zrjCdl4R|8;4M4(Mu@XVoy{Z0s@LG(qY*0X`w+Z9WRpjV79L>QRkcgn`UR8jx25wqe zCdN+QZ}L+`&If}AtO=0>eRn>J7E-C|bLhNt2Gb*_}pI1~gCkWzjR?Ap{VqDWen=Y)hd zrmTBKG;Bd88iw>RU)1l9K0ypJnRj=-)d^yH0SO>Me7Ed*HkTP$514l!|2k-+rjAXP zQ5Xzv8bZou(t7Lfk5vhOD*E``f|7Zy(2SgJ3(2rtv9Y$MidwnvxmQh!b}%5F=BI{r zW@4CQF-Y!B*7tFOc zM(Z8uE}Tig*J#!79^)DlsQbYNqh%pB#xi=2fmT-o9KWQgrIjq_8~^Al9Vb6_%6o?? zF7gKV<;d+MYS(phhK*mkpPMu4espqvjs?uI<-)cnAQUj1G5%L@fGUTIAk${WV(|`% zTJb$zn6S$?Zy? zXt5KpgPM#AWrrleq!86^b*ap07FEGuw1UO@K*Vg_PaLAoB;#_a@Hrw`cV>;n40<*Q z;RG}_SzJ+817AN3L6X7QiWXttHB>Y;!|Czw08_LwT;$nYg4{HLy@}tF_EC; zeS3SmWtv;*&_uz2KZnENZ5!MAw#B7wA>ap3&?Zp8F}Cr^lk9)|+c7<3wIEt#$5s`J zs3~i*#^8Yj@RK=Dqco!1e=9-%+z`{XkUlX)59V%1*T$s~Y7+YW>l$i$Ye9l{cXxMx zKpeqY;~2IGzNqo==#BJNTtVeP(x*c@jU-12oqv&duJ#9nxS+%Si*z8C;K%ZZlaNIg zm?!H0s7qaWsneO0sZY!d2Atx|sJu&Lx!4AU!>E7e&OiJw2Gx&8fO z=wivwr|2nT&4w7frjf7_)DhLRQrX;0^W(&4hRgm{odKQrmWVDj5^)4$yc4<@NKA0? zVtZHpEalBeG=#HxB(T!~NRMU{)EQ~&?~ literal 0 HcmV?d00001 diff --git a/img/vrct_update_process.png b/img/vrct_update_process.png new file mode 100644 index 0000000000000000000000000000000000000000..27a771500c6b78cd397170be75fd389d59304338 GIT binary patch literal 1618 zcmV-Y2CeytP)lQl8`g`8%-?FSbQZ=%+-_}}hI@djNZZIUJT9K!f znh}*5s94ND?r2SWn3rm$bD~d2;OES9u765OH`Nk(qU(Ovb4&YfVc#9zw?3X_#|KzZ zSlc^S&!nI~>GLdmH+yWJwKkQ#7Iu9O!SqS{zaaA1uQyiTDH-q8M`&u78Csh? zI5Hko%V<3|+Bp8fiK)`RT*SF>mQ&hWtZ|C;K9RZvf67i2S&cJUt41PA9Z1Nm1>FxOh`^_-g|2<8WYpnTOGUQhT!Hrc^zOt^DSA5Lv=Qv3Ys7YMMa+RJJH92dM z9H>E763~HOYt4HskU;cG4l(``PPm5T_49Rk!OJGF~8n_r(6=4uT_RBqN|4BLSa<);B;gN*~kzK2H#l--vxl zh8ckFv8sd#`7MY&djj%OdCd6$$IA!8L6o`fw)!84OAw&-l(c%mXaZ-o8P1s(4oz=N zF)8ra;Ch*H?)cP`;=>ywD1dg!m2gZB$@ozY6s!Uj4%6yX=IZx6H^BO{^`$+LV`jXM zB!Ity+?;jvWSq5wL)nvg8&krfXxkrdV1?IjM>(R8x`?QP=Lp|BtSdeXAnxhiHFXl(O>qwH$PwKWc%rBck9jy=G^v(i7 z`*5%UYN!dufev(LZTAx2msl4N%NPUH^OI_v<#Cc0i5L_dIFsl}a#HiAy9dV_(BxBO zPYX^jva0z)6n(^aQ+;DHA$x>ae=b*WI&`F$lDW&gNItEaO-8Dep?38y)a1;;dRa+q zr&-k?VsFVZhSa)aAC#*a`9jCHIRdcY0G!X&Cc}GOe>{TIxc7k*UDQVf)D8Uw_dpqJ zx&Y51#3vz{;V17uox_HXb^Q-A9!lRNi4p`NkjdoP;ge-m(cFz-$hAPx&6K0Ng7+CV zL?dI5mb&~Fj6ZO$x38W>z7U7pBh*5DD<3z4=3Vw;4c(TZ2MF*8H0zN6_q_zg@rSTt z1vN}^Xw1BbiyxT_#Q5CO#&-B69Vso#@*e~bcqU!74t{WrhRK)kpYvo1m4VvT0s>|qIM=WZiws41RD(_)Jbsg0pAaxr)fUH zpJuFiBCo#%W7^R1axstE@%mLYPeB)Mo-ou|=n`sjOWtkBa37t{daAntbW^)IaE6pO z22T*gfW^U;d^h%yVLLom<|{P7^O^cW0y1RWL^Ax|%B6C@rvJF6qvijJ zh(6^BH>!(u=0H<zCENL&!dYJNSz>(=>-|?Hu2bqO5zBf=9{LgM zs!n&+ew;Du@FM>?^Vg+yb$pD+ Date: Thu, 18 Apr 2024 13:16:59 +0900 Subject: [PATCH 7/7] =?UTF-8?q?[Update]=20=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=83=88=E4=B8=AD=E7=94=BB=E9=9D=A2=E3=82=92?= =?UTF-8?q?=E3=82=BF=E3=82=B9=E3=82=AF=E3=83=90=E3=83=BC=E3=81=AA=E3=81=A9?= =?UTF-8?q?=E3=81=8B=E3=82=89=E3=82=A6=E3=82=A3=E3=83=B3=E3=83=89=E3=82=A6?= =?UTF-8?q?=E3=82=92=E9=96=89=E3=81=98=E3=81=9F=E6=99=82=E3=80=81=E3=83=A1?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=97=E3=83=AD=E3=82=BB=E3=82=B9=E3=82=82?= =?UTF-8?q?=E7=B5=82=E4=BA=86=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=80=82=20=E2=80=BB=E3=82=A2=E3=83=97=E3=83=87=E4=B8=AD?= =?UTF-8?q?=E3=81=AE=E7=B5=82=E4=BA=86=EF=BC=88=E4=B8=AD=E6=96=AD=EF=BC=89?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E3=81=AF=E3=80=81=E3=83=A6=E3=83=BC=E3=82=B6?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E8=87=AA=E5=B7=B1=E8=B2=AC=E4=BB=BB=E3=81=A8?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vrct_gui/updating_window/UpdatingWindow.py | 3 ++- vrct_gui/vrct_gui.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/vrct_gui/updating_window/UpdatingWindow.py b/vrct_gui/updating_window/UpdatingWindow.py index f9b90c8c..d84fd7dd 100644 --- a/vrct_gui/updating_window/UpdatingWindow.py +++ b/vrct_gui/updating_window/UpdatingWindow.py @@ -5,13 +5,14 @@ from customtkinter import CTkImage, CTkLabel, CTkToplevel, CTkProgressBar, CTkFr from ..ui_utils import openImageKeepAspectRatio, getImageFileFromUiUtils, setGeometryToCenterOfScreen, fadeInAnimation, generateGradientColor, getImagePath class UpdatingWindow(CTkToplevel): - def __init__(self): + def __init__(self, vrct_gui): super().__init__() self.withdraw() self.overrideredirect(True) self.configure(fg_color="#292a2d") self.title("Updating...") self.after(200, lambda: self.iconbitmap(getImagePath("vrct_logo_mark_black.ico"))) + self.protocol("WM_DELETE_WINDOW", vrct_gui._quitVRCT) # self.wm_attributes("-toolwindow", True) self.is_showed_downloading_process = False self.is_showed_unpackaging_process = False diff --git a/vrct_gui/vrct_gui.py b/vrct_gui/vrct_gui.py index 6f9183b9..4b94768e 100644 --- a/vrct_gui/vrct_gui.py +++ b/vrct_gui/vrct_gui.py @@ -175,7 +175,7 @@ class VRCT_GUI(CTk): init_scaling=(self._view_variable.VAR_TEXTBOX_UI_SCALING.get()/100) ) - self.updating_window = UpdatingWindow() + self.updating_window = UpdatingWindow(vrct_gui=self)