From 13565516c60761a679f6035166e4063f13169550 Mon Sep 17 00:00:00 2001 From: arthur Date: Sun, 5 Mar 2023 20:40:43 +0100 Subject: [PATCH] =?UTF-8?q?est-ce=20que=20=C3=A7a=20marche=20=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- customtkinter/__init__.py | 3 +- .../__pycache__/__init__.cpython-310.pyc | Bin 2863 -> 2904 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2930 bytes customtkinter/assets/.DS_Store | Bin 6148 -> 0 bytes customtkinter/assets/icons/.DS_Store | Bin 6148 -> 0 bytes customtkinter/assets/themes/blue.json | 3 + customtkinter/assets/themes/dark-blue.json | 3 + customtkinter/assets/themes/green.json | 3 + .../__pycache__/__init__.cpython-310.pyc | Bin 331 -> 331 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 325 bytes .../ctk_input_dialog.cpython-310.pyc | Bin 4047 -> 4047 bytes .../__pycache__/ctk_tk.cpython-310.pyc | Bin 9856 -> 10117 bytes .../windows/__pycache__/ctk_tk.cpython-37.pyc | Bin 0 -> 10267 bytes .../__pycache__/ctk_toplevel.cpython-310.pyc | Bin 10203 -> 10328 bytes customtkinter/windows/ctk_tk.py | 25 +- customtkinter/windows/ctk_toplevel.py | 8 + customtkinter/windows/widgets/__init__.py | 1 + .../__pycache__/__init__.cpython-310.pyc | Bin 921 -> 984 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 978 bytes .../__pycache__/ctk_button.cpython-310.pyc | Bin 14408 -> 14504 bytes .../__pycache__/ctk_button.cpython-37.pyc | Bin 0 -> 14201 bytes .../__pycache__/ctk_checkbox.cpython-310.pyc | Bin 12345 -> 12345 bytes .../__pycache__/ctk_combobox.cpython-310.pyc | Bin 12046 -> 12046 bytes .../__pycache__/ctk_entry.cpython-310.pyc | Bin 12046 -> 12070 bytes .../__pycache__/ctk_frame.cpython-310.pyc | Bin 5878 -> 5878 bytes .../__pycache__/ctk_label.cpython-310.pyc | Bin 8235 -> 8235 bytes .../ctk_optionmenu.cpython-310.pyc | Bin 11889 -> 11889 bytes .../ctk_progressbar.cpython-310.pyc | Bin 8985 -> 8985 bytes .../ctk_radiobutton.cpython-310.pyc | Bin 11711 -> 11711 bytes .../ctk_scrollable_frame.cpython-310.pyc | Bin 0 -> 10588 bytes .../__pycache__/ctk_scrollbar.cpython-310.pyc | Bin 8680 -> 8680 bytes .../ctk_segmented_button.cpython-310.pyc | Bin 11893 -> 11893 bytes .../__pycache__/ctk_slider.cpython-310.pyc | Bin 10878 -> 10878 bytes .../__pycache__/ctk_switch.cpython-310.pyc | Bin 12568 -> 12568 bytes .../__pycache__/ctk_tabview.cpython-310.pyc | Bin 11161 -> 11161 bytes .../__pycache__/ctk_textbox.cpython-310.pyc | Bin 17507 -> 17507 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 396 -> 396 bytes ...appearance_mode_base_class.cpython-310.pyc | Bin 3085 -> 3108 bytes .../appearance_mode_tracker.cpython-310.pyc | Bin 3687 -> 3687 bytes .../appearance_mode_base_class.py | 2 +- .../__pycache__/__init__.cpython-310.pyc | Bin 471 -> 471 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 463 bytes .../__pycache__/ctk_canvas.cpython-310.pyc | Bin 5062 -> 5062 bytes .../__pycache__/ctk_canvas.cpython-37.pyc | Bin 0 -> 4526 bytes .../__pycache__/draw_engine.cpython-310.pyc | Bin 32368 -> 32368 bytes .../__pycache__/draw_engine.cpython-37.pyc | Bin 0 -> 32608 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 323 -> 323 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 317 bytes .../ctk_base_class.cpython-310.pyc | Bin 12371 -> 12638 bytes .../__pycache__/dropdown_menu.cpython-310.pyc | Bin 6636 -> 6636 bytes .../__pycache__/dropdown_menu.cpython-37.pyc | Bin 0 -> 6498 bytes .../core_widget_classes/ctk_base_class.py | 17 +- customtkinter/windows/widgets/ctk_button.py | 10 +- customtkinter/windows/widgets/ctk_entry.py | 12 +- customtkinter/windows/widgets/ctk_frame.py | 2 +- .../windows/widgets/ctk_scrollable_frame.py | 316 ++++++++++++++++++ .../font/__pycache__/__init__.cpython-310.pyc | Bin 1039 -> 1039 bytes .../font/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1023 bytes .../font/__pycache__/ctk_font.cpython-310.pyc | Bin 3869 -> 3869 bytes .../font/__pycache__/ctk_font.cpython-37.pyc | Bin 0 -> 3815 bytes .../__pycache__/font_manager.cpython-310.pyc | Bin 2214 -> 2214 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 250 -> 250 bytes .../__pycache__/ctk_image.cpython-310.pyc | Bin 4457 -> 4457 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 487 -> 487 bytes .../scaling_base_class.cpython-310.pyc | Bin 6435 -> 6435 bytes .../scaling_tracker.cpython-310.pyc | Bin 5307 -> 5307 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 608 -> 608 bytes .../theme/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 606 bytes .../__pycache__/theme_manager.cpython-310.pyc | Bin 1766 -> 1766 bytes .../__pycache__/theme_manager.cpython-37.pyc | Bin 0 -> 1682 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 301 -> 301 bytes .../utility_functions.cpython-310.pyc | Bin 970 -> 970 bytes main.py | 36 +- 73 files changed, 403 insertions(+), 38 deletions(-) create mode 100644 customtkinter/__pycache__/__init__.cpython-37.pyc delete mode 100644 customtkinter/assets/.DS_Store delete mode 100644 customtkinter/assets/icons/.DS_Store create mode 100644 customtkinter/windows/__pycache__/__init__.cpython-37.pyc create mode 100644 customtkinter/windows/__pycache__/ctk_tk.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/__pycache__/__init__.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/__pycache__/ctk_button.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/__pycache__/ctk_scrollable_frame.cpython-310.pyc create mode 100644 customtkinter/windows/widgets/core_rendering/__pycache__/__init__.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/core_rendering/__pycache__/ctk_canvas.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/core_rendering/__pycache__/draw_engine.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/core_widget_classes/__pycache__/__init__.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/core_widget_classes/__pycache__/dropdown_menu.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/ctk_scrollable_frame.py create mode 100644 customtkinter/windows/widgets/font/__pycache__/__init__.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/font/__pycache__/ctk_font.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/theme/__pycache__/__init__.cpython-37.pyc create mode 100644 customtkinter/windows/widgets/theme/__pycache__/theme_manager.cpython-37.pyc diff --git a/customtkinter/__init__.py b/customtkinter/__init__.py index 3004e4d..216a377 100644 --- a/customtkinter/__init__.py +++ b/customtkinter/__init__.py @@ -1,4 +1,4 @@ -__version__ = "5.0.5" +__version__ = "5.1.2" import os import sys @@ -33,6 +33,7 @@ from .windows.widgets import CTkSlider from .windows.widgets import CTkSwitch from .windows.widgets import CTkTabview from .windows.widgets import CTkTextbox +from .windows.widgets import CTkScrollableFrame # import windows from .windows import CTk diff --git a/customtkinter/__pycache__/__init__.cpython-310.pyc b/customtkinter/__pycache__/__init__.cpython-310.pyc index 56e450c7847c39424bf80cf5a89cbd209985aa9a..271ac21463e58fb8dd1b33f5150ed7bb28283eeb 100644 GIT binary patch delta 687 zcmZut&ubGw7~NTSvth#qwHhcG({|gYn@u*m+eEFcf(TXc2V#2~2xZMoVsN)xW}^Ww zdgw_+kU@{$JxNK=9{eLjf{6cuco7lwo3V(L4$Ry4zVFS>eD7W9Q^`s#%T!=J`l^xf zORJ22?75rh$#mji2Ps4+<+zr(*p>V&@H(zbUIE^~4asNXV&Y*>^4YkV_}E7Z)u>K$ z)S!79&_d6^A(^AgJ(bvGepkaSvLMwWse)>gC8-=z19dJSE zHEfIq+aw)jYz7pY6)-2j2EeBen%-zYAd<`*BvGHTdH&QqbzKC^JOMtyMDN9EG?a5N h@jQ9gf5FP<$#nB;kmtjgUPfTc?()y(8ZQ;5{{RU6nDPJs delta 642 zcmZutO>0v@6n*pZKEewxD1{1Ynzm`uzPzubHCm;9QGy_Tp*9^kIa))$g8RFUP}F%%%$Sc|YF^vk zx;x@|EK>2_ET5Ne)WbipgmN;q#YWxUaL9VRx3kH*=>XU&USu*VM>mK=3}XD^zL>In zQWY1i&XM3iAMwgMS-2#No`g_*vI0_lW?!#F2b@yI2yID}ITk~^gnggbS1OG|+)b=q z{pW6qANITYA^+gZ=(&kIlNmU=(%!lK&-v%%IJI}TcVMua@v`hRD`8H;ym;iC=v0tW zYrTDAqkVfqx|3Ws;#_9ReF-7L#Ox=7-bl^P&+gwiJOELXh1--RElUr)fkXQMpxrIljM@SSaZkO#AAO3 z5Aet{|He;9JoO(Sp7_q#PJ&y3YU`f+otZN;XZhyXJH5Sy1U~0~q{Z(*f0EMv;CsN+Y}()f;2Ab!@F4Ikn>Ba{*k-oD!@zTF&fpQ?c{XqG zDDVPXFnA1jku4fL4!p#c489M%%$5zF0A67$22TR7vQ>kpfQzhX@U;IRc*q_aJOjMO z)(oBnUT5nD+sIXkl?7MOGmu)o)s!>zTV|G8(>IzeYpDP~F{)Auf zs`P<-fxoF~FA87Eu#SN~47^g&iIQ==V*;j;*Ianf&9UUuk*gx#uNsR%(&b4YLoLOP z6?uB(d&1Ne~PjN;8Gi6>q_vA%elb5<`VlaD|y{R&7ms3~)Q;N47)qHtwoF~r? z!dhMLdEAdqV35NIB_EKYJP1$%S{I-`PHc+oQuXLV?-ZV0JaHd{PW)p1l=#&GH!bib zdA)4cqB!>8hkefdx{SAN-#aVpu?snzdSgN>ERqB#g4iUKPM|DvVT=U8fC{(Xi+^7zV!=r-=nB&%c4$ocb zpdO0XFDq_6)={9(Jmgzd9LEbi?Kq{{m0HFbkMYDwh(yxph(D{OuB*_c!S;tNOz1X% zPW*^wc$QRsbXAO&f;J`6M`(6PM)rE!K9SmX>q?=_cC5LUc64m(Q)%CZY*Wbgs>zZa zDU+w7tti!v%nQn$$`elSA%X3@vHsf)OwLTI?ub=dGKAwhllv4CF>RPg7Ob>Yu+$nb z0`74mKT;oF@h@$Z&^C)HvH&3}+mE4vUHR4j|g{Ah#hC8i}(TNo$nvHc%wa8@>!$vx1%|%e= zBF%KpQNA4%2EQw~da9S=qVCNW-fP(+vr9jpGFJU$+23KQ?$IU#BnC+gkr*a1LSmG} z7>RKb_eo5Um?SYpVw%JZiCGAiYaO6$8k!?9PhtV$-Do}fl~Ri|m)+ezEbqT=SPrVG zmFeH6rzvU$jm$CHiZ*vo5w#69-p83n{&RHVx-Y+=)*BOh(#gD)x2Ev)qC5B6_aDB;`&s}1 literal 0 HcmV?d00001 diff --git a/customtkinter/assets/.DS_Store b/customtkinter/assets/.DS_Store deleted file mode 100644 index 1056a7530cd2e4fb23b4bb2eced099d6860aa95c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}N6?5T4ZjY!RUcgOVSiG!N4_;l-gG%k%Y8ST~>2B?z6!xqSZr+8x zNImM^fxuI&Wy#_Mp0G2u_Xn>Zg(|v5D@Ejyxh`~|hx&;Zv5NE44C0W58DIvOfnR69 z-geI7udjp`zzi@0e~kgUA0#TFYcVybuMTW<34oYIvli^rk0ZrMi>}4gAkLr&6N+d; zg)K3J2}irMey+vTpa})hrj*GkkYR1)$_4Ss}RN2g-+rBqx-)q-|O9Yoh+Y7i|b P{3D=g;D#CaQ3l=tIxcS9 diff --git a/customtkinter/assets/icons/.DS_Store b/customtkinter/assets/icons/.DS_Store deleted file mode 100644 index 57d1d87c3c5b8abbd72880477bb6a11158b4f4ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKyG{c^44j1&k!VsMh?A&x92k9w9Dr>aZ;2Mv3z;+P*v%_*vaE?8mvFqjU zaE~Y4veuIREmt>Qcg5Wcqo;9lxo($>b-Q34d&C)a`sTuwL=1=lF(3xSfEf7Bfc0L= z_$W|T42S_S@X3IEA1c+bN$djs(?R1S0C7aO3)enN5UV+eO=1^F52ZvZF;Yv87$wr_ zuNl`Qc7c(O;y1HS-du7*DSkWs)x%MmKv^*$2Ko#f#&%-;|AP9<{NGQ~P7H{Ff5ku< z&9CM&J}G62MIr|N Gf`ND9zatd@ diff --git a/customtkinter/assets/themes/blue.json b/customtkinter/assets/themes/blue.json index 73a1f4d..838e26b 100644 --- a/customtkinter/assets/themes/blue.json +++ b/customtkinter/assets/themes/blue.json @@ -127,6 +127,9 @@ "scrollbar_button_color": ["gray55", "gray41"], "scrollbar_button_hover_color": ["gray40", "gray53"] }, + "CTkScrollableFrame": { + "label_fg_color": ["gray78", "gray23"] + }, "DropdownMenu": { "fg_color": ["gray90", "gray20"], "hover_color": ["gray75", "gray28"], diff --git a/customtkinter/assets/themes/dark-blue.json b/customtkinter/assets/themes/dark-blue.json index 1ecf8ab..b418cbf 100644 --- a/customtkinter/assets/themes/dark-blue.json +++ b/customtkinter/assets/themes/dark-blue.json @@ -127,6 +127,9 @@ "scrollbar_button_color": ["gray55", "gray41"], "scrollbar_button_hover_color": ["gray40", "gray53"] }, + "CTkScrollableFrame": { + "label_fg_color": ["gray80", "gray21"] + }, "DropdownMenu": { "fg_color": ["gray90", "gray20"], "hover_color": ["gray75", "gray28"], diff --git a/customtkinter/assets/themes/green.json b/customtkinter/assets/themes/green.json index 14cd8c6..cefab6e 100644 --- a/customtkinter/assets/themes/green.json +++ b/customtkinter/assets/themes/green.json @@ -127,6 +127,9 @@ "scrollbar_button_color": ["gray55", "gray41"], "scrollbar_button_hover_color": ["gray40", "gray53"] }, + "CTkScrollableFrame": { + "label_fg_color": ["gray78", "gray23"] + }, "DropdownMenu": { "fg_color": ["gray90", "gray20"], "hover_color": ["gray75", "gray28"], diff --git a/customtkinter/windows/__pycache__/__init__.cpython-310.pyc b/customtkinter/windows/__pycache__/__init__.cpython-310.pyc index 624c91319af4d9413949d7f24d6332ba1fe67131..8c9c8c74b47d27e9784c2e5254c3a9c33782d707 100644 GIT binary patch delta 25 fcmX@jbef4LpO=@50SL}LU`d(CbC5B4;<;J?SZfFF delta 25 fcmX@jbef4LpO=@50SK5LwkJ>IImqZd@mwtcQ+o%6 diff --git a/customtkinter/windows/__pycache__/__init__.cpython-37.pyc b/customtkinter/windows/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6960c15a8e43e9a933a9f61bc40978f49fa0cf1b GIT binary patch literal 325 zcmXv}%}T^D5N`UjEZP+x!(M!VMMSz@_R`C)ml6mu2@;YvWsBhG{8x_T0iVCYCNoKFHjti>#B-YuMPDquu;ozo74q_s zHPtu4ctg&`?r0D$5sq%M>Qz~kS19-66vLzD*1dGis$Ypve_oy^pO=@50SL}LU`g4?^P7z^c{2z5aSi}>5eP*9 delta 28 icmX>ve_oy^pO=@50SK5LwkL1o`OU`YyqSajI0pc51_#^# diff --git a/customtkinter/windows/__pycache__/ctk_tk.cpython-310.pyc b/customtkinter/windows/__pycache__/ctk_tk.cpython-310.pyc index 47b7858d38ceaeb0be675a28134d587bbde95c12..e62332027f847003ab4209747d968006dc61ad52 100644 GIT binary patch delta 3149 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 diff --git a/customtkinter/windows/__pycache__/ctk_tk.cpython-37.pyc b/customtkinter/windows/__pycache__/ctk_tk.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cb2e903f684d8c8ede4c44fcd19a64ab359b961 GIT binary patch literal 10267 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 deiconify in update") self.deiconify() + self._window_exists = True + super().update() def mainloop(self, *args, **kwargs): if not self._window_exists: - self._window_exists = True - if sys.platform.startswith("win"): + self._windows_set_titlebar_color(self._get_appearance_mode()) + if not self._withdraw_called_before_window_exists and not self._iconify_called_before_window_exists: # print("window dont exists -> deiconify in mainloop") self.deiconify() + self._window_exists = True + super().mainloop(*args, **kwargs) def resizable(self, width: bool = None, height: bool = None): @@ -220,6 +225,10 @@ class CTk(tkinter.Tk, CTkAppearanceModeBaseClass, CTkScalingBaseClass): self._iconbitmap_method_called = True super().wm_iconbitmap(bitmap, default) + def iconbitmap(self, bitmap=None, default=None): + self._iconbitmap_method_called = True + super().wm_iconbitmap(bitmap, default) + def _windows_set_titlebar_icon(self): try: # if not the user already called iconbitmap method, set icon @@ -263,9 +272,11 @@ class CTk(tkinter.Tk, CTkAppearanceModeBaseClass, CTkScalingBaseClass): # print("window_exists -> state_before_windows_set_titlebar_color: ", self.state_before_windows_set_titlebar_color) if self._state_before_windows_set_titlebar_color != "iconic" or self._state_before_windows_set_titlebar_color != "withdrawn": + self.focused_widget_before_widthdraw = self.focus_get() super().withdraw() # hide window so that it can be redrawn after the titlebar change so that the color change is visible else: # print("window dont exists -> withdraw and update") + self.focused_widget_before_widthdraw = self.focus_get() super().withdraw() super().update() @@ -294,7 +305,7 @@ class CTk(tkinter.Tk, CTkAppearanceModeBaseClass, CTkScalingBaseClass): except Exception as err: print(err) - if self._window_exists: + if self._window_exists or True: # print("window_exists -> return to original state: ", self.state_before_windows_set_titlebar_color) if self._state_before_windows_set_titlebar_color == "normal": self.deiconify() @@ -307,6 +318,10 @@ class CTk(tkinter.Tk, CTkAppearanceModeBaseClass, CTkScalingBaseClass): else: pass # wait for update or mainloop to be called + if self.focused_widget_before_widthdraw is not None: + self.after(1, self.focused_widget_before_widthdraw.focus) + self.focused_widget_before_widthdraw = None + def _set_appearance_mode(self, mode_string: str): super()._set_appearance_mode(mode_string) diff --git a/customtkinter/windows/ctk_toplevel.py b/customtkinter/windows/ctk_toplevel.py index 59b43f6..a4eef57 100644 --- a/customtkinter/windows/ctk_toplevel.py +++ b/customtkinter/windows/ctk_toplevel.py @@ -70,6 +70,9 @@ class CTkToplevel(tkinter.Toplevel, CTkAppearanceModeBaseClass, CTkScalingBaseCl self._iconify_called_after_windows_set_titlebar_color = False # indicates if iconify() was called after windows_set_titlebar_color self._block_update_dimensions_event = False + # save focus before calling withdraw + self.focused_widget_before_widthdraw = None + # set CustomTkinter titlebar icon (Windows only) if sys.platform.startswith("win"): self.after(200, self._windows_set_titlebar_icon) @@ -238,6 +241,7 @@ class CTkToplevel(tkinter.Toplevel, CTkAppearanceModeBaseClass, CTkScalingBaseCl if sys.platform.startswith("win") and not self._deactivate_windows_window_header_manipulation: self._state_before_windows_set_titlebar_color = self.state() + self.focused_widget_before_widthdraw = self.focus_get() super().withdraw() # hide window so that it can be redrawn after the titlebar change so that the color change is visible super().update() @@ -268,6 +272,10 @@ class CTkToplevel(tkinter.Toplevel, CTkAppearanceModeBaseClass, CTkScalingBaseCl self._windows_set_titlebar_color_called = True self.after(5, self._revert_withdraw_after_windows_set_titlebar_color) + if self.focused_widget_before_widthdraw is not None: + self.after(10, self.focused_widget_before_widthdraw.focus) + self.focused_widget_before_widthdraw = None + def _revert_withdraw_after_windows_set_titlebar_color(self): """ if in a short time (5ms) after """ if self._windows_set_titlebar_color_called: diff --git a/customtkinter/windows/widgets/__init__.py b/customtkinter/windows/widgets/__init__.py index 2e21484..a75c63d 100644 --- a/customtkinter/windows/widgets/__init__.py +++ b/customtkinter/windows/widgets/__init__.py @@ -13,3 +13,4 @@ from .ctk_slider import CTkSlider from .ctk_switch import CTkSwitch from .ctk_tabview import CTkTabview from .ctk_textbox import CTkTextbox +from .ctk_scrollable_frame import CTkScrollableFrame diff --git a/customtkinter/windows/widgets/__pycache__/__init__.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/__init__.cpython-310.pyc index 73f0ec849edd96c9e31601d92684729ff2a54fce..cacbdd6c39916526d77843b43567c99d6f80eae9 100644 GIT binary patch delta 143 zcmbQqeuJGipO=@50SL}LU`ffF$SccuWTN&CL53889JyTiD0xPP6v1EyO`(Y|o=R#m z-V$;S$qr5~%FoG3Ov*`hD@x2w_0v??e1TDxQ7cL$xg#uRkJAo1$Y=HH!_P&?q_CW5?}-X;%+F@ delta 82 zcmcb?K9ij{pO=@50SK5LwkKOoz>% diff --git a/customtkinter/windows/widgets/__pycache__/__init__.cpython-37.pyc b/customtkinter/windows/widgets/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0db5e33207a12f21f6086b22c072ff7c011f6556 GIT binary patch literal 978 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 Likgy5M|S=P_nWr! delta 2905 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 bj?g`e3+K)9c!qvcNGpf8KY1*b{xbgyjZ1wU literal 0 HcmV?d00001 diff --git a/customtkinter/windows/widgets/__pycache__/ctk_checkbox.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_checkbox.cpython-310.pyc index 32780b3aa8de9d953519cf0f78944c1dd2ae0932..277de97968ab2d64b0ca6edd1b3319a4709aa1e2 100644 GIT binary patch delta 215 zcmdm)urq-tpO=@50SL}LU`g4?TrR@JFs z+&y`ojy2m(kk(z3@9SuB?FBMVG6K1KCJXDDz+`-Nbu{(?WzK+QfQ%|}=a6jYjMU_8 pr~C@NwEX1K;`p@uqU2PdF$;BH3hV%xxEn-(3@qBWd6wRMMgW?1NBjT) delta 215 zcmdm)urq-tpO=@50SG!f`ja>Ec+ zP+3s~h}by!poR?Nrp@;>vKSdRPxjO@29gIggf~ynieO~iI{BrxI^#Bw0OR(_syY>n zyC%=mv1Z!=(zcY~%o(r@kWnS>9Fpyvk(!+C plwYBjmY-Z&9G{k7l$;7QW})s&f$bm@cYz3yfkk^a&(fRE2mlP0M=<~Z diff --git a/customtkinter/windows/widgets/__pycache__/ctk_combobox.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_combobox.cpython-310.pyc index 69de504f779218fce47a04f5f4f96f6db95601ae..a6702d28e6fa68da40b1b1202408dbc0a48f4383 100644 GIT binary patch delta 28 icmeB+>x<*b=jG*M0D^N5SW-6f#PBdCZ_eadsssRWDF_At delta 28 icmeB+>x<*b=jG*M00Opxy~!JSVt5#xH)rxJRRREK>IY^3 diff --git a/customtkinter/windows/widgets/__pycache__/ctk_entry.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_entry.cpython-310.pyc index 9d46fcc4b4eed6a14260a1ca67333b3100d59d78..6beeab1908fa7a7476b20d690049870bfc779989 100644 GIT binary patch delta 1711 zcmZuxZA@EL7{2HBYb&&r0_}iF#{z9{3oNkBjp>}q+%nCk2DU84Kv-`X<)dZiUZB)& z7~M>k2yT6|DOp13j7H`@oY#*LKbH7&Ka3g^lO`r6YGRCLKh&RQzVE%IMWjuiJm);` z^SDNIvjQZKVSW5mVdeJ=rzwo%Hs(o#?@p(jgQ45l}c#RXKZSO|$y}nHSs%FI zy!%(CYP`zASO!wn-7|}(jIe0V2*Z{fD==%3*@|pKj^)g!#f+#lXPC?;1pW`Ox}?4F&~C=wgs&UUvdeJPx4`D%FJC9S z0&QDVh9H&kM~FX5pl2#2 z*+Fxwl4v)!cChVN$t51?kwl)OfKGz92=u;6&Gq737uMi!gS+Vry8suPo<#hvDdJ9} zB$*7qUO5YoHwRc2hMJeFohahD35zTz7=It0hIYT-xrD-TO!%jW#0fEf*!nIqR4@BO z_VeHut1CbIx2mJvMaEkr6CiLci+&R2uq^geBKt1PH-j3`At&R^l}^L zWJ+-hHU+m?4Ko}L)-|jb{Q*XwG@{Q1ce;wD`1_RlCfo})v0HFI*a2JoE?iGgYIS~u z(inR5=In4PR0XQ!vwld9G|Wre?4KYVr>q~tx6&cBZ4Mo@FXN;_lh>eMs)4g1-=1PQ zJR#cL{6^!^>Q|HN_Vy{pOd6~GA=Lix|Lm63WIQ&tuJtptP8-(!;ntOHnF@E#;=8G>#C z{r%K$YlMbZ2%aa%5xhV^x6in|Sz;pubb&bC6HZrxj}g$xayl@s5zsMk+G)NlR3Xyl QaB7oNNBpk#QtKT17ZwS)@Bjb+ delta 1623 zcmZuxU2Icz6u;;8YwOmJbhoh=Kx&RTK>-^6HaMl0KN2XkyeigNYA_|8s9YR$ZI^^1J8!&i75< zpFA;XQ*1V?z(21aD@1>~W}7hPD@Ju%nGf6IDK*B@%G6Xko{Uvm<{~q3Ig*ZrJ9NhZ zg~>5CAD7e96-R7gR$*y1HWQ1c<4USxNo3S?d@396&~3}aVf%s_Wy;JsL_AxlR+nVLY;G9MS2{ z7cDuV*pd?xttF^3Yn`>#S$hde#+SsLsBX@IEM^4uJy#ofoUH`1;gHB=&c%dX<~Gf4 z(qc)$nQU4#fWWyUVQBK>y7iWPlcg46UNnM`3jQZ6uePl2|Fbsv8_EWgwY=4=G`lg^ zDkPkGTKs#pCqfN$*2^?8xrN4{3uvRbs%cl%)lICS)^651CP76!aBw$f++N7xJMJUq zQ97E6kuD$hcJ07pT_f-U-s*bL=@#i~^flgXH#q@YyLZAb<=IJQ?3S&;-I1n=R!4LxuHd-`970-o!Cl;e;6VON&K23@F?Si&bZ`d|s! z#v8ast+usjY@veW!!m0y2A`RHe+?mwcY@9C1GPeh;E?re?#bz%?}A&*pYun46jNx2^(Loz@_dO;g*?3N>CpK+BR~C- zv0Vg*3C0Pue?0B=3e)3Rf@cVd1p5gl2(-6tiP#|mdM_BApV6gRl7J4z=nm{t0@^L3 Y9kS~}Cr4TXqk$Op&Tf`Z51fF10Xs>jb^rhX diff --git a/customtkinter/windows/widgets/__pycache__/ctk_frame.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_frame.cpython-310.pyc index 7cd10e9b0fca0c9a964a2ea6a34f5f13868f20d0..14f3fea7a5106994e563a4c2a30c23a91061597d 100644 GIT binary patch delta 44 zcmeyS`%RZ8pO=@50SL}NU`g4?vyGiGdGlfR7(QkuCdSE1V#>_iOkXE^h^+$vAvg?N delta 44 zcmeyS`%RZ8pO=@50SLYq^e1oR*~ZT3y!kMD3?DNi6VqfRF=b{hrf-uy#MS`-CC?0g diff --git a/customtkinter/windows/widgets/__pycache__/ctk_label.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_label.cpython-310.pyc index 2bb792fd31aefe17025ebac4b666b076b5f7dc78..843953fd28836d896ba919509dceba5cf51a6038 100644 GIT binary patch delta 119 zcmZ4Ou-btqpO=@50SL}NU`g4?vzpnRvm`M)H7!56wD=ZJNoqw&Sz=LUVp2}(EtZ1B zl!{yIS*67#nQ4_^Zsje`(!7+^qMXdU)LX2@C5a`ex7dMhQa#O&0x{N&Q&TWrat zMaB6=w>V4lQc{a@GV@Yzu@oexRNi9GDlIO_OsfQQD{iqCmn4>?ZvMwC!ptbPS(tq< S6QlFyi=4aIfxI5U`FsFTGAvyH diff --git a/customtkinter/windows/widgets/__pycache__/ctk_optionmenu.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_optionmenu.cpython-310.pyc index da0d6f03e21fdb62ba0a7e20bd084e1e47a968dc..2ac7c97eedd03f9eeb06b110c7e318231daec8e3 100644 GIT binary patch delta 28 icmewu^D%}epO=@50SL}NU`g4?E*m5yCZ}#FkF985*qz9J( diff --git a/customtkinter/windows/widgets/__pycache__/ctk_radiobutton.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_radiobutton.cpython-310.pyc index 8923c8adf00f4bee1789f363c8355c5f08c92f3e..079684d933367dc56aa335dbe01278310fb9d5e0 100644 GIT binary patch delta 28 icmdlVy+4{KpO=@50SL}NU`g4?!@z{E!3V$q delta 28 icmdlVy+4{KpO=@50SLA|JDt3dhl7{Vd9x_*Dg^+3?Fdr< diff --git a/customtkinter/windows/widgets/__pycache__/ctk_scrollable_frame.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_scrollable_frame.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bff19afc00e6191a8c4647319e34048d0f3f51b8 GIT binary patch literal 10588 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 diff --git a/customtkinter/windows/widgets/__pycache__/ctk_segmented_button.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_segmented_button.cpython-310.pyc index 26db9d4083f59ba54ca11b14a0262cbdad8e9758..84ad5ad8c5f6e463d72b5038a34b98faa51a8fe8 100644 GIT binary patch delta 28 icmeww^EHMipO=@50SL}NU`g4?lgG`Nyt$hDml6Po6A4HF delta 28 icmeww^EHMipO=@50SKfU`ja>EtIK774rn delta 28 icmewt@-KuZpO=@50SG!f`ja>E+~#I<-u!}lnj8R%ZwZJ1 diff --git a/customtkinter/windows/widgets/__pycache__/ctk_switch.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_switch.cpython-310.pyc index 1504b0a7a8224ce70f061b8bac5ea4dc947af356..d16c729f9bc1d08bff64d9817446ddc3b1767ce4 100644 GIT binary patch delta 28 icmbP{G$V;8pO=@50SL}NU`g4?!^Fp!yqTYmQyBnmaR%4` delta 28 icmbP{G$V;8pO=@50SLA|JDt3dhl!8Tc{4vBr!oL`od;_G diff --git a/customtkinter/windows/widgets/__pycache__/ctk_tabview.cpython-310.pyc b/customtkinter/windows/widgets/__pycache__/ctk_tabview.cpython-310.pyc index a4101abfebb66bd424d2625fb3c829b894b1b5fc..d63e8151d5f20be8948ecfb6590caf85bd879458 100644 GIT binary patch delta 28 icmbOkJ~NyrpO=@50SL}NU`g4?+}8cL#<5 delta 28 icmbOkJ~NyrpO=@50SK5LwkL1o@!@84-W0H7z)nyEQ;kOR-uK>Swji^ zs_Vicx#gCgTC-Q&@OWqWH&XCRNsCO9Wmeyuzx#)QZJIy>lzKON#^%wgL4>CegXyb^2G?E!5N=xDy zQYfiRLcTYLvdWQI%Tx+ZP#K$Hrj0+>f-p@5W*Mk380Z{CqT(y#bs88&oMh72g$mKw zIfV0eS6k{LzTCq2+W6H!J!6*ydCPBjPJ delta 25 fcmeBS?qTN1=jG*M00O3m?a32)UNJgP{5}-`NjV2| diff --git a/customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_base_class.cpython-310.pyc b/customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_base_class.cpython-310.pyc index bc10541d1b39ef5601c04820387ad4823c7e8f6d..669edf1b94d68cfec73770945a050270b7c30508 100644 GIT binary patch delta 64 zcmeB`SR%oj&&$ij00ieBu%u{hgT2!J?Qd*Fc3gqSF R7fp^}TF02YnVp%9696R|5(5AL delta 40 ucmZ1?(JR55&&$ij00c}A+mnSi^13rJvTY7!WM-V4&$N!wd9xfd8z%s_TL{$v diff --git a/customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_tracker.cpython-310.pyc b/customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_tracker.cpython-310.pyc index 6508b64c587b59ddf79e9885c28888e3141fff9c..c8b52a026bacb114411b33065f6101c5addcd4ca 100644 GIT binary patch delta 28 icmaDZ^IV1}pO=@50SL}NU`g4?Q_0Mjyt$3}Ar}C638nu5XVVMaa702Tp&;2r4JAkMPa)`7cWT{fdIks&bBIv6pmDF19_Nq?9+7D zRG?E{p;Jymascmx$NSwMTwPz!1>2v$Ic%g5|Hk6Y6epkg#0@(TARAE%P>?mURi%<+ zo;O*Wm$?+Eo-Td~j^f7*E^0-0FvHwj`Wak~5#+sC7SBu)+h^V+mU4KveyG>h|Fn^d z`G)NAi{DoshZ$HpR=&LHLUY~+Z{opr7|W|&@aeT!7DE=#v7Eb98#hrXV{Ul`3^F*8 zC?9WbD_k^V_ZP!(PKNMYK(=Je3zV8TkNQ7WU1UF5K=@8(zpn^G*`~SGU z)88Ue)Zd9tR&Vi?ToZcGV3XA=>*~JKF7*6jd;e8C+qj-rQ0369ERpR`+VwGoHr179 zDVkS7I7W`J#}s*(&=7h+ViDSyNx%8formIM8=!CS)A)sP!LCpXxllzmmxX!(Dz}W_ literal 0 HcmV?d00001 diff --git a/customtkinter/windows/widgets/core_rendering/__pycache__/ctk_canvas.cpython-310.pyc b/customtkinter/windows/widgets/core_rendering/__pycache__/ctk_canvas.cpython-310.pyc index d8926ce3e843bb19371eb56a948de9404dc8e26b..7d6f55bde72786433d8a55960bccf8bbfd7613c8 100644 GIT binary patch delta 219 zcmX@6eoUPwpO=@50SL}NU`g4?bAXL8dGlE|dp5>flX-a$iMaq}ikyJNEta(Wypkek z5Z`g~Q{GT{dl1tBL|B3aK?F!8M2*YlNWOkXMGuewBZ$xf5$Yhq6-a0@6}f}hZj(6$ zIvE2uPZrQ*RPzOign$T65Wxl_fts%W zPR4-ElLa&x)qFrA!61SYM6iK~AQ0gXBsAHJK<+FGnfyrb2OC(G@8kzUD%{>6(Etz; PKAB%QfiZq^fp8cABR(xX diff --git a/customtkinter/windows/widgets/core_rendering/__pycache__/ctk_canvas.cpython-37.pyc b/customtkinter/windows/widgets/core_rendering/__pycache__/ctk_canvas.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b119a766679966926e08f0a6f1a1f739d8cf53be GIT binary patch literal 4526 zcma)ATW=gm74GWp8IQ-~#BuCEjIbMWFPh{fLHok)4?wF`BJlvfg$Lg234yed{{TX0ANWpndnR#0z@t7@-F@nus&l?` zX)&G8{8|wFgKm!gVoWaMGT#T0fn<5mt47vixDWGi812T8VIU(J zKMiE8g6+nWsMnP2PS9-}Vr{V54PE12k(GsO+#Qc{mD1CrzlC~Y{(y-JNOmv02YtOr zhP_xdR8vOp1)l_cCS%!n+Um`zmTbzor@<4}n^$eMAX}e@a$dHd#=VYQkR7?G7Pn9I zW4x<=3+kj=P)p!E(GSlCbm6`&Pk!E#OY+pyM(>oDzbsEf{<5F1$W_cwe-gw&Zv|&L ze=d@!(vS3(H5k ze4xdU8!NOWJ$Wf4w*$q~Qfrl3K3(X=%Bt{-@`<;@& z5=S=>lNmlNv4;#E!3oTGG%CrE*qIO)j?P@|xVC7%&+}|Y@%?hlcgt}ux!N1S(o^9X zY?qcrKO-MOfyhnyS}mkOXFx%1lls7SUsR6eFm-iW$?xyOpJi#ts$%9^-q+=@^13(m zl%GsNh^T!;NaAn5i)>-;7F116Edb}ygaBYfs9j|1M%@*I2dW>p9QxR*?~ zJ1B9eDe|}(i4=Izd>h;2fEm2q=a~hnW(d1N4!GR~>gvd-Vv3ug$aAH=4lQIhHoQ=9 zmpFQJw9%=oDh`0fqZrs7sG`Or79!$klc|s7+U7T~IZ;%QM)+!F#<@N3`6zNPsNz9Z z9Qna;yIaoi;bYjABRZ23>42AHi1V;QmMg#Q5=#LDU0T4{d+~=Cxl|9dQf8gs9pK$S z2V^N9+|Shzx^d#M$4OZL zu`m|=L{6!sPHk18cGI1%OqMVkj%KAwrO*e9}QF-6RLO(FBxwA`Sm$~^Q zNpoRLlKeUN_v4Lsx9%CG&DMRb_r%tw+Ouh1j^&mVR%~4r>CSkxm6l_0Y~H!Km5Mwa z=Ys5|lB+^%G2YuseRS9=5pC^OX&0k>psc}St&(Zh+Dh$Cz038{zMjLW-=gDFSq#_- zcCb9H2J1)1oEoeFo>g2MxJ&>uO7@yxh?*HvO`~e&e=Rxx`N|_ETlgKV2*E?Y$p2_; z*8CNB_zE|1lGISPF*bcg?0}18M=x;`4_zcP!i>hn7j_a`xcONqPdsP(?>2ZAJrA~H zd2%P#ZW6)ejfY=NLK=&;nsW)9|D44BS+ja4PXQLo2j}a8aex|ABE1ZemVBY8%OAgV z@jSnD3E>I6I(F5u4acrIcHOZXj(zCZj~%|8!k$7(_1|jZovFV$=+MX z9#a%1wY22Y#sBgCQt#~R*85#+vQ96C0we>BqNgNCxq1R=1~&>b1xL4MiB{aIufpJk%W z!xeC7G_6QEm1#pw-qt@La_qFL3A|D#Hk8Vw+JRR@Xb4z~#o@s>XD4_qe}#<(^14+n zSnsx6V=oz%#x?e7@S0siP@Z)$l|~m^K`BiXsM=b;15GL6kp2jiv|qo88<y>W zCed>?nVU2uW(#PwSJ1Lfnv+;YpSB*gz=5)sqLzEpo&B#BUU#7g z_>C>nr@o3CeHjG1MbXz+=>A7^zedS#+HO@Hs6t&qBLxI6)cu$j@-Fe8K)Y=nsf^_mC2=xzb4+>9wlTlw3OQyrtvq-%YR^|KSp?urokkCp=i2 z`R+LT6krtYlmX~6Ux8Ra>It)KC)AH&YM6Dxp0k~%evElUbBQm7N0E(D?i!P*kAjCU zpXhgZ`bGE|61zo?dxGy0NcflMnwubx+7|etv-m!N^CIuO;Msij3^JRaMl2`}YV9qo z{Su`#*lt7fm$feTf9YbfQAvG+p5+%MR=f5gG`Fb4fRe3JlbaUm{B898&oQu;E zt;kPt0DYSXg_$PX>t7Nb8IRAhpWh0LpD`WEJU{={m0IAano&W#< delta 30 kcmezHhw;N7MxK0LUM>b8V0ze|yphL^mC<=~Fsp1O0He7HGynhq diff --git a/customtkinter/windows/widgets/core_rendering/__pycache__/draw_engine.cpython-37.pyc b/customtkinter/windows/widgets/core_rendering/__pycache__/draw_engine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8aa258b5733fe8d41bf805b1de60bd83c884abbe GIT binary patch literal 32608 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 diff --git a/customtkinter/windows/widgets/core_widget_classes/__pycache__/__init__.cpython-37.pyc b/customtkinter/windows/widgets/core_widget_classes/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6242076cf0e7abdd39cb91d3e411948bc652e2b6 GIT binary patch literal 317 zcmXw!PfEow5XPIf3z1h(;03zz03sr-8y6Pj>81oiUJ|4g%&|A@2a7{qoB#j- literal 0 HcmV?d00001 diff --git a/customtkinter/windows/widgets/core_widget_classes/__pycache__/ctk_base_class.cpython-310.pyc b/customtkinter/windows/widgets/core_widget_classes/__pycache__/ctk_base_class.cpython-310.pyc index a056c52c9c87d5c965a5e92cf84373af069e2cae..b08ee85aede3917d4590d5850c3a9419330174b9 100644 GIT binary patch delta 1137 zcmYjPO>7%Q6rMM`Ydf2@W5;%!gv4H|xT%#N+6yTyK}ChoL&L?DLJ=a^-gRupKVf!U zL)a3OfLfJO6$Yvz6=92BD&+uL!2v-53Biq0aX_+AMd8*12T+iZkl>B024*zhy!Xxf z-aNgTAD+9F4>f{8o#43fvubV6e-yf^!h+|iK8U=}6KA0^%#&Oz(k<$Ayl=GQ00j~C zUxvfpw*O^-MQ^H)QZU7A|2{YV?mCA5TGjPpn{3JS02&W>%Lxj{toO$oEBGx1q_M(Bah8@V+Fpt>=am|TFvFF_HvQsYIb+< z=!wf+UlWIt z*UU|6rgvd4T3x+a&zI}ga;{qaODL%eh79Ve#b&+0UKQ`9#_$0@O&xr~IfA@}eLY2- zfJNob3{EU%3pRnn7O5a-saL2=mX*7{8P$ajT!jnr@A$p@&6>KwhAIJRZ-hRI8|S!mQ9&YA_@U}mG( zqcF{i&8N+JgZKQkYOY|LHJg_j)-}qK^2QXxlPo=sTSj9~OX?6pSL+3{hb7^Pk0(;m z^JxBq%LyQa!vP3`_;unU!~{%iGBeOKoW8|61)Gj5;8W&8%sc&^n6obNI?TGw0{!H(>Gu zuoDsjqH>ca0&UrTq=Nn9W!wQYmK81y`z^ovrH_0{3j(3S;njnRi zhWRM;p=g63{1Cm|z7$1aL2nTBLWPi2ANta_GJ>F&a~9aA?&0~}|8viC{`Yy#V&}^a z=V6CKA?$f^`DRz5{+jcm1Wl$XS-^4L@Qp#d$k0ZG{tM<4xdosZeR*eLvw1ad7@*ax zu?YgK!Zr2^SciM<&me|X>O<(kFX{(4V!m<|2w<3>^6vpmnwJVx5zgTaPaK*s=-uel zB_GKGkTgU|rHq~4-Len~rJC`M_e{wZ)>6NV!750gfCK^dE6Z<5NNM=qlQ}^x;_mVt1e_gha}MQ!4ou%#hRbcvl~&4ur3EqFbV5fTS$B z2J*6yE8!J!yj_Ig!PerfZraYKTgW>Y>yH@*r41~@=fwk_c|LgspIo$nUkI@2RqXID z%17C^cV=@*3&?{^e#Du;8~BWg(l$uqgVOD=goRq2Z;0*DB*!pArASwEJ%SzDO3QaH zM{!J>3ypADwu~@S3re!Lv!_?zA4?>D;LhM_g%>SI-O1iAtPOhcSI`DO(Hh!-7_K$P zLJ6sSPM{h$2{P=+`Bh4E6F(;RC1PC%Xg%Le;Z#{L{}hw#e#lpey(x1f;z&UI zufYr}uf=GjPo8C}2_Hr3AURz#(ZFw)@_VJbI2t*QbDZE9H?V6;Tycx7k?hgnWxCsPK2W1i$zP9Y)ws diff --git a/customtkinter/windows/widgets/core_widget_classes/__pycache__/dropdown_menu.cpython-310.pyc b/customtkinter/windows/widgets/core_widget_classes/__pycache__/dropdown_menu.cpython-310.pyc index c3ad3eadc9c943810c49577bad33ebd9a97875eb..225be2796000df4b6ed179cf2929b94559c48df6 100644 GIT binary patch delta 28 icmaE3{Kl9kpO=@50SL}NU`g4?vyhcBdGk6}I}reWs0efb delta 28 icmaE3{Kl9kpO=@50SK5LwkL1oS;)%hym=j~od^JUjtB|> diff --git a/customtkinter/windows/widgets/core_widget_classes/__pycache__/dropdown_menu.cpython-37.pyc b/customtkinter/windows/widgets/core_widget_classes/__pycache__/dropdown_menu.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c10048d036db0977937f0d67073aeae4f68e5685 GIT binary patch literal 6498 zcmb7I&5s;M74Prq>FJ&Q@Otg_XD1}ACzvI10z}3(!FCLRWE07D48w*_?^Mn1%=UDT zt9!h=qsfI`B{|?IHx4*xeL;XY@egp|iUj9AAS5KDmAG-siQlX4nVnf1CCsQ^S5?2N zu6p0^U7wnA6#V}B4};x&Mp6DrgW=CY=QXtC0RU5&8Y=btsn%7DwNUHmb-iQMjgDD2 zJ67H5l0W#0^)PNiOveJgZ3Q}rp?FNM|4bbVS?zOOKwmG=}@=1O~p zPx0wpvp&nz+e*zjz_*o^nwgn*qgEVc=AB+Q$(*l4kbX-4w5b@IV88 zP0idp8@$8c3Zh`03ye!Q?rh$QqZHj!=zg!;<$(yI27fDN{Cbe^8)1+nczXVi=&sm&K z=W}wuQIE|$(%3AU+cWCNDU};ur#GOtMvCMi9ggu@#z!;^3MyxW> z-bPFQ4Uj5rwXF?6pn?5sZBYJ1Rh3lV$IN5u8T5`=`A}1pfjUrpbD%M0(-uESt#*m& zAh@xpMD{@0w+Gr|!YB`PiP0Wmm?I2bVmJdsV*Fx+0oE0J7!sp0FeS!sQg=6hGc_>f zn`$~eP})_@YvM1|+n)iPrPJaJbB`4~OE|@`fdx2^x#Kj)6cD?#l3AeSIwzrblU%0# zbf?RO3tEV20y6|=0cs0bDcx*Epnql%b28iaTTv_ZeL-{-6@YBse+s9BO|Q(9G%lM3 zA9-UlXOR3_R`y4nbp3HwR{TR=iZX37Q>-Sw=8H{V^4Mu5ttd%JW3$r%V}8==b9^Lf zw$^(BJ=lY_ps|^`ey_`dl;_LNj-hmLDa;DL8wM$!og^#yxy0bELm8U$X?KZROeHlZ zGZG#)MV06>Q*a)7A1HR zgA*(U5%PiGAXCPZRaU5)yv=fVM=atn#QNk6fHF0&I%-w3)Mx3hpHf|nY>X|fe|%g` zmxqEN6^oXVg6U{C(2`dGQix+)O*M$=DeCR(fDmpdmD#rTA)>Nx4|`HT)skd+uuQW5V+5v{4BMsJAbIruvDz5%d|mXMe#bW7b; z`|}ewEVh}rAXyH&WO521Rd#VL=oc(R8+y&uhqxTmpl5pjRj&(*dnBk{8hZtgyn;7) zrW;<+?S?JRa->2TJ)AfqOYIK*Nm@WAc1P3CLA%&dtgy>a9W^(set!~ILle(2x}x1P2uE3?k}hwwnym)S7r}rRq)@uGUdoe;-iQ+(Yzs#4M2VMKED%t>TQv># z63gOdQ}Qs=F`F4psOj5WIwJzcwoK|Hm7K~$0 z@_Dnx>#-?qZ9UVP>%)~WTs&Wyf7WWiYQ#d2NGvN)uv0_``#OV;i+8uXAH$5@RNi~>0~I}!83TwsdZowe3B&>? z5G6EK8S0qK+AA{>U0qe~d-s&+mF-K#>I?bm!?mMTP>``zKf9+e2f|wE*FDBVo^p?G zBfLc{>XAqC5c2Xc@gP`ULvVOG?nQiSI4$i=;k3M<0hhpNB`i|z<-8Dkc~Vj`okR3Y zM7h1~zUFx&(hMy-d9;N5K9Pp3H;x5+t-?b?J<=HATH$dqr#_f4y<~+l`$`ye)>v@u zeT@Etru1K$WYrUXcKJ#eW7p&wI{Dhn2zfKD={PCfT>9C}#udAyI$!$G;thNrNBm*_ zICK)yUj7KP98J6luu`+3;*$2_I!%&`6E_Kb6(Fn7sfV$G8Mfh+1^I`XCVfw4N>WSN z9@0d9|n5j|l9Na7O#Fv#OI zVhEByj5I`VXE1{0#z@EL1&k1|Vq{?SDn_~-nHb%|$dDroBPe0pl%oCk3ZOhSGT_j}{EVKoX3-1O-mw9({V| zo`?}&d1n6Z^-dlG1GtS)vML%3M=wRh#r~h3#;nj)! zdAY#9&>u3n*=Vt=o@eXZv7&&drg93oA=uT^r3QU*~ng9

_j^H@zY#ydwu0=NpkM^4UMd9fUN8bAt%AfsP?#cXL$Xwo zdqTQ^bbT^*&dg>QqaO8Bnk9Fa=|Qw3$Qq-vmYX{ZM`kN{5nlro3QE2S1{mNON-HUn66j QQ~@YoJtM<=g!uY@0my|#ga7~l literal 0 HcmV?d00001 diff --git a/customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py b/customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py index a75ab01..610f46a 100644 --- a/customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py +++ b/customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py @@ -9,9 +9,6 @@ try: except ImportError: from typing_extensions import TypedDict -# removed due to circular import -# from ...ctk_tk import CTk -# from ...ctk_toplevel import CTkToplevel from .... import windows # import windows for isinstance checks from ..theme import ThemeManager @@ -74,7 +71,7 @@ class CTkBaseClass(tkinter.Frame, CTkAppearanceModeBaseClass, CTkScalingBaseClas super().bind('', self._update_dimensions_event) # overwrite configure methods of master when master is tkinter widget, so that bg changes get applied on child CTk widget as well - if isinstance(self.master, (tkinter.Tk, tkinter.Toplevel, tkinter.Frame, tkinter.LabelFrame, ttk.Frame, ttk.LabelFrame, ttk.Notebook)) and not isinstance(self.master, CTkBaseClass): + if isinstance(self.master, (tkinter.Tk, tkinter.Toplevel, tkinter.Frame, tkinter.LabelFrame, ttk.Frame, ttk.LabelFrame, ttk.Notebook)) and not isinstance(self.master, (CTkBaseClass, CTkAppearanceModeBaseClass)): master_old_configure = self.master.config def new_configure(*args, **kwargs): @@ -179,8 +176,7 @@ class CTkBaseClass(tkinter.Frame, CTkAppearanceModeBaseClass, CTkScalingBaseClas elif isinstance(image, CTkImage): return image else: - warnings.warn(f"{type(self).__name__} Warning: Given image is not CTkImage but {type(image)}. " + - f"Image can not be scaled on HighDPI displays, use CTkImage instead.\n") + warnings.warn(f"{type(self).__name__} Warning: Given image is not CTkImage but {type(image)}. Image can not be scaled on HighDPI displays, use CTkImage instead.\n") return image def _update_dimensions_event(self, event): @@ -197,12 +193,15 @@ class CTkBaseClass(tkinter.Frame, CTkAppearanceModeBaseClass, CTkScalingBaseClas if master_widget is None: master_widget = self.master - if isinstance(master_widget, (windows.widgets.core_widget_classes.CTkBaseClass, windows.CTk, windows.CTkToplevel)): + if isinstance(master_widget, (windows.widgets.core_widget_classes.CTkBaseClass, windows.CTk, windows.CTkToplevel, windows.widgets.ctk_scrollable_frame.CTkScrollableFrame)): if master_widget.cget("fg_color") is not None and master_widget.cget("fg_color") != "transparent": return master_widget.cget("fg_color") + elif isinstance(master_widget, windows.widgets.ctk_scrollable_frame.CTkScrollableFrame): + return self._detect_color_of_master(master_widget.master.master.master) + # if fg_color of master is None, try to retrieve fg_color from master of master - elif hasattr(master_widget.master, "master"): + elif hasattr(master_widget, "master"): return self._detect_color_of_master(master_widget.master) elif isinstance(master_widget, (ttk.Frame, ttk.LabelFrame, ttk.Notebook, ttk.Label)): # master is ttk widget @@ -269,6 +268,8 @@ class CTkBaseClass(tkinter.Frame, CTkAppearanceModeBaseClass, CTkScalingBaseClas relheight=amount - height of this widget between 0.0 and 1.0 relative to height of master (1.0 is the same height as the master) bordermode="inside" or "outside" - whether to take border width of master widget into account """ + if "width" in kwargs or "height" in kwargs: + raise ValueError("'width' and 'height' arguments must be passed to the constructor of the widget, not the place method") self._last_geometry_manager_call = {"function": super().place, "kwargs": kwargs} return super().place(**self._apply_argument_scaling(kwargs)) diff --git a/customtkinter/windows/widgets/ctk_button.py b/customtkinter/windows/widgets/ctk_button.py index 45ed025..d79a944 100644 --- a/customtkinter/windows/widgets/ctk_button.py +++ b/customtkinter/windows/widgets/ctk_button.py @@ -40,7 +40,7 @@ class CTkButton(CTkBaseClass): text: str = "CTkButton", font: Optional[Union[tuple, CTkFont]] = None, textvariable: Union[tkinter.Variable, None] = None, - image: Union[CTkImage, None] = None, + image: Union[CTkImage, "ImageTk.PhotoImage", None] = None, state: str = "normal", hover: bool = True, command: Union[Callable[[], None], None] = None, @@ -169,8 +169,11 @@ class CTkButton(CTkBaseClass): def _update_image(self): if self._image_label is not None: - self._image_label.configure(image=self._image.create_scaled_photo_image(self._get_widget_scaling(), - self._get_appearance_mode())) + if isinstance(self._image, CTkImage): + self._image_label.configure(image=self._image.create_scaled_photo_image(self._get_widget_scaling(), + self._get_appearance_mode())) + elif self._image is not None: + self._image_label.configure(image=self._image) def destroy(self): if isinstance(self._font, CTkFont): @@ -425,6 +428,7 @@ class CTkButton(CTkBaseClass): if "command" in kwargs: self._command = kwargs.pop("command") + self._set_cursor() if "compound" in kwargs: self._compound = kwargs.pop("compound") diff --git a/customtkinter/windows/widgets/ctk_entry.py b/customtkinter/windows/widgets/ctk_entry.py index 6a2560b..db54386 100644 --- a/customtkinter/windows/widgets/ctk_entry.py +++ b/customtkinter/windows/widgets/ctk_entry.py @@ -133,7 +133,7 @@ class CTkEntry(CTkBaseClass): self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), height=self._apply_widget_scaling(self._desired_height)) - self._draw() + self._draw(no_color_updates=True) def _update_font(self): """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ @@ -153,14 +153,14 @@ class CTkEntry(CTkBaseClass): def _draw(self, no_color_updates=False): super()._draw(no_color_updates) - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._current_width), self._apply_widget_scaling(self._current_height), self._apply_widget_scaling(self._corner_radius), self._apply_widget_scaling(self._border_width)) if requires_recoloring or no_color_updates is False: + self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) + if self._apply_appearance_mode(self._fg_color) == "transparent": self._canvas.itemconfig("inner_parts", fill=self._apply_appearance_mode(self._bg_color), @@ -342,13 +342,13 @@ class CTkEntry(CTkBaseClass): return self._entry.get() def focus(self): - return self._entry.focus() + self._entry.focus() def focus_set(self): - return self._entry.focus_set() + self._entry.focus_set() def focus_force(self): - return self._entry.focus_force() + self._entry.focus_force() def index(self, index): return self._entry.index(index) diff --git a/customtkinter/windows/widgets/ctk_frame.py b/customtkinter/windows/widgets/ctk_frame.py index fe9e226..67bf161 100644 --- a/customtkinter/windows/widgets/ctk_frame.py +++ b/customtkinter/windows/widgets/ctk_frame.py @@ -24,8 +24,8 @@ class CTkFrame(CTkBaseClass): bg_color: Union[str, Tuple[str, str]] = "transparent", fg_color: Optional[Union[str, Tuple[str, str]]] = None, border_color: Optional[Union[str, Tuple[str, str]]] = None, - background_corner_colors: Union[Tuple[Union[str, Tuple[str, str]]], None] = None, + background_corner_colors: Union[Tuple[Union[str, Tuple[str, str]]], None] = None, overwrite_preferred_drawing_method: Union[str, None] = None, **kwargs): diff --git a/customtkinter/windows/widgets/ctk_scrollable_frame.py b/customtkinter/windows/widgets/ctk_scrollable_frame.py new file mode 100644 index 0000000..685deb2 --- /dev/null +++ b/customtkinter/windows/widgets/ctk_scrollable_frame.py @@ -0,0 +1,316 @@ +from typing import Union, Tuple, Optional +try: + from typing import Literal +except ImportError: + from typing_extensions import Literal +import tkinter +import sys + +from .ctk_frame import CTkFrame +from .ctk_scrollbar import CTkScrollbar +from .appearance_mode import CTkAppearanceModeBaseClass +from .scaling import CTkScalingBaseClass +from .core_widget_classes import CTkBaseClass +from .ctk_label import CTkLabel +from .font import CTkFont +from .theme import ThemeManager + + +class CTkScrollableFrame(tkinter.Frame, CTkAppearanceModeBaseClass, CTkScalingBaseClass): + def __init__(self, + master: any, + width: int = 200, + height: int = 200, + corner_radius: Optional[Union[int, str]] = None, + border_width: Optional[Union[int, str]] = None, + + bg_color: Union[str, Tuple[str, str]] = "transparent", + fg_color: Optional[Union[str, Tuple[str, str]]] = None, + border_color: Optional[Union[str, Tuple[str, str]]] = None, + scrollbar_fg_color: Optional[Union[str, Tuple[str, str]]] = None, + scrollbar_button_color: Optional[Union[str, Tuple[str, str]]] = None, + scrollbar_button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, + label_fg_color: Optional[Union[str, Tuple[str, str]]] = None, + label_text_color: Optional[Union[str, Tuple[str, str]]] = None, + + label_text: str = "", + label_font: Optional[Union[tuple, CTkFont]] = None, + label_anchor: str = "center", + orientation: Literal["vertical", "horizontal"] = "vertical"): + + self._orientation = orientation + + # dimensions independent of scaling + self._desired_width = width # _desired_width and _desired_height, represent desired size set by width and height + self._desired_height = height + + self._parent_frame = CTkFrame(master=master, width=0, height=0, corner_radius=corner_radius, + border_width=border_width, bg_color=bg_color, fg_color=fg_color, border_color=border_color) + self._parent_canvas = tkinter.Canvas(master=self._parent_frame, highlightthickness=0) + self._set_scroll_increments() + + if self._orientation == "horizontal": + self._scrollbar = CTkScrollbar(master=self._parent_frame, orientation="horizontal", command=self._parent_canvas.xview, + fg_color=scrollbar_fg_color, button_color=scrollbar_button_color, button_hover_color=scrollbar_button_hover_color) + self._parent_canvas.configure(xscrollcommand=self._scrollbar.set) + elif self._orientation == "vertical": + self._scrollbar = CTkScrollbar(master=self._parent_frame, orientation="vertical", command=self._parent_canvas.yview, + fg_color=scrollbar_fg_color, button_color=scrollbar_button_color, button_hover_color=scrollbar_button_hover_color) + self._parent_canvas.configure(yscrollcommand=self._scrollbar.set) + + self._label_text = label_text + self._label = CTkLabel(self._parent_frame, text=label_text, anchor=label_anchor, font=label_font, + corner_radius=self._parent_frame.cget("corner_radius"), text_color=label_text_color, + fg_color=ThemeManager.theme["CTkScrollableFrame"]["label_fg_color"] if label_fg_color is None else label_fg_color) + + tkinter.Frame.__init__(self, master=self._parent_canvas, highlightthickness=0) + CTkAppearanceModeBaseClass.__init__(self) + CTkScalingBaseClass.__init__(self, scaling_type="widget") + + self._create_grid() + + self._parent_canvas.configure(width=self._apply_widget_scaling(self._desired_width), + height=self._apply_widget_scaling(self._desired_height)) + + self.bind("", lambda e: self._parent_canvas.configure(scrollregion=self._parent_canvas.bbox("all"))) + self._parent_canvas.bind("", self._fit_frame_dimensions_to_canvas) + self.bind_all("", self._mouse_wheel_all, add="+") + self.bind_all("", self._keyboard_shift_press_all, add="+") + self.bind_all("", self._keyboard_shift_press_all, add="+") + self.bind_all("", self._keyboard_shift_release_all, add="+") + self.bind_all("", self._keyboard_shift_release_all, add="+") + self._create_window_id = self._parent_canvas.create_window(0, 0, window=self, anchor="nw") + + if self._parent_frame.cget("fg_color") == "transparent": + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + else: + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + + self._shift_pressed = False + + def destroy(self): + tkinter.Frame.destroy(self) + CTkAppearanceModeBaseClass.destroy(self) + CTkScalingBaseClass.destroy(self) + + def _create_grid(self): + border_spacing = self._apply_widget_scaling(self._parent_frame.cget("corner_radius") + self._parent_frame.cget("border_width")) + + if self._orientation == "horizontal": + self._parent_frame.grid_columnconfigure(0, weight=1) + self._parent_frame.grid_rowconfigure(1, weight=1) + self._parent_canvas.grid(row=1, column=0, sticky="nsew", padx=border_spacing, pady=(border_spacing, 0)) + self._scrollbar.grid(row=2, column=0, sticky="nsew", padx=border_spacing) + + if self._label_text is not None and self._label_text != "": + self._label.grid(row=0, column=0, sticky="ew", padx=border_spacing, pady=border_spacing) + else: + self._label.grid_forget() + + elif self._orientation == "vertical": + self._parent_frame.grid_columnconfigure(0, weight=1) + self._parent_frame.grid_rowconfigure(1, weight=1) + self._parent_canvas.grid(row=1, column=0, sticky="nsew", padx=(border_spacing, 0), pady=border_spacing) + self._scrollbar.grid(row=1, column=1, sticky="nsew", pady=border_spacing) + + if self._label_text is not None and self._label_text != "": + self._label.grid(row=0, column=0, columnspan=2, sticky="ew", padx=border_spacing, pady=border_spacing) + else: + self._label.grid_forget() + + def _set_appearance_mode(self, mode_string): + super()._set_appearance_mode(mode_string) + + if self._parent_frame.cget("fg_color") == "transparent": + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + else: + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + + def _set_scaling(self, new_widget_scaling, new_window_scaling): + super()._set_scaling(new_widget_scaling, new_window_scaling) + + self._parent_canvas.configure(width=self._apply_widget_scaling(self._desired_width), + height=self._apply_widget_scaling(self._desired_height)) + + def _set_dimensions(self, width=None, height=None): + if width is not None: + self._desired_width = width + if height is not None: + self._desired_height = height + + self._parent_canvas.configure(width=self._apply_widget_scaling(self._desired_width), + height=self._apply_widget_scaling(self._desired_height)) + + def configure(self, **kwargs): + if "width" in kwargs: + self._set_dimensions(width=kwargs.pop("width")) + + if "height" in kwargs: + self._set_dimensions(height=kwargs.pop("height")) + + if "corner_radius" in kwargs: + new_corner_radius = kwargs.pop("corner_radius") + self._parent_frame.configure(corner_radius=new_corner_radius) + if self._label is not None: + self._label.configure(corner_radius=new_corner_radius) + self._create_grid() + + if "border_width" in kwargs: + self._parent_frame.configure(border_width=kwargs.pop("border_width")) + self._create_grid() + + if "fg_color" in kwargs: + self._parent_frame.configure(fg_color=kwargs.pop("fg_color")) + + if self._parent_frame.cget("fg_color") == "transparent": + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + else: + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + + for child in self.winfo_children(): + if isinstance(child, CTkBaseClass): + child.configure(bg_color=self._parent_frame.cget("fg_color")) + + if "scrollbar_fg_color" in kwargs: + self._scrollbar.configure(fg_color=kwargs.pop("scrollbar_fg_color")) + + if "scrollbar_button_color" in kwargs: + self._scrollbar.configure(fg_color=kwargs.pop("scrollbar_button_color")) + + if "scrollbar_button_hover_color" in kwargs: + self._scrollbar.configure(fg_color=kwargs.pop("scrollbar_button_hover_color")) + + if "label_text" in kwargs: + self._label_text = kwargs.pop("label_text") + self._label.configure(text=self._label_text) + self._create_grid() + + if "label_font" in kwargs: + self._label.configure(font=kwargs.pop("label_font")) + + if "label_text_color" in kwargs: + self._label.configure(text_color=kwargs.pop("label_text_color")) + + if "label_fg_color" in kwargs: + self._label.configure(fg_color=kwargs.pop("label_fg_color")) + + if "label_anchor" in kwargs: + self._label.configure(anchor=kwargs.pop("label_anchor")) + + self._parent_frame.configure(**kwargs) + + def cget(self, attribute_name: str): + if attribute_name == "width": + return self._desired_width + elif attribute_name == "height": + return self._desired_height + + elif attribute_name == "label_text": + return self._label_text + elif attribute_name == "label_font": + return self._label.cget("font") + elif attribute_name == "label_text_color": + return self._label.cget("_text_color") + elif attribute_name == "label_fg_color": + return self._label.cget("fg_color") + elif attribute_name == "label_anchor": + return self._label.cget("anchor") + + elif attribute_name.startswith("scrollbar_fg_color"): + return self._scrollbar.cget("fg_color") + elif attribute_name.startswith("scrollbar_button_color"): + return self._scrollbar.cget("button_color") + elif attribute_name.startswith("scrollbar_button_hover_color"): + return self._scrollbar.cget("button_hover_color") + + else: + return self._parent_frame.cget(attribute_name) + + def _fit_frame_dimensions_to_canvas(self, event): + if self._orientation == "horizontal": + self._parent_canvas.itemconfigure(self._create_window_id, height=self._parent_canvas.winfo_height()) + elif self._orientation == "vertical": + self._parent_canvas.itemconfigure(self._create_window_id, width=self._parent_canvas.winfo_width()) + + def _set_scroll_increments(self): + if sys.platform.startswith("win"): + self._parent_canvas.configure(xscrollincrement=1, yscrollincrement=1) + elif sys.platform == "darwin": + self._parent_canvas.configure(xscrollincrement=4, yscrollincrement=8) + + def _mouse_wheel_all(self, event): + if self.check_if_master_is_canvas(event.widget): + if sys.platform.startswith("win"): + if self._shift_pressed: + if self._parent_canvas.xview() != (0.0, 1.0): + self._parent_canvas.xview("scroll", -int(event.delta / 6), "units") + else: + if self._parent_canvas.yview() != (0.0, 1.0): + self._parent_canvas.yview("scroll", -int(event.delta / 6), "units") + elif sys.platform == "darwin": + if self._shift_pressed: + if self._parent_canvas.xview() != (0.0, 1.0): + self._parent_canvas.xview("scroll", -event.delta, "units") + else: + if self._parent_canvas.yview() != (0.0, 1.0): + self._parent_canvas.yview("scroll", -event.delta, "units") + else: + if self._shift_pressed: + if self._parent_canvas.xview() != (0.0, 1.0): + self._parent_canvas.xview("scroll", -event.delta, "units") + else: + if self._parent_canvas.yview() != (0.0, 1.0): + self._parent_canvas.yview("scroll", -event.delta, "units") + + def _keyboard_shift_press_all(self, event): + self._shift_pressed = True + + def _keyboard_shift_release_all(self, event): + self._shift_pressed = False + + def check_if_master_is_canvas(self, widget): + if widget == self._parent_canvas: + return True + elif widget.master is not None: + return self.check_if_master_is_canvas(widget.master) + else: + return False + + def pack(self, **kwargs): + self._parent_frame.pack(**kwargs) + + def place(self, **kwargs): + self._parent_frame.place(**kwargs) + + def grid(self, **kwargs): + self._parent_frame.grid(**kwargs) + + def pack_forget(self): + self._parent_frame.pack_forget() + + def place_forget(self, **kwargs): + self._parent_frame.place_forget() + + def grid_forget(self, **kwargs): + self._parent_frame.grid_forget() + + def grid_remove(self, **kwargs): + self._parent_frame.grid_remove() + + def grid_propagate(self, **kwargs): + self._parent_frame.grid_propagate() + + def grid_info(self, **kwargs): + return self._parent_frame.grid_info() + + def lift(self, aboveThis=None): + self._parent_frame.lift(aboveThis) + + def lower(self, belowThis=None): + self._parent_frame.lower(belowThis) diff --git a/customtkinter/windows/widgets/font/__pycache__/__init__.cpython-310.pyc b/customtkinter/windows/widgets/font/__pycache__/__init__.cpython-310.pyc index 4d8382174fe284d0d65eff32df550fe81cb045ab..b1801a0a177868a51d714b8e85473f2ce985dba2 100644 GIT binary patch delta 27 hcmeC@=;z?c=jG*M0D|)mSW-6fBrr23PtIjt1OQj@2Mz!L delta 27 hcmeC@=;z?c=jG*M00O3m?a3Q?5||mCC+9LR0svA$2BZK0 diff --git a/customtkinter/windows/widgets/font/__pycache__/__init__.cpython-37.pyc b/customtkinter/windows/widgets/font/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81ca1dfb19656481bc7615b4f83f0dbceff5ad99 GIT binary patch literal 1023 zcmZ`%&1xGl5MJ$if8w7cP9ZI!h3&}%T0cN2r6g^jhlG-!%d#Nk)!3G;UAdAL$9bCg z*r#a^Jrtb^J>?a8s&;LcrVxppnH_!lH1kQvoleuS*t=l96kLuA5}tLdpIv<+L8KO+ShfxLHD%gy(a%s&((R)7hJQlM4h4=qk5 z!G#zIEpGQ#{`CcnN={^7>)~y8ojU`{%Dhg!I4PAD`PGya8YEU@G6RJxs=m;}Q`4%# zb^7*OR)h5l+@G_8in+3$j%)?}3L4LeELbr*ia$vhf|NjGYKyh0I0rozH17RF*^4t$ z#D&oD0OC?v@BlJmgIJFtt_g>XL!60{(+!RbLV@<1*Q#ReWlUxq);0EGRwxaG_Twwd zAfccjE7<3faHbdWoN-%Dv2^Zt#y!|)jVm}Mdzz)kPVwM z+nJDn|DGU&3fE-?)Ac^Q2Ajr==&=bYlLg7agk+%VOoVaO8^-4816{F2LZ*dWBwJOh zHJfQn1S`z5*+x~oRu!*QHG$H$Q)&FUWE#FWa^IFyo8R)}D7{u7RXULJhNS0kqcbi_ zno^=kdQ7ruIZLg?7IA+0G0h0i?3>Y&Wq^-~l%%{#AC#D`uipCl>eEV{6yv&i+@CE> l^d=XypTZAw${(ORpG(N;8l;0x{QB7%$HUP5T1SZfn*ts)Li&I(s>>JRAP zApIdaIb0C@4{n{zxzQQ}ImvhK`5xy>dRk9Qx~iHO^RL%W$$m)|CBg?AQk5)D_#B-C zO!+V*x(Ij>8VR0fUOda5qD}q3vQM~TnvIs#>6m7JY)BhyQKlrv9_8ms#xKQX%k!MJ z-5;k5C|?9Dji3O@oMqdh{$1>VEVH-R{!)-iopblnp(`V~NEA65YsNKs8z%;<$3Hjo zs1&7cw{6oo&{=@ygYnb40wUC!xypxzp}1txlMa{9uJ8;?2F*m3+)g9$&vzOj)+CgM z!XuvR1?^^0O=-C8ec;jKmTO(mD2O${ z769|`h}FIpooNlB`t#u%POD{_p|$DAD6mq>CN*}S+FO_bp#bpng_Oa->?>9J21qG` AVE_OC delta 670 zcmZ8fJxjw-6wR}3Y)Vu7sj_0%?-%XbV{$r5cAu7_^CaIV zaogQjHehQH9LIISVW!qB!x_66Av*+H;LQqPbBk$CqGhMnYlr;ux#0_;7Cv$8s z{2nl>FpdIT^op!nUoj6|q4^R!n3L-D9Z_gh>&Ji{|gd1@r)$<-hVe|--j z#F`|tsPTyJ`9Zr3)U=w{tRL*3P$w892P(#s(@SgUc*JU+%g(flQ2+k$HOF;LGqg52OM#VAHmS09YGXo}P^bpL&lh3_hS^7| F^ac12f~f!i diff --git a/customtkinter/windows/widgets/font/__pycache__/ctk_font.cpython-37.pyc b/customtkinter/windows/widgets/font/__pycache__/ctk_font.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..181e8e3982ff87dbc4eff0276bf9be77e4497c78 GIT binary patch literal 3815 zcmbtX&5zs06`vs~iqdN3wY_${{wmubU9(+i6Sq0UNQ2bdx(MJZK zOR3`YbIYu4J>8RI`SUo72T~=p;o>1x=_&pWB3Z}QuHEhVHXg=d&MYK+xaAn?G6>aoda#glvO}etyw>Ox$^vn`#;xc9~ zi7VpjDGS&1PV3^@sTW=b=M{1NnWe{G5jRd-;Z>Mz1H0c8x3FscW9G2%8ccJis_#4< zky+v!P_*gep`M@b?#ra~4~FHQUks0>Kg|5e@KB~(XbCxyAjH=9izH5m*`TA>KF$4s zEcKWaeo0pKm7FM9fIBAR`qM)CiIQ( zOyAGqvGn7@kNu)l%VSBxGuAyh9PE{vD}%J9gvXZh8#xa&OJj34PsJtd-QT|d!`I*37I{)^muB%cnY`%imE%yr@YwT9lv?;2_Qt7IBrd(2|^ua@4$|f6c@fpZ~%~-@{ z0E>~QZkK!?d4>45Hjwx;3v+hqoUr}c3^@mmca|K;5^(U+ow0rUgs-rftvPR5{pO|oGj;1yBM^Vo#;pv{M{wf-#_vbp+Gz3FV zHM@#%QC%VeTx4nuBydezkJ5m;OymlYs~}%+Uw10g4Vu-Rh)ftIdDb5erV1^<)oz@O zq7>+*8dy}-Np}hm$%GRV89j`Zil>LYWLlK@cpi7X1At3@P~a;dbkU?P$WqDE(Oq;5j% zTX>6g5azkoZR;*?@*CX3&$HV6cx?`7orM)3wzn`{LTFA8eJRX#@D}6_1PXi3XZ!_6 zjp1;kb^Mke3*q;tSwg_I<(GSLN$^(qv>ov6U{7WSod$X7FC8WPZeXeF*tBxv2|*>g z-$GZtO61#1@*QHig+sp1({F&G&>~yMuP*eufd3n*_coAuj4b>=H8h)Cq~Tq|@^wnS z`6VU4yHN7tC4iw8MTD*(r~;L%WI0vYIsF~%tKEAS4RUYEOJK$v5BNGeL7wkBeH+f^ z$30kswz#l%q1@52R7{X~gx6#Lp2@2RRFJlGt$aX52Te*aJsbozbq7KaiUI)@1+cn7 zghX4I?j8+%B{;6Wq*A^GzC}>nTG;C)du{P75Rix-PW8>&8+4J{tJiZXzY1yUJqQu z(PuOM>DgS(REIfd{anv`!PTe2Lw#sawV3lXG5QzLG^4s|)DPDollK$$Ve@yWYA3kl ze)NwIaM6WxR=T>31pKU;puH?Aics)Nh2$D_shR|h%AVvC6J#40s2WRnGU0cdSScuV z3~IERyG3;Fo*6#jjf)U*~PBZ9leK{P^;DA0ZNutnGN= z|A;PdD!>-!a+N}q-eL;`)trwk)rM7I1N1EPZj;}h7@xprFVNN&vWLpNo(A0x2tbej~)frsi>3bP}G}IG|t5o#XG86 zQS{L?PUkcAD8el+ij<2@D;t1R*?=NN_bR%t<*BZpijYygMr4y_YW*}vRj$#%_lay1 zAy?x9ksWCxDw4HYotOVarYVkDsp-e%h^;R8Q|8LX(-a2b-r|sNyJiB#e z-P6~kpdGg6)xSg7s>l}RG`BpO0NfQ>+Q_U$B;|}sEANdbxhgfLgqIC>giDA7I02y4 nE5u2_U@l}!anAy}^4>PKe20TgUj$n4KV2u*c$;6bTK0bdoAbtU literal 0 HcmV?d00001 diff --git a/customtkinter/windows/widgets/font/__pycache__/font_manager.cpython-310.pyc b/customtkinter/windows/widgets/font/__pycache__/font_manager.cpython-310.pyc index b84a3af0274521e4573c3c2bbae134658c2a8bb3..c4626bfe7834c3ad0c2d26c602c8d7d494e56af8 100644 GIT binary patch delta 28 icmZ1`xJ-~IpO=@50SL}NU`g4?INn>=LSlkW(Sx*Nw diff --git a/customtkinter/windows/widgets/image/__pycache__/ctk_image.cpython-310.pyc b/customtkinter/windows/widgets/image/__pycache__/ctk_image.cpython-310.pyc index 1f1b44b935d253c8304490fbe65857a76b6a5f0e..9ca44bcc458788cc58f5bddcc735ac5435e43f28 100644 GIT binary patch delta 28 icmaE<^iqi@pO=@50SL}NU`g4?)5yY@yt$9%HV*)L83>;M delta 28 icmaE<^iqi@pO=@50SHXeI+8c?G_o){Z|-Bc%>w{%KnLvr diff --git a/customtkinter/windows/widgets/scaling/__pycache__/__init__.cpython-310.pyc b/customtkinter/windows/widgets/scaling/__pycache__/__init__.cpython-310.pyc index 05da204584ba6bcfe3fb8f04ba2614d4d8daa461..62a614fff43ebd32a7474e2ae981700ae750c711 100644 GIT binary patch delta 27 hcmaFP{G6F5pO=@50SL}NU`g4?aWpO=@50SL}NU`g4?vxAW_dGb-l*#K)y2u%P0 delta 27 hcmaFB@_>aWpO=@50SK5LwkL1o*}=%@JozZ&Yyf4P2jc($ diff --git a/customtkinter/windows/widgets/theme/__pycache__/__init__.cpython-37.pyc b/customtkinter/windows/widgets/theme/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47788ad6941370368302a044036f8257392bdf90 GIT binary patch literal 606 zcmY*WO^XvT7*3|MRfcxa(}Jgfr-JQVrKo6^UD$&~Y-Q^h7}H6%jgv`+eAthp{tOZH z=&$i?Pl6}^f+yb@UCtmuis<-4I}iUajval9>a1A0FF3TsKOb> zXm>2|r-(hrd@(Ht+g)J@G ynfgC7rGJZuov(yLRGcy2g<_C-b diff --git a/customtkinter/windows/widgets/theme/__pycache__/theme_manager.cpython-37.pyc b/customtkinter/windows/widgets/theme/__pycache__/theme_manager.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52191021bc23758fb22bd047cfb02df45defa91a GIT binary patch literal 1682 zcmaJ>-EJc_6t+Eo$u!+YRq3`83jqnLNKo!q6mWxX1lV#Qh7BgdFdoZtxP; zqh6O7|4F8_3HFPuEK+N{X+8`dL024vKz93t?4t}Np72G$@eYKs8}s1UPeKui#wG%L z2=*vxidZywbVQu3v4g}C=*?d+kNMK2e}R*hSmG_de2HMZ%p*9|J=1!6B1Ym1Rei^9xlhwdN>S*1O7oI& z!Rx6mHmlBu7HlMFDe0K$la#0-uvPo})o94CR3i z-Aptm9CNV$3{bxy3*SQh)9SgW8&}P_w*Y?{KZ8Vlg}z4LpyFK}&hh{I*cfzaGJ{C* zRcnDhLC^DZz}o6_e-l|7oZtt&Jh;chA(6k`%>gKOjc(lOs&sz`3)Sbtz zwfVZ$o)&Tv_hu{G+aJ|`rj*bs32TgJ!S+Cvg~2ijMlAhu&xDYiv#c5&cR zF%(l}JO!dL&Y3DvOG0|yWR=m%dX8m234y$oLEi3To?S0-)S)Nu9Rc5K6yG%+} zP5No2bUCt&)I#Q(>1#EzeYZNrb|o}Rc8fVI+4oadr$u-8jeE z8~C6HKuaj!?raE=$b|aT`#|^m#G2}W3 z3}6*E985e4eG+tWfGM&osQO>YCWn0tBqpvc8ag&&^Vr zLuHMGJ}J3;2P|^Sio2t`QODZsqihSr9XtklY~VFQaC^he08E?KYsCtOP^hQltT=XI br48o%{%dQ~*s1UIvE`AnHP*oP*Y^Ga3fjA~ literal 0 HcmV?d00001 diff --git a/customtkinter/windows/widgets/utility/__pycache__/__init__.cpython-310.pyc b/customtkinter/windows/widgets/utility/__pycache__/__init__.cpython-310.pyc index 42608ea1d2a1f435eaed3339ffdf763a8fc67f23..436f0eb8a026e14c4dbad4c189a92448540ac796 100644 GIT binary patch delta 25 fcmZ3>w3dk{pO=@50SL}NU`d(CGo3Mc;*w4PQIiL2 delta 25 fcmZ3>w3dk{pO=@50SK5LwkJ>Ina=1uaY-itOqT}% diff --git a/customtkinter/windows/widgets/utility/__pycache__/utility_functions.cpython-310.pyc b/customtkinter/windows/widgets/utility/__pycache__/utility_functions.cpython-310.pyc index dc466e29d06bffc5af8863cff71175ce11fd4eb5..35ce824e40152962fb5bfc0763a3fffcbced06bb 100644 GIT binary patch delta 28 icmX@beu|wZpO=@50SL}NU`g4?6T!%syg8LIl?ec9=Lb^& delta 28 icmX@beu|wZpO=@50SK5LwkL1oiC|=O-ki#q$^-yp%?9ZJ diff --git a/main.py b/main.py index 0c8fafb..a1b20cf 100644 --- a/main.py +++ b/main.py @@ -64,11 +64,13 @@ class Expression: def valeurs_de_fonction(self, start, end): """ Calcul les valeurs entre start et end""" result = [] - for i in range(start, end+1): + pas = (end - start) / 1000 + while start <= end: try: - result.append((i, self.evalue(i))) + result.append((start, self.evalue(start))) except: pass + start += pas return result @@ -121,6 +123,18 @@ class App(ctk.CTk): self.fonction_frame = ctk.CTkFrame(self, fg_color="transparent") + self.fonction_bornes_frame = ctk.CTkFrame(self.fonction_frame, corner_radius=None) + + self.fonction_bornes_entry = ctk.CTkEntry(self.fonction_bornes_frame) + self.fonction_bornes_entry.insert(0, "-100,100") + self.fonction_bornes_entry.grid(sticky="ew", row=1, padx=10) + + self.fonction_bornes_text = ctk.CTkLabel(self.fonction_bornes_frame, text="Entrez les bornes de tracé: (min, max)") + self.fonction_bornes_text.grid(sticky="ew", row=0) + + self.fonction_bornes_frame.grid(sticky="ns", column=0, rowspan=2) + + self.fonction_screen = ctk.CTkCanvas(self.fonction_frame) self.fonction_screen.grid(sticky="nsew", column=1, row=0) self.fonction_entry = ctk.CTkEntry(self.fonction_frame) @@ -238,7 +252,7 @@ class App(ctk.CTk): ordonnee = max_x / (abs(min_x)+abs(max_x)) for i in range(20): # dessin des lignes verticales - if i == int(20*ordonnee): + if i == int(20 - 20*ordonnee): self.fonction_screen.create_line(0 + i * self.fonction_screen_width/20, 0 , 0 + i * self.fonction_screen_width/20, self.fonction_screen_height , fill='red', width=4) @@ -257,7 +271,7 @@ class App(ctk.CTk): nb_abscisse_lines = int(20*ratio) # nombre de lignes horizontales à tracer for i in range(nb_abscisse_lines): # dessin des lignes horizontales - if i == int(nb_abscisse_lines * abscisse): # tracer de l'axe des abscisses + if i == math.ceil(nb_abscisse_lines * abscisse): # tracer de l'axe des abscisses self.fonction_screen.create_line(0, 0 + i * self.fonction_screen_width/20 , self.fonction_screen_width , 0 + i * self.fonction_screen_width/20, fill='red' @@ -292,12 +306,13 @@ class App(ctk.CTk): def draw_graph(self): """Dessine les points du graphique""" self.fonction_screen.delete('all') - fonction_points = npi2tree(inf2npi(parse_string_to_list(self.fonction_entry.get()))).valeurs_de_fonction(-100, 100) + min_x, max_x = map(int, self.fonction_bornes_entry.get().split(',')) + fonction_points = npi2tree(inf2npi(parse_string_to_list(self.fonction_entry.get()))).valeurs_de_fonction(min_x, max_x) max_y = max(fonction_points, key=lambda item: item[1])[1] min_y = min(fonction_points, key=lambda item: item[1])[1] - self.draw_framing(-1000, 1000, min_y, max_y) - for x, y in fonction_points: - image_x = self.fonction_screen_width / 2 + x * (self.fonction_screen_width/len(fonction_points)) + self.draw_framing(min_x, max_x, min_y, max_y) + for i, (x, y) in enumerate(fonction_points): + image_x = i * (self.fonction_screen_width/len(fonction_points)) image_y = self.fonction_screen_height - (y - min_y) * self.fonction_screen_height / (abs(max_y)+abs(min_y)) self.fonction_screen.create_rectangle(image_x, image_y, image_x, image_y) @@ -319,11 +334,9 @@ def parse_string_to_list(text: str) -> list: if len(buffer_function) == 0: number_first = True elif char.isalpha(): - print(char) buffer_function += char else: if number_first: - print("number", char) result.append(float(buffer_number)) buffer_number = "" number_first = False @@ -332,7 +345,6 @@ def parse_string_to_list(text: str) -> list: result.append(buffer_function) buffer_function = "" elif char == '(': - print("()") result.append('*') else: @@ -351,7 +363,6 @@ def parse_string_to_list(text: str) -> list: result.append(buffer_function) elif len(buffer_function) != 0: result.append(buffer_function) - print(result) return result def npi2tree(expr: list) -> Expression: @@ -399,7 +410,6 @@ def inf2npi(expr: list) -> list: operator_stack.empiler(val) while not operator_stack.est_vide(): output.append(operator_stack.depiler()) - print(output) return output