tkfluent 0.0.9__py3-none-any.whl → 0.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tkflu/__main__.py +2 -5
- tkflu/badge.py +2 -0
- tkflu/button.py +97 -20
- tkflu/bwm.py +14 -1
- tkflu/demos/demo1.py +8 -0
- tkflu/demos/grad.py +70 -0
- tkflu/demos/grad2.py +140 -0
- tkflu/demos/grad3.py +11 -0
- tkflu/demos/test.py +8 -0
- tkflu/demos/tooltip.py +1 -1
- tkflu/designs/gradient.py +54 -0
- tkflu/designs/menubar.py +13 -0
- tkflu/frame.py +19 -4
- tkflu/menu.py +1 -1
- tkflu/menubar.py +34 -12
- tkflu/thememanager.py +35 -2
- tkflu/togglebutton.py +125 -32
- tkflu/tooltip.py +2 -2
- tkfluent-0.1.1.dist-info/METADATA +323 -0
- {tkfluent-0.0.9.dist-info → tkfluent-0.1.1.dist-info}/RECORD +21 -14
- tkfluent-0.0.9.dist-info/METADATA +0 -82
- {tkfluent-0.0.9.dist-info → tkfluent-0.1.1.dist-info}/WHEEL +0 -0
tkflu/menubar.py
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
from tkinter import Frame, Menu
|
2
2
|
from tkdeft.object import DObject
|
3
|
+
from .designs.gradient import FluGradient
|
3
4
|
|
4
5
|
|
5
|
-
class FluMenuBar(Frame, DObject):
|
6
|
+
class FluMenuBar(Frame, DObject, FluGradient):
|
6
7
|
def __init__(self, *args, mode="light", height=40, **kwargs):
|
7
8
|
self._init(mode)
|
8
9
|
|
@@ -26,6 +27,9 @@ class FluMenuBar(Frame, DObject):
|
|
26
27
|
|
27
28
|
self.theme(mode=mode)
|
28
29
|
|
30
|
+
def show(self):
|
31
|
+
self.pack(fill="x")
|
32
|
+
|
29
33
|
def add_command(self, custom_widget=None, width=40, **kwargs):
|
30
34
|
if custom_widget:
|
31
35
|
widget = custom_widget(self)
|
@@ -103,6 +107,16 @@ class FluMenuBar(Frame, DObject):
|
|
103
107
|
def action(self, id):
|
104
108
|
return self.dcget("actions")[id]
|
105
109
|
|
110
|
+
def update_children(self):
|
111
|
+
actions = self.dcget("actions")
|
112
|
+
for key in actions:
|
113
|
+
widget = actions[key]
|
114
|
+
if hasattr(widget, "theme"):
|
115
|
+
widget.theme(mode=self.mode)
|
116
|
+
if hasattr(widget, "_draw"):
|
117
|
+
widget._draw()
|
118
|
+
widget.update()
|
119
|
+
|
106
120
|
def theme(self, mode="light"):
|
107
121
|
self.theme_myself(mode=mode)
|
108
122
|
|
@@ -116,22 +130,30 @@ class FluMenuBar(Frame, DObject):
|
|
116
130
|
widget._draw()
|
117
131
|
widget.update()
|
118
132
|
|
119
|
-
def theme_myself(self, mode="light"):
|
133
|
+
def theme_myself(self, mode="light", animate_steps: int = 10):
|
134
|
+
from .designs.menubar import menubar
|
135
|
+
m = menubar(mode)
|
120
136
|
self.mode = mode
|
121
137
|
if mode.lower() == "dark":
|
122
|
-
self
|
138
|
+
if hasattr(self, "tk"):
|
139
|
+
back_colors = self.generate_hex2hex(self.attributes.back_color, m["back_color"], steps=10)
|
140
|
+
for i in range(10):
|
141
|
+
def update(ii=i): # 使用默认参数立即捕获i的值
|
142
|
+
self.dconfigure(back_color=back_colors[ii])
|
143
|
+
self._draw()
|
144
|
+
|
145
|
+
self.after(i * 10, update) # 直接传递函数,不需要lambda
|
146
|
+
self.after(animate_steps*10+50, lambda: self.update_children())
|
123
147
|
else:
|
124
|
-
self
|
148
|
+
if hasattr(self, "tk"):
|
149
|
+
back_colors = self.generate_hex2hex(self.attributes.back_color, m["back_color"], steps=10)
|
150
|
+
for i in range(10):
|
151
|
+
def update(ii=i): # 使用默认参数立即捕获i的值
|
152
|
+
self.dconfigure(back_color=back_colors[ii])
|
153
|
+
self._draw()
|
125
154
|
|
126
|
-
|
127
|
-
self.dconfigure(
|
128
|
-
back_color="#f3f3f3"
|
129
|
-
)
|
155
|
+
self.after(i * 20, update) # 直接传递函数,不需要lambda
|
130
156
|
|
131
|
-
def _dark(self):
|
132
|
-
self.dconfigure(
|
133
|
-
back_color="#202020"
|
134
|
-
)
|
135
157
|
|
136
158
|
def _draw(self, event=None):
|
137
159
|
self.config(background=self.attributes.back_color)
|
tkflu/thememanager.py
CHANGED
@@ -13,7 +13,40 @@ class FluThemeManager(object):
|
|
13
13
|
self.mode(self._mode)
|
14
14
|
self._window.after(delay, lambda: self.mode(self._mode))
|
15
15
|
|
16
|
-
def mode(self, mode: str, delay: int or None =
|
16
|
+
def mode(self, mode: str, delay: int or None = 0):
|
17
|
+
def _():
|
18
|
+
self._mode = mode
|
19
|
+
if hasattr(self._window, "theme"):
|
20
|
+
self._window.theme(mode=mode)
|
21
|
+
if hasattr(self._window, "_draw"):
|
22
|
+
self._window._draw()
|
23
|
+
self._window.update()
|
24
|
+
for widget in self._window.winfo_children():
|
25
|
+
if hasattr(widget, "theme"):
|
26
|
+
widget.theme(mode=mode)
|
27
|
+
if hasattr(widget, "_draw"):
|
28
|
+
widget._draw()
|
29
|
+
if hasattr(widget, "update_children"):
|
30
|
+
widget.update_children()
|
31
|
+
#widget.update()
|
32
|
+
if not delay == 0:
|
33
|
+
self._window.after(delay, _)
|
34
|
+
else:
|
35
|
+
_()
|
36
|
+
def __():
|
37
|
+
for widget in self._window.winfo_children():
|
38
|
+
if hasattr(widget, "_draw"):
|
39
|
+
widget._draw()
|
40
|
+
if hasattr(widget, "update_children"):
|
41
|
+
widget.update_children()
|
42
|
+
widget.update()
|
43
|
+
#self._window.after(delay+300, __)
|
44
|
+
|
45
|
+
def toggle(self, delay: int or None = None):
|
46
|
+
if self._mode == "light":
|
47
|
+
mode = "dark"
|
48
|
+
else:
|
49
|
+
mode = "light"
|
17
50
|
def _():
|
18
51
|
self._mode = mode
|
19
52
|
if hasattr(self._window, "theme"):
|
@@ -30,4 +63,4 @@ class FluThemeManager(object):
|
|
30
63
|
if delay:
|
31
64
|
self._window.after(delay, _)
|
32
65
|
else:
|
33
|
-
_()
|
66
|
+
_()
|
tkflu/togglebutton.py
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
from easydict import EasyDict
|
1
2
|
from tkdeft.windows.draw import DSvgDraw
|
2
3
|
from tkdeft.windows.canvas import DCanvas
|
3
4
|
from tkdeft.windows.drawwidget import DDrawWidget
|
@@ -60,9 +61,10 @@ class FluToggleButtonCanvas(DCanvas):
|
|
60
61
|
|
61
62
|
|
62
63
|
from .tooltip import FluToolTipBase
|
64
|
+
from .designs.gradient import FluGradient
|
63
65
|
|
64
66
|
|
65
|
-
class FluToggleButton(FluToggleButtonCanvas, DDrawWidget, FluToolTipBase):
|
67
|
+
class FluToggleButton(FluToggleButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
|
66
68
|
def __init__(self, *args,
|
67
69
|
text="",
|
68
70
|
width=120,
|
@@ -117,7 +119,7 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget, FluToolTipBase):
|
|
117
119
|
|
118
120
|
self.theme(mode=mode)
|
119
121
|
|
120
|
-
def _draw(self, event=None):
|
122
|
+
def _draw(self, event=None, tempcolor: dict = None):
|
121
123
|
super()._draw(event)
|
122
124
|
|
123
125
|
width = self.winfo_width()
|
@@ -128,39 +130,49 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget, FluToolTipBase):
|
|
128
130
|
state = self.dcget("state")
|
129
131
|
|
130
132
|
_dict = None
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
133
|
+
if not tempcolor:
|
134
|
+
if not self.attributes.checked:
|
135
|
+
if state == "normal":
|
136
|
+
if self.enter:
|
137
|
+
if self.button1:
|
138
|
+
_dict = self.attributes.uncheck.pressed
|
139
|
+
else:
|
140
|
+
_dict = self.attributes.uncheck.hover
|
137
141
|
else:
|
138
|
-
_dict = self.attributes.uncheck.
|
142
|
+
_dict = self.attributes.uncheck.rest
|
139
143
|
else:
|
140
|
-
_dict = self.attributes.uncheck.
|
144
|
+
_dict = self.attributes.uncheck.disabled
|
141
145
|
else:
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
146
|
+
if state == "normal":
|
147
|
+
if self.enter:
|
148
|
+
if self.button1:
|
149
|
+
_dict = self.attributes.check.pressed
|
150
|
+
else:
|
151
|
+
_dict = self.attributes.check.hover
|
148
152
|
else:
|
149
|
-
_dict = self.attributes.check.
|
153
|
+
_dict = self.attributes.check.rest
|
150
154
|
else:
|
151
|
-
_dict = self.attributes.check.
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
155
|
+
_dict = self.attributes.check.disabled
|
156
|
+
|
157
|
+
_back_color = _dict.back_color
|
158
|
+
_back_opacity = _dict.back_opacity
|
159
|
+
_border_color = _dict.border_color
|
160
|
+
_border_color_opacity = _dict.border_color_opacity
|
161
|
+
_border_color2 = _dict.border_color2
|
162
|
+
_border_color2_opacity = _dict.border_color2_opacity
|
163
|
+
_border_width = _dict.border_width
|
164
|
+
_radius = _dict.radius
|
165
|
+
_text_color = _dict.text_color
|
166
|
+
else:
|
167
|
+
_back_color = tempcolor.back_color
|
168
|
+
_back_opacity = tempcolor.back_opacity
|
169
|
+
_border_color = tempcolor.border_color
|
170
|
+
_border_color_opacity = tempcolor.border_color_opacity
|
171
|
+
_border_color2 = tempcolor.border_color2
|
172
|
+
_border_color2_opacity = tempcolor.border_color2_opacity
|
173
|
+
_border_width = tempcolor.border_width
|
174
|
+
_radius = tempcolor.radius
|
175
|
+
_text_color = tempcolor.text_color
|
164
176
|
|
165
177
|
self.element_border = self.create_round_rectangle_with_text(
|
166
178
|
0, 0, width, height, _radius, temppath=self.temppath,
|
@@ -379,9 +391,90 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget, FluToolTipBase):
|
|
379
391
|
def invoke(self):
|
380
392
|
self.attributes.command()
|
381
393
|
|
382
|
-
def toggle(self):
|
394
|
+
def toggle(self, animate_steps: int = 10):
|
395
|
+
"""
|
396
|
+
|
397
|
+
"back_color": "#ffffff",
|
398
|
+
"back_opacity": "0.7",
|
399
|
+
"border_color": "#000000",
|
400
|
+
"border_color_opacity": "0.2",
|
401
|
+
"border_color2": "#000000",
|
402
|
+
"border_color2_opacity": "0.3",
|
403
|
+
"border_width": 1,
|
404
|
+
"radius": 6,
|
405
|
+
"text_color": "#000000",
|
406
|
+
:return:
|
407
|
+
"""
|
408
|
+
steps = animate_steps
|
409
|
+
check = self.attributes.check
|
410
|
+
uncheck = self.attributes.uncheck
|
411
|
+
if uncheck.pressed.border_color2 is None:
|
412
|
+
uncheck.pressed.border_color2 = uncheck.pressed.border_color
|
413
|
+
if check.pressed.border_color2 is None:
|
414
|
+
check.pressed.border_color2 = check.pressed.border_color
|
415
|
+
if uncheck.pressed.border_color2_opacity is None:
|
416
|
+
uncheck.pressed.border_color2_opacity = uncheck.pressed.border_color_opacity
|
417
|
+
if check.pressed.border_color2_opacity is None:
|
418
|
+
check.pressed.border_color2_opacity = check.pressed.border_color_opacity
|
383
419
|
if self.attributes.checked:
|
384
420
|
self.attributes.checked = False
|
421
|
+
back_colors = self.generate_hex2hex(
|
422
|
+
check.pressed.back_color, uncheck.rest.back_color, steps
|
423
|
+
)
|
424
|
+
border_colors = self.generate_hex2hex(
|
425
|
+
check.pressed.border_color, uncheck.rest.border_color, steps
|
426
|
+
)
|
427
|
+
border_colors2 = self.generate_hex2hex(
|
428
|
+
check.pressed.border_color2, uncheck.rest.border_color2, steps
|
429
|
+
)
|
430
|
+
text_colors = self.generate_hex2hex(
|
431
|
+
check.pressed.text_color, uncheck.rest.text_color, steps
|
432
|
+
)
|
433
|
+
import numpy as np
|
434
|
+
back_opacitys = np.linspace(
|
435
|
+
float(check.pressed.back_opacity), float(uncheck.rest.back_opacity), steps).tolist()
|
436
|
+
border_color_opacitys = np.linspace(
|
437
|
+
float(check.pressed.border_color_opacity), float(uncheck.rest.border_color_opacity), steps).tolist()
|
438
|
+
border_color2_opacitys = np.linspace(
|
439
|
+
float(check.pressed.border_color2_opacity), float(uncheck.rest.border_color2_opacity), steps).tolist()
|
385
440
|
else:
|
386
441
|
self.attributes.checked = True
|
387
|
-
|
442
|
+
back_colors = self.generate_hex2hex(
|
443
|
+
uncheck.pressed.back_color, check.rest.back_color, steps
|
444
|
+
)
|
445
|
+
border_colors = self.generate_hex2hex(
|
446
|
+
uncheck.pressed.back_color, check.rest.back_color, steps
|
447
|
+
)
|
448
|
+
border_colors2 = self.generate_hex2hex(
|
449
|
+
uncheck.pressed.border_color2, check.rest.border_color2, steps
|
450
|
+
)
|
451
|
+
text_colors = self.generate_hex2hex(
|
452
|
+
uncheck.pressed.text_color, check.rest.text_color, steps
|
453
|
+
)
|
454
|
+
import numpy as np
|
455
|
+
back_opacitys = np.linspace(float(uncheck.pressed.back_opacity), float(check.rest.back_opacity),
|
456
|
+
steps).tolist()
|
457
|
+
border_color_opacitys = np.linspace(float(uncheck.pressed.border_color_opacity), float(check.rest.border_color_opacity),
|
458
|
+
steps).tolist()
|
459
|
+
border_color2_opacitys = np.linspace(float(uncheck.pressed.border_color2_opacity),
|
460
|
+
float(check.rest.border_color2_opacity),
|
461
|
+
steps).tolist()
|
462
|
+
for i in range(steps):
|
463
|
+
def update(ii=i):
|
464
|
+
from easydict import EasyDict
|
465
|
+
tempcolor = EasyDict(
|
466
|
+
{
|
467
|
+
"back_color": back_colors[ii],
|
468
|
+
"back_opacity": back_opacitys[ii],
|
469
|
+
"border_color": border_colors[ii],
|
470
|
+
"border_color_opacity": str(border_color_opacitys[ii]),
|
471
|
+
"border_color2": border_colors2[ii],
|
472
|
+
"border_color2_opacity": str(border_color2_opacitys[ii]),
|
473
|
+
"border_width": 1,
|
474
|
+
"text_color": text_colors[ii],
|
475
|
+
"radius": 6,
|
476
|
+
}
|
477
|
+
)
|
478
|
+
self._draw(None, tempcolor)
|
479
|
+
self.after(i*10, update)
|
480
|
+
self.after(steps*10+10, lambda: self._draw(None, None))
|
tkflu/tooltip.py
CHANGED
@@ -66,7 +66,7 @@ class FluToolTip(FluPopupWindow):
|
|
66
66
|
background=n["back_color"]
|
67
67
|
)
|
68
68
|
self.wm_attributes("-transparentcolor", n["back_color"])
|
69
|
-
print(n["back_color"])
|
69
|
+
#print(n["back_color"])
|
70
70
|
if hasattr(self, "_frame"):
|
71
71
|
self._frame.dconfigure(
|
72
72
|
back_color=n["frame_color"],
|
@@ -128,7 +128,7 @@ class FluToolTip2(FluPopupWindow):
|
|
128
128
|
background=n["back_color"]
|
129
129
|
)
|
130
130
|
self.wm_attributes("-transparentcolor", n["back_color"])
|
131
|
-
print(n["back_color"])
|
131
|
+
#print(n["back_color"])
|
132
132
|
if hasattr(self, "_frame"):
|
133
133
|
self._frame.dconfigure(
|
134
134
|
back_color=n["frame_color"],
|