tkfluent 0.0.3__py3-none-any.whl → 0.0.4__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/constants.py ADDED
@@ -0,0 +1,15 @@
1
+ NO = FALSE = OFF = 0
2
+ YES = TRUE = ON = 1
3
+
4
+ # Modes
5
+ LIGHT = 'light'
6
+ DARK = 'dark'
7
+
8
+ # States
9
+ NORMAL = 'normal'
10
+ DISABLED = 'disabled'
11
+
12
+ # FluButton Styles
13
+ STANDARD = 'standard'
14
+ ACCENT = 'accent'
15
+ MENU = 'menu'
tkflu/entry.py CHANGED
@@ -16,7 +16,7 @@ class FluEntryDraw(DSvgDraw):
16
16
  drawing = self.create_drawing(x2 - x1, y2 - y1, temppath=temppath)
17
17
  border = drawing[1].linearGradient(start=(x1, y1), end=(x1, y2), id="DButton.Border")
18
18
  border.add_stop_color("0%", outline)
19
- border.add_stop_color("85%", outline)
19
+ border.add_stop_color("90%", outline)
20
20
  border.add_stop_color("100%", outline2)
21
21
  drawing[1].defs.add(border)
22
22
  drawing[1].add(
@@ -24,8 +24,15 @@ class FluEntryDraw(DSvgDraw):
24
24
  (x1, y1), (x2 - x1, y2 - y1), _rx, _ry,
25
25
  fill=fill, stroke_width=width,
26
26
  stroke=f"url(#{border.get_id()})",
27
+ ),
28
+ )
29
+ """print((x1, y1), (x2 - x1, y2 - y1))
30
+ drawing[1].add(
31
+ drawing[1].line(
32
+ (x1 + radius / 2, y2 - width), (x2 - radius / 2, y2 - width,)
27
33
  )
28
34
  )
35
+ print((x1 + radius / 2, y2 - width), (x2 - radius / 2, y2 - width,))"""
29
36
  drawing[1].save()
30
37
  return drawing[0]
31
38
 
@@ -55,6 +62,7 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
55
62
  cursor="xterm",
56
63
  textvariable=None,
57
64
  mode="light",
65
+ state="normal",
58
66
  **kwargs):
59
67
  self._init(mode)
60
68
 
@@ -73,6 +81,10 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
73
81
 
74
82
  self.bind("<FocusIn>", self._event_focus_in, add="+")
75
83
 
84
+ self.dconfigure(
85
+ state=state,
86
+ )
87
+
76
88
  if font is None:
77
89
  from tkdeft.utility.fonts import SegoeFont
78
90
  self.attributes.font = SegoeFont()
@@ -83,11 +95,11 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
83
95
  self.attributes = EasyDict(
84
96
  {
85
97
  "font": None,
98
+ "state": "normal",
86
99
 
87
100
  "rest": {},
88
-
89
- "focus": {}
90
-
101
+ "focus": {},
102
+ "disabled": {}
91
103
  }
92
104
  )
93
105
 
@@ -100,28 +112,45 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
100
112
 
101
113
  self.entry.configure(font=self.attributes.font)
102
114
 
103
- if self.isfocus:
104
- _back_color = self.attributes.focus.back_color
105
- _border_color = self.attributes.focus.border_color
106
- _border_color2 = self.attributes.focus.border_color2
107
- _border_width = self.attributes.focus.border_width
108
- _radius = self.attributes.focus.radius
109
- _text_color = self.attributes.focus.text_color
115
+ state = self.dcget("state")
116
+
117
+ if state == "normal":
118
+ self.entry.configure(state="normal")
119
+ if self.isfocus:
120
+ _back_color = self.attributes.focus.back_color
121
+ _border_color = self.attributes.focus.border_color
122
+ _border_color2 = self.attributes.focus.border_color2
123
+ _border_width = self.attributes.focus.border_width
124
+ _radius = self.attributes.focus.radius
125
+ _text_color = self.attributes.focus.text_color
126
+ else:
127
+ _back_color = self.attributes.rest.back_color
128
+ _border_color = self.attributes.rest.border_color
129
+ _border_color2 = self.attributes.rest.border_color2
130
+ _border_width = self.attributes.rest.border_width
131
+ _radius = self.attributes.rest.radius
132
+ _text_color = self.attributes.rest.text_color
110
133
  else:
111
- _back_color = self.attributes.rest.back_color
112
- _border_color = self.attributes.rest.border_color
113
- _border_color2 = self.attributes.rest.border_color2
114
- _border_width = self.attributes.rest.border_width
115
- _radius = self.attributes.rest.radius
116
- _text_color = self.attributes.rest.text_color
134
+ self.entry.configure(state="disabled")
135
+ _back_color = self.attributes.disabled.back_color
136
+ _border_color = self.attributes.disabled.border_color
137
+ _border_color2 = self.attributes.disabled.border_color2
138
+ _border_width = self.attributes.disabled.border_width
139
+ _radius = self.attributes.disabled.radius
140
+ _text_color = self.attributes.disabled.text_color
117
141
 
118
- self.entry.configure(background=_back_color, insertbackground=_text_color, foreground=_text_color)
142
+ self.entry.configure(background=_back_color, insertbackground=_text_color, foreground=_text_color, disabledbackground=_back_color, disabledforeground=_text_color)
119
143
 
120
144
  self.element_border = self.create_round_rectangle(
121
145
  0, 0, self.winfo_width(), self.winfo_height(), _radius, temppath=self.temppath,
122
146
  fill=_back_color, outline=_border_color, outline2=_border_color2, width=_border_width
123
147
  )
124
148
 
149
+ self.element_line = self.create_line(
150
+ _radius / 3, self.winfo_height() - _radius / 3, self.winfo_width() - _radius / 3, self.winfo_height() - _radius / 3,
151
+ width=1, fill=_border_color2
152
+ )
153
+
125
154
  self.element_text = self.create_window(
126
155
  self.winfo_width() / 2, self.winfo_height() / 2,
127
156
  window=self.entry,
@@ -163,6 +192,14 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
163
192
  "border_width": 2,
164
193
  "radius": 6,
165
194
  "text_color": "#636363",
195
+ },
196
+ disabled={
197
+ "back_color": "#fdfdfd",
198
+ "border_color": "#e5e5e5",
199
+ "border_color2": "#e5e5e5",
200
+ "border_width": 1,
201
+ "radius": 6,
202
+ "text_color": "#a2a2a2",
166
203
  }
167
204
  )
168
205
 
@@ -183,5 +220,13 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
183
220
  "border_width": 2,
184
221
  "radius": 6,
185
222
  "text_color": "#ffffff",
223
+ },
224
+ disabled={
225
+ "back_color": "#2a2a2a",
226
+ "border_color": "#303030",
227
+ "border_color2": "#303030",
228
+ "border_width": 1,
229
+ "radius": 6,
230
+ "text_color": "#787878",
186
231
  }
187
232
  )
tkflu/icons.py ADDED
@@ -0,0 +1,47 @@
1
+ def icon():
2
+ from tempfile import mkstemp
3
+
4
+ _icon = b"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"
5
+
6
+ _, _temp = mkstemp()
7
+
8
+ with open(_temp, "wb") as _file:
9
+ from base64 import b64decode
10
+
11
+ _file.write(b64decode(_icon))
12
+
13
+ _icon2 = (_temp).replace("\\", "//")
14
+
15
+ return _icon2
16
+
17
+
18
+ def light():
19
+ from tempfile import mkstemp
20
+
21
+ _icon = b"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABjRJREFUWEetV0uMHNUVPfd1dbWxDe62u7rN2I5JUAi2AfGxITYi5AMSYgUBx3ICIea3QQjBimUWsGKBxCciMUE4BAnZTCJCYPhFCVklDpBEEYuQgIfg2MxUTYOHAWY8Xe+kzuiV1TQz4xni3rS6uurdc+8599xbhi/2qTabzSW1Wi2emJjwjUbj0+Hh4ckvcpQt9qF2u73Me3+GmW01sw0kPzCzP3jv96dpOrHY8xYFYO3atSdNTk5eZGZXm1kTwEcAjpjZR3mev21mv0/T9P3FgFgwgIGBgaVHjx7d4pz7HsmNAF4k+atKpRKT3O693+acG+p2u3s7nc7BhYJYEAAFn56ePt/MriP5NQUHMJim6YFms/kV59z3AewCUDGzR0juHh0dHVkIiOMCUPBut3seyV1mtl5l9t7vS9P03Xq9fmoURdc653YCWEfyFDMbJfmEc+6BkZGR0eOBmBeAOJ+amtqizAEo+B+993vTNB2u1+sDcRzvMLPtJNcDOEpyqZk1SL5nZo977x/JsuzQfCDmBBAEd6E4B3Cmmf0uz/Onsyx7S52Q5/lVzrlbAWwC8DGAiORyM4sBLAGQeu8f9N4/3ul03psLxKwAAuebzUwZbvLei/On0zT9F4C41WpdQPIW59xW7/0yM1NwfddIfghgRNcALPfePwZg91yV+ByAknMANwA4neQrIfi/AbhWq3URyRvNbAuAUwQoZK7g4wD2O+eeITkG4A6SXxYdRds+NJsmPgOgVDuAH5nZOjN7NQhOwZEkySVm9oOiC7b2BC8zV/C/CCyAoVqtdmR6evo7JO8meRqAPWb2QH93HAPQw7kUfbrcLc/zfeJc7ZUkycUkdzrnLlFpQ+Zl8CMAXlPwPM9flg+E8y5zzt0G4DKSh0k+6r3/ea9PCIAlSbKMpEzmWpmMc+7lUnCB882Bkov7g8sJSSr4IMkXxHWSJMtJXmpmN5iZnk30HEl5w4N5nv+iFKYARCtXrjwjiqJdJHXzSz2Cq7Zarc1FW91kZhfOUvYy80EAz8uGg2N+y8zkG+cCaANYKv2IRpLyiYeDMN83lSpw9U2SKclfZ1kmztlqtbaRlB76gy8hqTmwX2BD5odVrWazeYV8w8zOB7AawEll8J5W/C+An8Vx/JCtWLGiUQjmTgA18ZNlmVoNq1ev3uC93wHgKgArBAjAyQCWAZgsgA0XCt8DYG9osWq73VZ7yrSuBNCaI/gMjqKLniuqf4+tWbNmVbfb/THJqvf+/izL/qn/BSDP851yuoK3VboWSlkFoLH7jgB47wfHxsaU0aIAkHzWOXevNZvNk51z1wOQyv8RhszbAHyr1bq86O27AFwasqGZCUgXQCYKRBnJF7MsO7xx48Z4dHS0pEB6Witgs7jgmJk9GkXRfTqsmiTJWep9AOf0ijBJEnF4TWGraqUzQxVUPp0pEBLU68653+R5/pxAlCIMNv0NAPU+AB+SHHTO7R4ZGXlj5qTg7WpDDZbeNjzQbrfXyfel6kJwAlpyWIKYKBaUvwN4MoAo2/DbAG6XXQfdCPgHJCXaJ6rV6uuHDh36ZF4jCpPvQL1eXxPHsRYRCUxVOgaCpA7+xMzkgr/sdrtD0kRwVYnxTjPbVoBR2Z/RcKrVaq8dPHjw0xkx9pZnHisebjQap1ar1R0kfxgm4MyzoiOAUGf8yTn3pAQWx/G42tt7f3eYpr9V70dR9FdlfiyJfoHMMYzKBWQgiqJrzOxmANqMZsylF4SZ/ZnkU9JHGEa67/kgur/1Bv9cBUow84zjY5pwzt0cdsN+OrQbaBxrQamTHALwWLVafaM/+JwA9MdsC0mYjO+02+0v5Xn+XXl90bZnz6IJXRonuU9TsJfz/or/3ysZSY3nzwgTwH8K3p/SQKvVam/OlvmcGphLE31LqfbCdyXMSqWyPVRigwYbAK3ke07IUtqnid61vJyYw0mSnKYlRSua9gaSP3HO/fSEreW9IHpfTMxsKLyYaIjtKPZGGc6QvOOEv5iUIIIwv+6ck8HQey+1y2ob2ogEaqGZL1gD/ZrQtlOpVNZr2Sy6YhPJVcXEfHNqaurZ8fHxTv/9x/t93DejWQ7QMy5JEi0aXyVZ8d6/1el0tJQu+vM/Pe3YF3/DEJ8AAAAASUVORK5CYII="
22
+
23
+ _, _temp = mkstemp()
24
+
25
+ with open(_temp, "wb") as _file:
26
+ from base64 import b64decode
27
+
28
+ _file.write(b64decode(_icon))
29
+
30
+ _icon2 = (_temp).replace("\\", "//")
31
+
32
+ return _icon2
33
+
34
+ def dark():
35
+ from tempfile import mkstemp
36
+ _icon = b"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABMlJREFUWEe1l1msXmMUhp9lnucYY455iHmMmIIEF2Yxz1wQwg2XLrhyITEFVTEmokqookoMV4a2iPRCq+ZS89yKSD/f06x9srv773P+U/XdnOHf/7fetdb7vmvtYDlOKWVVYA1gNWAxsCgi/lqOq4jxfqmUsjawM3AosBvwM/A68E5E/DHe+8YFoJSyJnAwcCqwCfA78Gv+nAe8FhELxgNiaACllLWAA4GzgN1rBaYBT2cbzgQOq+BerJ89GRFfDQtiKAAZfD/gfGCXDD4Z+BTYATgXuARYGbgXmBAR3w4DYkwAGXzfDLCtZQYm1b8/B7YAzgDOAbYG1gO+Ax4F7ogIfx/1jAoge27Zzdzgb1pi4DNgS+BswPL72d+AbdoQ+BJ4yGpExNejIegFkMEPyp7vCrwKPBURc1IJpwBX1mrsAfwJrAKsk5xQot8DdwokIgQ08AwEkGU/IDM0gIQz+NxSitrfH7gipagsDe7P1YFfAPvfAHowOTGwEssAaPX8otrLHYFXDF7b8DGwUsrw0lSEPReQmRv8N/0AeBb4sXrEdcD22Y67BnFiKQAttl+cpHojCWdwzxHAeZl5E7zJ3ODvJljlqD8cC9xUAWxXgTycxFxKHSMAWj2X0Wauu03Kniuvw5Ptgmh63QQ32IwMPl0fyGSOB66p5D2m8sUWTKiJTWz7RJRSBOFFsl1JaTLTW4SzxPLBlgiiL7i+8JKsL6WsW+V6JGCrJPLGOTvMXmI+0hBTAJJFb9dIDPRyi3AOHf93WV7ULXuTucFf0IYzczP2O/sAmwJaeFNtveHurMYCAfihvToqpfNMEq6kvcoHs2gHV2bOAQknQc38m1TIiekbOudmneCNFOdXH7nfaghA47g+WTyxkmxuPuWk02jU+/qAgCyt7XL0akYSS++37FZLeVrJk9KQBKpyBp2pVaq3CMD+3Ax4we0R8VHyQgASUqfzGUuo0/mcY/eTBDA5Iua3ANj3kyvjN0qJ9pndlHrXrQIwqwuSYB8C9nNeRCwupRxXtX1DEspWWQUv/Key+4dsgS2b1mqB2ds2uSNwSdwFoUc8UKt5mwDMaM/80t4dEm4OnF65cTWgHbcvEoSEmgk8V1U0NUHYIjl1VTUkh1i3EjqlSSrJWUsuTG9XhpZ7RIY5bp1y8sDeCrR9BGE7PgAeTxCNDI9Ou3aB2SBb5/YkaZ2WMyNi4VhG5ORz5m+VQ8mpaJW6Z2G64GMuJckJ+XICcG0qzLJr0U7JGRGxyEuGtWIZ7+xXFRfmBOz2VWW8lZWQYFqzrbgxd8fns+zvmXmTwbDDqFlA3AHkxOW5GXUlJoi3K1+eSH44jNygnA32/P128GUq0KDqG8cdTghCvnSPu4GW64Ji7w3uSJ7VDd4LIImp7LoLiZVQ/9sAp+V82KvHaGyBz2tWIz3vPrsiVjLHc5eYX2QbZPzsQZn3cqCLsGcpVR3NUqp0nZQ6p4PNlbyZ/f9tKe1wor2WL5mYOQ9cNqyCK5p7wz1VMfetsLW8A6L9YiK5fDFxFVOevqr9Py8mLRAS85A6Axy5zgXZLtOdqG5EmtBQLyRDc2AAJ9yIfA9w2XRjduDMrqN4SkT81KOI3n+P+WY0AIDf0YCsxk7Z9zkRoezGff4FJEWot2oJkhgAAAAASUVORK5CYII="
37
+
38
+ _, _temp = mkstemp()
39
+
40
+ with open(_temp, "wb") as _file:
41
+ from base64 import b64decode
42
+
43
+ _file.write(b64decode(_icon))
44
+
45
+ _icon2 = (_temp).replace("\\", "//")
46
+
47
+ return _icon2
tkflu/menu.py CHANGED
@@ -45,10 +45,10 @@ class FluMenu(FluPopupMenu):
45
45
  self.window.wm_withdraw()
46
46
 
47
47
  else:
48
- def empty():
49
- pass
48
+ def c():
49
+ self.window.wm_withdraw()
50
50
 
51
- command = empty
51
+ command = c
52
52
  if "id" in kwargs:
53
53
  id = kwargs.pop("id")
54
54
  else:
@@ -61,5 +61,43 @@ class FluMenu(FluPopupMenu):
61
61
  if hasattr(widget, "theme"):
62
62
  widget.theme(style=style)
63
63
 
64
+ widget.pack(side="top", fill="x", padx=1, pady=(1, 0))
65
+ self.dcget("actions")[id] = widget
66
+
67
+ def add_cascade(self, custom_widget=None, width=40, menu=None, **kwargs):
68
+ if custom_widget:
69
+ widget = custom_widget(self)
70
+ else:
71
+ from .button import FluButton
72
+ widget = FluButton(self, width=width)
73
+ if "label" in kwargs:
74
+ label = kwargs.pop("label")
75
+ else:
76
+ label = ""
77
+ if "style" in kwargs:
78
+ style = kwargs.pop("style")
79
+ else:
80
+ style = "menu"
81
+ if "id" in kwargs:
82
+ id = kwargs.pop("id")
83
+ else:
84
+ id = widget._w
85
+
86
+ def command():
87
+ print(menu._w)
88
+ menu.focus_set()
89
+
90
+ menu.popup(widget.winfo_rootx()+widget.winfo_width()+100, widget.winfo_rooty())
91
+ menu.window.deiconify()
92
+ menu.window.attributes("-topmost")
93
+
94
+ if hasattr(widget, "dconfigure"):
95
+ widget.dconfigure(text=label, command=command)
96
+ else:
97
+ if hasattr(widget, "configure"):
98
+ widget.configure(text=label, command=command)
99
+ if hasattr(widget, "theme"):
100
+ widget.theme(style=style)
101
+
64
102
  widget.pack(side="top", fill="x", padx=1, pady=(1, 0))
65
103
  self.dcget("actions")[id] = widget
tkflu/popupmenu.py CHANGED
@@ -1,35 +1,10 @@
1
- from tkinter import Toplevel
2
1
  from .frame import FluFrame
2
+ from .popupwindow import FluPopupWindow
3
3
 
4
4
 
5
- class FluPopupMenuWindow(Toplevel):
6
- def __init__(self, *args, transparent_color="#ffefa2", mode="light", width=100, height=46, **kwargs):
7
- super().__init__(*args, background=transparent_color, **kwargs)
8
-
9
- self.theme(mode=mode)
10
-
11
- self.geometry(f"{width}x{height}")
12
-
13
- self.transient_color = transparent_color
14
- self.overrideredirect(True)
15
- self.attributes("-transparentcolor", transparent_color)
16
-
17
- self.withdraw()
18
-
19
- self.bind("<FocusOut>", self._event_focusout)
20
-
21
- def _event_focusout(self, event=None):
22
- self.withdraw()
23
-
24
- def popup(self, x, y):
25
- self.geometry(f"+{x}+{y}")
26
-
27
- def theme(self, mode=None):
28
- if mode:
29
- self.mode = mode
30
- for widget in self.winfo_children():
31
- if hasattr(widget, "theme"):
32
- widget.theme(mode=self.mode.lower())
5
+ class FluPopupMenuWindow(FluPopupWindow):
6
+ def __init__(self, *args, **kwargs):
7
+ super().__init__(*args, **kwargs)
33
8
 
34
9
 
35
10
  class FluPopupMenu(FluFrame):
tkflu/popupwindow.py ADDED
@@ -0,0 +1,31 @@
1
+ from tkinter import Toplevel
2
+
3
+
4
+ class FluPopupWindow(Toplevel):
5
+ def __init__(self, *args, transparent_color="#ffefa2", mode="light", width=100, height=46, **kwargs):
6
+ super().__init__(*args, background=transparent_color, **kwargs)
7
+
8
+ self.theme(mode=mode)
9
+
10
+ self.geometry(f"{width}x{height}")
11
+
12
+ self.transient_color = transparent_color
13
+ self.overrideredirect(True)
14
+ self.attributes("-transparentcolor", transparent_color)
15
+
16
+ self.withdraw()
17
+
18
+ self.bind("<FocusOut>", self._event_focusout, add="+")
19
+
20
+ def _event_focusout(self, event=None):
21
+ self.withdraw()
22
+
23
+ def popup(self, x, y):
24
+ self.geometry(f"+{x}+{y}")
25
+
26
+ def theme(self, mode=None):
27
+ if mode:
28
+ self.mode = mode
29
+ for widget in self.winfo_children():
30
+ if hasattr(widget, "theme"):
31
+ widget.theme(mode=self.mode.lower())
tkflu/text.py CHANGED
@@ -16,7 +16,7 @@ class FluTextDraw(DSvgDraw):
16
16
  drawing = self.create_drawing(x2 - x1, y2 - y1, temppath=temppath)
17
17
  border = drawing[1].linearGradient(start=(x1, y1), end=(x1, y2), id="DButton.Border")
18
18
  border.add_stop_color("0%", outline)
19
- border.add_stop_color("85%", outline)
19
+ border.add_stop_color("90%", outline)
20
20
  border.add_stop_color("100%", outline2)
21
21
  drawing[1].defs.add(border)
22
22
  drawing[1].add(
@@ -54,6 +54,7 @@ class FluText(FluTextCanvas, DDrawWidget):
54
54
  font=None,
55
55
  cursor="xterm",
56
56
  mode="light",
57
+ state="normal",
57
58
  **kwargs):
58
59
  self._init(mode)
59
60
 
@@ -72,6 +73,10 @@ class FluText(FluTextCanvas, DDrawWidget):
72
73
 
73
74
  self.bind("<FocusIn>", self._event_focus_in, add="+")
74
75
 
76
+ self.dconfigure(
77
+ state=state,
78
+ )
79
+
75
80
  if font is None:
76
81
  from tkdeft.utility.fonts import SegoeFont
77
82
  self.attributes.font = SegoeFont()
@@ -82,11 +87,11 @@ class FluText(FluTextCanvas, DDrawWidget):
82
87
  self.attributes = EasyDict(
83
88
  {
84
89
  "font": None,
90
+ "state": "normal",
85
91
 
86
92
  "rest": {},
87
-
88
- "focus": {}
89
-
93
+ "focus": {},
94
+ "disabled": {},
90
95
  }
91
96
  )
92
97
 
@@ -99,20 +104,32 @@ class FluText(FluTextCanvas, DDrawWidget):
99
104
 
100
105
  self.delete("all")
101
106
 
102
- if self.isfocus:
103
- _back_color = self.attributes.focus.back_color
104
- _border_color = self.attributes.focus.border_color
105
- _border_color2 = self.attributes.focus.border_color2
106
- _border_width = self.attributes.focus.border_width
107
- _radius = self.attributes.focus.radius
108
- _text_color = self.attributes.focus.text_color
107
+ state = self.dcget("state")
108
+
109
+ if state == "normal":
110
+ self.text.configure(state="normal")
111
+ if self.isfocus:
112
+ _back_color = self.attributes.focus.back_color
113
+ _border_color = self.attributes.focus.border_color
114
+ _border_color2 = self.attributes.focus.border_color2
115
+ _border_width = self.attributes.focus.border_width
116
+ _radius = self.attributes.focus.radius
117
+ _text_color = self.attributes.focus.text_color
118
+ else:
119
+ _back_color = self.attributes.rest.back_color
120
+ _border_color = self.attributes.rest.border_color
121
+ _border_color2 = self.attributes.rest.border_color2
122
+ _border_width = self.attributes.rest.border_width
123
+ _radius = self.attributes.rest.radius
124
+ _text_color = self.attributes.rest.text_color
109
125
  else:
110
- _back_color = self.attributes.rest.back_color
111
- _border_color = self.attributes.rest.border_color
112
- _border_color2 = self.attributes.rest.border_color2
113
- _border_width = self.attributes.rest.border_width
114
- _radius = self.attributes.rest.radius
115
- _text_color = self.attributes.rest.text_color
126
+ self.text.configure(state="disabled")
127
+ _back_color = self.attributes.disabled.back_color
128
+ _border_color = self.attributes.disabled.border_color
129
+ _border_color2 = self.attributes.disabled.border_color2
130
+ _border_width = self.attributes.disabled.border_width
131
+ _radius = self.attributes.disabled.radius
132
+ _text_color = self.attributes.disabled.text_color
116
133
 
117
134
  self.text.configure(
118
135
  background=_back_color, insertbackground=_text_color, foreground=_text_color,
@@ -125,6 +142,11 @@ class FluText(FluTextCanvas, DDrawWidget):
125
142
  fill=_back_color, outline=_border_color, outline2=_border_color2, width=_border_width
126
143
  )
127
144
 
145
+ self.element_line = self.create_line(
146
+ _radius / 3, self.winfo_height() - _radius / 3, self.winfo_width() - _radius / 3, self.winfo_height() - _radius / 3,
147
+ width=1, fill=_border_color2
148
+ )
149
+
128
150
  self.element_text = self.create_window(
129
151
  self.winfo_width() / 2, self.winfo_height() / 2,
130
152
  window=self.text,
@@ -166,6 +188,14 @@ class FluText(FluTextCanvas, DDrawWidget):
166
188
  "border_width": 2,
167
189
  "radius": 6,
168
190
  "text_color": "#636363",
191
+ },
192
+ disabled={
193
+ "back_color": "#fdfdfd",
194
+ "border_color": "#e5e5e5",
195
+ "border_color2": "#e5e5e5",
196
+ "border_width": 1,
197
+ "radius": 6,
198
+ "text_color": "#a2a2a2",
169
199
  }
170
200
  )
171
201
 
@@ -186,5 +216,13 @@ class FluText(FluTextCanvas, DDrawWidget):
186
216
  "border_width": 2,
187
217
  "radius": 6,
188
218
  "text_color": "#ffffff",
219
+ },
220
+ disabled={
221
+ "back_color": "#2a2a2a",
222
+ "border_color": "#303030",
223
+ "border_color2": "#303030",
224
+ "border_width": 1,
225
+ "radius": 6,
226
+ "text_color": "#787878",
189
227
  }
190
- )
228
+ )
tkflu/togglebutton.py CHANGED
@@ -93,57 +93,15 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget):
93
93
  "checked": False,
94
94
 
95
95
  "uncheck": {
96
- "rest": {
97
- "back_color": None,
98
- "border_color": None,
99
- "border_color2": None,
100
- "border_width": None,
101
- "radius": None,
102
- "text_color": None,
103
- },
104
- "hover": {
105
- "back_color": None,
106
- "border_color": None,
107
- "border_color2": None,
108
- "border_width": None,
109
- "radius": None,
110
- "text_color": None,
111
- },
112
- "pressed": {
113
- "back_color": None,
114
- "border_color": None,
115
- "border_color2": None,
116
- "border_width": None,
117
- "radius": None,
118
- "text_color": None,
119
- }
96
+ "rest": {},
97
+ "hover": {},
98
+ "pressed": {}
120
99
  },
121
100
 
122
101
  "check": {
123
- "rest": {
124
- "back_color": None,
125
- "border_color": None,
126
- "border_color2": None,
127
- "border_width": None,
128
- "radius": None,
129
- "text_color": None,
130
- },
131
- "hover": {
132
- "back_color": None,
133
- "border_color": None,
134
- "border_color2": None,
135
- "border_width": None,
136
- "radius": None,
137
- "text_color": None,
138
- },
139
- "pressed": {
140
- "back_color": None,
141
- "border_color": None,
142
- "border_color2": None,
143
- "border_width": None,
144
- "radius": None,
145
- "text_color": None,
146
- }
102
+ "rest": {},
103
+ "hover": {},
104
+ "pressed": {}
147
105
  }
148
106
  }
149
107
  )
tkflu/tooltip.py ADDED
@@ -0,0 +1,8 @@
1
+ from .popupwindow import FluPopupWindow
2
+
3
+
4
+ class FluToolTip(FluPopupWindow):
5
+ def __init__(self, widget, *args, **kwargs):
6
+ super().__init__(*args, **kwargs)
7
+
8
+ self.widget = widget
tkflu/toplevel.py CHANGED
@@ -24,7 +24,6 @@ class FluToplevel(Toplevel, BWm, DObject):
24
24
 
25
25
  Toplevel.__init__(self, *args, **kwargs)
26
26
 
27
- self.bind("<Configure>", self._event_configure)
28
-
29
- def _exit(self):
30
- self.destroy()
27
+ self.bind("<Configure>", self._event_configure, add="+")
28
+ self.bind("<Escape>", self._event_key_esc, add="+")
29
+ self.protocol("WM_DELETE_WINDOW", self._event_delete_window)
tkflu/window.py CHANGED
@@ -24,8 +24,11 @@ class FluWindow(Tk, BWm, DObject):
24
24
 
25
25
  super().__init__(*args, className=className, **kwargs)
26
26
 
27
- self.bind("<Configure>", self._event_configure)
28
-
29
-
27
+ from .icons import light
28
+ from tkinter import PhotoImage
30
29
 
30
+ self.iconphoto(False, PhotoImage(file=light()))
31
31
 
32
+ self.bind("<Configure>", self._event_configure, add="+")
33
+ self.bind("<Escape>", self._event_key_esc, add="+")
34
+ self.protocol("WM_DELETE_WINDOW", self._event_delete_window)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tkfluent
3
- Version: 0.0.3
3
+ Version: 0.0.4
4
4
  Summary: Fluent Design for Tkinter
5
5
  Author: XiangQinxi
6
6
  Author-email: xiangqinxi@outlook.com
@@ -0,0 +1,31 @@
1
+ tkflu/__init__.py,sha256=qBGpXpHvmFgO-_H3Ty4-vwhffiPwNc0Py6qjDpa1-Wc,871
2
+ tkflu/__main__.py,sha256=aJa9qCV69vcnbAprdPtObv0gkx2B7Qxtvf1OlzmWrIY,2122
3
+ tkflu/badge.py,sha256=SReWYzwuJpKU-OvnpMUrsYoYAJ2pA0bahChxS06lhYk,4914
4
+ tkflu/button.py,sha256=qbTCfjfdJJG2Poj1voFYg0w7GAMYU4CW_zQIj5ALXuI,17148
5
+ tkflu/bwm.py,sha256=fbvX6-Lit4QtqQGRWKReowczSHZP3yC-s22HkCAZHy8,6094
6
+ tkflu/checkbox.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ tkflu/constants.py,sha256=UuVMgqBKn_nzoe9JsJKfXRZmSUafDdld2xYIHuLn-D0,219
8
+ tkflu/customwindow.py,sha256=Fr4CF0vKwj36tYzgX9_5F7OwcD59z9LfOW20Ugm2Hxc,3761
9
+ tkflu/customwindow2.py,sha256=nyNEMoGVnOYXCPbdvxZFUH-VlpAtjjEGI8Ul9VDvgAs,2109
10
+ tkflu/entry.py,sha256=kYdQPvX-_02kwxtO2WA3umizcXcba6z3Z8MJ7je_164,8416
11
+ tkflu/frame.py,sha256=jQprJ5pXfQ17iywzbAatS12U2g43yg1Mg7O-3dnXPOQ,7934
12
+ tkflu/icons.py,sha256=Xzrc9WzexncYEPXqnVg3ywWv_7kLZLyYC5WtaRv30PQ,7129
13
+ tkflu/image.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ tkflu/label.py,sha256=m9HEXlM0ribh8y4B6vfp3HEVH8ElyuVPyG-2BwzdGVo,1598
15
+ tkflu/listbox.py,sha256=gD_oNNWVZtm5qXQ8bVBNRqJL6CGiIYtvhxztM9huzew,9991
16
+ tkflu/litenav.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ tkflu/menu.py,sha256=x0gQf_AOsOe3Y38L_Op6_gkO85qkRTR_9A-e4QUex58,3152
18
+ tkflu/menubar.py,sha256=2XdMfWy6djGU3RL1ykbaUR6bj0rwaqdUJmufOzsdOPE,4027
19
+ tkflu/popupmenu.py,sha256=dRwuFK7PKSYXiLhzrrzjKXTjtLfr7vh0KDvJIUjDetg,1592
20
+ tkflu/popupwindow.py,sha256=yphXBI0wSmlGB64HwVtI-quKpIQAIMowxwg2bS4beLw,935
21
+ tkflu/scrollbar.py,sha256=1hbu5n1mx4KyiF_M3sohpJJPux1zu5Jlw9V6LfQQs1Y,7293
22
+ tkflu/text.py,sha256=_lCiQM7zNGYfVervk27p52LNGpGPQQ0SRCly4Nj-oP4,8172
23
+ tkflu/thememanager.py,sha256=oG-VWkFogVJJOmsz67hyVfvNdkWMUeP252Qcez8FQmk,963
24
+ tkflu/togglebutton.py,sha256=odBB8Ge0Ef5odvBTlZMfNlq82ssHQOlW_3U1if4-thU,11666
25
+ tkflu/tooltip.py,sha256=MlaV1GrkWsllkRlKswytQtU6Fwc332YSSo0IY9yj-n0,205
26
+ tkflu/toplevel.py,sha256=gcLz93Q9OgWc9dV4d-TK6gXk5eIetFuU5CbO8ybAvsI,815
27
+ tkflu/window.py,sha256=cp1nm5Eh2PYO1XzTKVX2ic7f4Xx1JREWlBRuO02MK64,980
28
+ tkflu/winico.py,sha256=5wB9VL6SyMLD9fH9eglWPuJjQAyd851PoNUO4j5A9gw,859
29
+ tkfluent-0.0.4.dist-info/METADATA,sha256=-XH8dlUqI4s7dk_NhvZW8Ei5tyvJmAZIPgnk9xM4HJI,872
30
+ tkfluent-0.0.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
31
+ tkfluent-0.0.4.dist-info/RECORD,,
@@ -1,27 +0,0 @@
1
- tkflu/__init__.py,sha256=HXTCYFRrttdDS-SfE-vKHNbb6_sw4WqAUkaiv-F7IkA,751
2
- tkflu/__main__.py,sha256=sWIY4ltJN76w7LmlGZQmE3N0X0VyYS3_zSL-76VwEeY,2002
3
- tkflu/badge.py,sha256=SReWYzwuJpKU-OvnpMUrsYoYAJ2pA0bahChxS06lhYk,4914
4
- tkflu/button.py,sha256=WZgwCxKIg0O_zwgsYY37FNyeZdcjIs7xewEiAUqdaK8,11967
5
- tkflu/bwm.py,sha256=KdDbHar0wReUwJDmLqKYQkfQ_xcBLNVDkTZayTk30FY,5979
6
- tkflu/checkbox.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- tkflu/customwindow.py,sha256=Fr4CF0vKwj36tYzgX9_5F7OwcD59z9LfOW20Ugm2Hxc,3761
8
- tkflu/customwindow2.py,sha256=nyNEMoGVnOYXCPbdvxZFUH-VlpAtjjEGI8Ul9VDvgAs,2109
9
- tkflu/entry.py,sha256=5afwWpMgGo_Lm7-ZDuipplxsI5Z1YNsLumtwmaxJIAE,6481
10
- tkflu/frame.py,sha256=jQprJ5pXfQ17iywzbAatS12U2g43yg1Mg7O-3dnXPOQ,7934
11
- tkflu/image.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- tkflu/label.py,sha256=m9HEXlM0ribh8y4B6vfp3HEVH8ElyuVPyG-2BwzdGVo,1598
13
- tkflu/listbox.py,sha256=gD_oNNWVZtm5qXQ8bVBNRqJL6CGiIYtvhxztM9huzew,9991
14
- tkflu/litenav.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- tkflu/menu.py,sha256=XUhbEmo0xgiVAv0o8HDRF4jfZ0PxGKbeyzWp3xkQwKk,1868
16
- tkflu/menubar.py,sha256=2XdMfWy6djGU3RL1ykbaUR6bj0rwaqdUJmufOzsdOPE,4027
17
- tkflu/popupmenu.py,sha256=rf_YWX5UzwlAhoRDRZE_tVbx_yfVxkecsdWTWvg80QA,2349
18
- tkflu/scrollbar.py,sha256=1hbu5n1mx4KyiF_M3sohpJJPux1zu5Jlw9V6LfQQs1Y,7293
19
- tkflu/text.py,sha256=5JwWXQ4OutnqxUWoZ-m1agULDSEg6HDoNdaU0wQMKd8,6590
20
- tkflu/thememanager.py,sha256=oG-VWkFogVJJOmsz67hyVfvNdkWMUeP252Qcez8FQmk,963
21
- tkflu/togglebutton.py,sha256=hcAYh8XYaireQuGLHKWxJDLm2wMYHt3GlJnE8TjjbIY,13436
22
- tkflu/toplevel.py,sha256=e5ZhQ7W2OheWJTkqev9sp9onmSASGIp_hdBaO8EYDc0,723
23
- tkflu/window.py,sha256=X3hhhtzwwFpKfuVsdkcUk4qX_5Y0iGEUO_N7mKU9sGw,713
24
- tkflu/winico.py,sha256=5wB9VL6SyMLD9fH9eglWPuJjQAyd851PoNUO4j5A9gw,859
25
- tkfluent-0.0.3.dist-info/METADATA,sha256=Kcv5NWDbTxkT7dV8NIJiuv3JEPZvQvH4wc17RwLt7KQ,872
26
- tkfluent-0.0.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
27
- tkfluent-0.0.3.dist-info/RECORD,,