tkfluent 0.0.4__py3-none-any.whl → 0.0.6__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.
@@ -0,0 +1,20 @@
1
+ from os.path import abspath, dirname, join
2
+
3
+ path = abspath(dirname(__file__))
4
+
5
+ segoefont = join(path, "segoeui.ttf")
6
+
7
+
8
+ def SegoeFont(size=9, weight="normal"):
9
+ from _tkinter import TclError
10
+ try:
11
+ from tkextrafont import Font
12
+ font = Font(file=segoefont, size=size, family="Segoe UI")
13
+ except TclError:
14
+ try:
15
+ from tkinter.font import Font
16
+ font = Font(size=size, family="Segoe UI", weight=weight)
17
+ except TclError:
18
+ from tkinter.font import nametofont
19
+ font = nametofont("TkDefaultFont").configure(size=size, weight=weight)
20
+ return font
Binary file
tkflu/designs/frame.py ADDED
@@ -0,0 +1,37 @@
1
+ def frame(mode, style):
2
+ mode = mode.lower()
3
+ style = style.lower()
4
+ if mode == "light":
5
+ if style == "standard":
6
+ return {
7
+ "back_color": "#FFFFFF",
8
+ "border_color": "#000000",
9
+ "border_color_opacity": 0.057800,
10
+ "border_width": 2,
11
+ "radius": 7,
12
+ }
13
+ else:
14
+ return {
15
+ "back_color": "#FFFFFF",
16
+ "border_color": "#000000",
17
+ "border_color_opacity": 0.057800,
18
+ "border_width": 2,
19
+ "radius": 7,
20
+ }
21
+ else:
22
+ if style == "standard":
23
+ return {
24
+ "back_color": "#282828",
25
+ "border_color": "#000000",
26
+ "border_color_opacity": 0.100000,
27
+ "border_width": 2,
28
+ "radius": 7,
29
+ }
30
+ else:
31
+ return {
32
+ "back_color": "#282828",
33
+ "border_color": "#000000",
34
+ "border_color_opacity": 0.100000,
35
+ "border_width": 2,
36
+ "radius": 7,
37
+ }
@@ -0,0 +1,25 @@
1
+ def set_primary_color(color: tuple = None):
2
+ from os import environ
3
+ from json import dumps
4
+ environ["tkfluent.primary_color"] = dumps(color)
5
+
6
+
7
+ def get_primary_color():
8
+ from os import environ
9
+ from json import loads
10
+ return loads(environ["tkfluent.primary_color"])
11
+
12
+
13
+ set_primary_color(("#005fb8", "#60cdff"))
14
+
15
+
16
+ class FluPrimaryColor(object):
17
+ def primary_color(self, color: tuple = None):
18
+ if color:
19
+ from os import environ
20
+ from json import dumps
21
+ environ["tkfluent.primary_color"] = dumps(color)
22
+ else:
23
+ from os import environ
24
+ from json import loads
25
+ return loads(environ["tkfluent.primary_color"])
tkflu/designs/text.py ADDED
@@ -0,0 +1,164 @@
1
+ from .primary_color import get_primary_color
2
+
3
+
4
+ def text(mode, state):
5
+ _r = 6
6
+ mode = mode.lower()
7
+ state = state.lower()
8
+ if mode == "light":
9
+ if state == "rest":
10
+ return {
11
+ "back_color": "#FEFEFE",
12
+ "back_opacity": 1,
13
+
14
+ "stop1": 0.999878,
15
+ "border_color": "#000000",
16
+ "border_color_opacity": 0.058824,
17
+
18
+ "stop2": 1.000000,
19
+ "border_color2": "#000000",
20
+ "border_color2_opacity": 0.447059,
21
+
22
+ "border_width": 1,
23
+ "radius": _r,
24
+ "text_color": "#646464",
25
+ "underline_fill": "#8a8a8a",
26
+ "underline_width": 1,
27
+ }
28
+ elif state == "hover":
29
+ return {
30
+ "back_color": "#FAFAFA",
31
+ "back_opacity": 1,
32
+
33
+ "stop1": 0.999878,
34
+ "border_color": "#000000",
35
+ "border_color_opacity": "0.058824",
36
+
37
+ "stop2": 1.000000,
38
+ "border_color2": "#000000",
39
+ "border_color2_opacity": "0.447059",
40
+
41
+ "border_width": 1,
42
+ "radius": _r,
43
+ "text_color": "#626262",
44
+ "underline_fill": "#8a8a8a",
45
+ "underline_width": 1,
46
+ }
47
+ elif state == "pressed":
48
+ return {
49
+ "back_color": "#FFFFFF",
50
+ "back_opacity": 0.700000,
51
+
52
+ "stop1": 0.941406,
53
+ "border_color": "#000000",
54
+ "border_color_opacity": 0.058824,
55
+
56
+ "stop2": 1,
57
+ "border_color2": get_primary_color()[0],
58
+ "border_color2_opacity": 1,
59
+
60
+ "border_width": 1,
61
+ "radius": _r,
62
+ "text_color": "#646464",
63
+ "underline_fill": get_primary_color()[0],
64
+ "underline_width": 1.5,
65
+ }
66
+ elif state == "disabled":
67
+ return {
68
+ "back_color": "#FAFAFA",
69
+ "back_opacity": 1,
70
+
71
+ "stop1": None,
72
+ "border_color": "#000000",
73
+ "border_color_opacity": 0.057800,
74
+
75
+ "stop2": None,
76
+ "border_color2": None,
77
+ "border_color2_opacity": None,
78
+
79
+ "border_width": 1,
80
+ "radius": _r,
81
+ "text_color": "#646464",
82
+ "underline_fill": None,
83
+ "underline_width": 1.5,
84
+ }
85
+
86
+ else:
87
+ if state == "rest":
88
+ return {
89
+ "back_color": "#292929",
90
+ "back_opacity": 1,
91
+
92
+ "stop1": 0.999767,
93
+ "border_color": "#FFFFFF",
94
+ "border_color_opacity": 0.078431,
95
+
96
+ "stop2": 1.000000,
97
+ "border_color2": "#FFFFFF",
98
+ "border_color2_opacity": 0.545098,
99
+
100
+ "border_width": 1,
101
+ "radius": _r,
102
+ "text_color": "#d1d1d1",
103
+ "underline_fill": "#989898",
104
+ "underline_width": 1,
105
+ }
106
+ elif state == "hover":
107
+ return {
108
+ "back_color": "#2f2f2f",
109
+ "back_opacity": 1,
110
+
111
+ "stop1": 0.999767,
112
+ "border_color": "#FFFFFF",
113
+ "border_color_opacity": "0.078431",
114
+
115
+ "stop2": 1,
116
+ "border_color2": "#FFFFFF",
117
+ "border_color2_opacity": "0.545098",
118
+
119
+ "border_width": 1,
120
+ "radius": _r,
121
+ "text_color": "#d2d2d2",
122
+
123
+ "underline_fill": "#989898",
124
+ "underline_width": 1,
125
+ }
126
+ elif state == "pressed":
127
+ return {
128
+ "back_color": "#1d1d1d",
129
+ "back_opacity": 1,
130
+
131
+ "stop1": 0.941406,
132
+ "border_color": "#FFFFFF",
133
+ "border_color_opacity": 0,
134
+
135
+ "stop2": 1,
136
+ "border_color2": get_primary_color()[1],
137
+ "border_color2_opacity": 1,
138
+
139
+ "border_width": 1,
140
+ "radius": _r,
141
+ "text_color": "#cecece",
142
+
143
+ "underline_fill": get_primary_color()[1],
144
+ "underline_width": 1.5,
145
+ }
146
+ elif state == "disabled":
147
+ return {
148
+ "back_color": "#262626",
149
+ "back_opacity": 0,
150
+
151
+ "stop1": None,
152
+ "border_color": "#FFFFFF",
153
+ "border_color_opacity": 0.069800,
154
+
155
+ "stop2": None,
156
+ "border_color2": None,
157
+ "border_color2_opacity": None,
158
+
159
+ "border_width": 1,
160
+ "radius": _r,
161
+ "text_color": "#757575",
162
+ "underline_fill": None,
163
+ "underline_width": 1,
164
+ }
@@ -0,0 +1,21 @@
1
+ def window(mode):
2
+ if mode.lower() == "light":
3
+ return {
4
+ "back_color": "#ffffff",
5
+ "text_color": "#000000",
6
+ "closebutton": {
7
+ "back_color": "#cf392d",
8
+ "text_color": "#000000",
9
+ "text_hover_color": "#ffffff"
10
+ }
11
+ }
12
+ else:
13
+ return {
14
+ "back_color": "#202020",
15
+ "text_color": "#ffffff",
16
+ "closebutton": {
17
+ "back_color": "#c42b1c",
18
+ "text_color": "#ffffff",
19
+ "text_hover_color": "#000000"
20
+ }
21
+ }
tkflu/entry.py CHANGED
@@ -2,37 +2,50 @@ from tkdeft.windows.draw import DSvgDraw
2
2
  from tkdeft.windows.canvas import DCanvas
3
3
  from tkdeft.windows.drawwidget import DDrawWidget
4
4
 
5
+ from .designs.entry import entry
5
6
 
6
7
  class FluEntryDraw(DSvgDraw):
7
8
  def create_roundrect(self,
8
9
  x1, y1, x2, y2, radius, radiusy=None, temppath=None,
9
- fill="transparent", outline="black", outline2="black", width=1
10
+ fill="transparent", fill_opacity=1,
11
+ stop1="0.93", outline="black", outline_opacity=1,
12
+ stop2="0.94", outline2=None, outline2_opacity=1,
13
+ width=1
10
14
  ):
11
15
  if radiusy:
12
16
  _rx = radius
13
17
  _ry = radiusy
14
18
  else:
15
19
  _rx, _ry = radius, radius
16
- drawing = self.create_drawing(x2 - x1, y2 - y1, temppath=temppath)
17
- border = drawing[1].linearGradient(start=(x1, y1), end=(x1, y2), id="DButton.Border")
18
- border.add_stop_color("0%", outline)
19
- border.add_stop_color("90%", outline)
20
- border.add_stop_color("100%", outline2)
21
- drawing[1].defs.add(border)
20
+ drawing = self.create_drawing(x2 - x1, y2 - y1, temppath=temppath, fill="none")
21
+ if outline2:
22
+ border = drawing[1].linearGradient(start=(x1, y1 + 1), end=(x1, y2 - 1), id="DButton.Border",
23
+ gradientUnits="userSpaceOnUse")
24
+ border.add_stop_color(stop1, outline, outline_opacity)
25
+ border.add_stop_color(stop2, outline2, outline2_opacity)
26
+ drawing[1].defs.add(border)
27
+ stroke = f"url(#{border.get_id()})"
28
+ stroke_opacity = 1
29
+ else:
30
+ stroke = outline
31
+ stroke_opacity = outline_opacity
32
+
22
33
  drawing[1].add(
23
34
  drawing[1].rect(
24
- (x1, y1), (x2 - x1, y2 - y1), _rx, _ry,
25
- fill=fill, stroke_width=width,
26
- stroke=f"url(#{border.get_id()})",
27
- ),
35
+ (x1 + 1, y1 + 1), (x2 - x1 - 2, y2 - y1 - 2), _rx, _ry,
36
+ id="Base",
37
+ fill=fill, fill_opacity=fill_opacity,
38
+ )
28
39
  )
29
- """print((x1, y1), (x2 - x1, y2 - y1))
30
40
  drawing[1].add(
31
- drawing[1].line(
32
- (x1 + radius / 2, y2 - width), (x2 - radius / 2, y2 - width,)
41
+ drawing[1].rect(
42
+ (x1 + 0.5, y1 + 0.5), (x2 - x1 - 1, y2 - y1 - 1), _rx, _ry,
43
+ id="Base",
44
+ fill="white", fill_opacity="0",
45
+ stroke=stroke, stroke_width=width, stroke_opacity=stroke_opacity,
33
46
  )
34
47
  )
35
- print((x1 + radius / 2, y2 - width), (x2 - radius / 2, y2 - width,))"""
48
+ #print("FluEntry", drawing[0])
36
49
  drawing[1].save()
37
50
  return drawing[0]
38
51
 
@@ -42,11 +55,15 @@ class FluEntryCanvas(DCanvas):
42
55
 
43
56
  def create_round_rectangle(self,
44
57
  x1, y1, x2, y2, r1, r2=None, temppath=None,
45
- fill="transparent", outline="black", outline2="black", width=1
58
+ fill="transparent", fill_opacity=1, stop1="0.93", stop2="0.94",
59
+ outline="black", outline2="black", outline_opacity=1, outline2_opacity=1,
60
+ width=1
46
61
  ):
47
62
  self._img = self.svgdraw.create_roundrect(
48
63
  x1, y1, x2, y2, r1, r2, temppath=temppath,
49
- fill=fill, outline=outline, outline2=outline2, width=width
64
+ fill=fill, fill_opacity=fill_opacity, stop1=stop1, stop2=stop2,
65
+ outline=outline, outline2=outline2, outline_opacity=outline_opacity, outline2_opacity=outline2_opacity,
66
+ width=width
50
67
  )
51
68
  self._tkimg = self.svgdraw.create_tksvg_image(self._img)
52
69
  return self.create_image(x1, y1, anchor="nw", image=self._tkimg)
@@ -85,9 +102,8 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
85
102
  state=state,
86
103
  )
87
104
 
88
- if font is None:
89
- from tkdeft.utility.fonts import SegoeFont
90
- self.attributes.font = SegoeFont()
105
+ from .defs import set_default_font
106
+ set_default_font(font, self.attributes)
91
107
 
92
108
  def _init(self, mode):
93
109
  from easydict import EasyDict
@@ -98,8 +114,9 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
98
114
  "state": "normal",
99
115
 
100
116
  "rest": {},
101
- "focus": {},
102
- "disabled": {}
117
+ "hover": {},
118
+ "pressed": {},
119
+ "disabled": {},
103
120
  }
104
121
  )
105
122
 
@@ -108,52 +125,65 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
108
125
  def _draw(self, event=None):
109
126
  super()._draw(event)
110
127
 
128
+ width = self.winfo_width()
129
+ height = self.winfo_height()
130
+
111
131
  self.delete("all")
112
132
 
113
133
  self.entry.configure(font=self.attributes.font)
114
134
 
115
135
  state = self.dcget("state")
116
136
 
137
+ _dict = None
138
+
117
139
  if state == "normal":
118
- self.entry.configure(state="normal")
119
140
  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
141
+ _dict = self.attributes.pressed
126
142
  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
143
+ if self.enter:
144
+ _dict = self.attributes.hover
145
+ else:
146
+ _dict = self.attributes.rest
147
+ self.entry.configure(state="normal")
133
148
  else:
149
+ _dict = self.attributes.disabled
134
150
  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
141
151
 
142
- self.entry.configure(background=_back_color, insertbackground=_text_color, foreground=_text_color, disabledbackground=_back_color, disabledforeground=_text_color)
152
+ _stop1 = _dict.stop1
153
+ _stop2 = _dict.stop2
154
+ _back_color = _dict.back_color
155
+ _back_opacity = _dict.back_opacity
156
+ _border_color = _dict.border_color
157
+ _border_color_opacity = _dict.border_color_opacity
158
+ _border_color2 = _dict.border_color2
159
+ _border_color2_opacity = _dict.border_color2_opacity
160
+ _border_width = _dict.border_width
161
+ _radius = _dict.radius
162
+ _text_color = _dict.text_color
163
+ _underline_fill = _dict.underline_fill
164
+ _underline_width = _dict.underline_width
165
+
166
+ self.entry.configure(background=_back_color, insertbackground=_text_color, foreground=_text_color,
167
+ disabledbackground=_back_color, disabledforeground=_text_color)
143
168
 
144
169
  self.element_border = self.create_round_rectangle(
145
- 0, 0, self.winfo_width(), self.winfo_height(), _radius, temppath=self.temppath,
146
- fill=_back_color, outline=_border_color, outline2=_border_color2, width=_border_width
170
+ 0, 0, width, height, _radius, temppath=self.temppath,
171
+ fill=_back_color, fill_opacity=_back_opacity, stop1=_stop1, stop2=_stop2,
172
+ outline=_border_color, outline_opacity=_border_color_opacity, outline2=_border_color2,
173
+ outline2_opacity=_border_color2_opacity,
174
+ width=_border_width
147
175
  )
148
176
 
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
- )
177
+ if _underline_fill:
178
+ self.element_line = self.create_line(
179
+ _radius / 3 + _border_width, self.winfo_height() - _radius / 3,
180
+ self.winfo_width() - _radius / 3 - _border_width * 2, self.winfo_height() - _radius / 3,
181
+ width=_underline_width, fill=_underline_fill
182
+ )
153
183
 
154
184
  self.element_text = self.create_window(
155
- self.winfo_width() / 2, self.winfo_height() / 2,
156
- window=self.entry,
185
+ _radius/2+_border_width, _radius/2+_border_width,
186
+ window=self.entry, anchor="nw",
157
187
  width=self.winfo_width() - _border_width * 2 - _radius,
158
188
  height=self.winfo_height() - _border_width * 2 - _radius
159
189
  )
@@ -175,58 +205,92 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
175
205
  else:
176
206
  self._light()
177
207
 
178
- def _light(self):
208
+ def _theme(self, mode):
209
+ r = entry(mode, "rest")
210
+ h = entry(mode, "hover")
211
+ p = entry(mode, "pressed")
212
+ d = entry(mode, "disabled")
179
213
  self.dconfigure(
180
214
  rest={
181
- "back_color": "#ffffff",
182
- "border_color": "#e5e5e5",
183
- "border_color2": "#8d8d8d",
184
- "border_width": 1,
185
- "radius": 6,
186
- "text_color": "#646464",
187
- },
188
- focus={
189
- "back_color": "#ffffff",
190
- "border_color": "#e5e5e5",
191
- "border_color2": "#005fb8",
192
- "border_width": 2,
193
- "radius": 6,
194
- "text_color": "#636363",
215
+ "back_color": r["back_color"],
216
+ "back_opacity": r["back_opacity"],
217
+
218
+ "stop1": r["stop1"],
219
+ "border_color": r["border_color"],
220
+ "border_color_opacity": r["border_color_opacity"],
221
+
222
+ "stop2": r["stop2"],
223
+ "border_color2": r["border_color2"],
224
+ "border_color2_opacity": r["border_color2_opacity"],
225
+
226
+ "border_width": r["border_width"],
227
+ "radius": r["radius"],
228
+ "text_color": r["text_color"],
229
+
230
+ "underline_fill": r["underline_fill"],
231
+ "underline_width": r["underline_width"]
195
232
  },
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",
203
- }
204
- )
233
+ hover={
234
+ "back_color": h["back_color"],
235
+ "back_opacity": h["back_opacity"],
205
236
 
206
- def _dark(self):
207
- self.dconfigure(
208
- rest={
209
- "back_color": "#272727",
210
- "border_color": "#2c2c2c",
211
- "border_color2": "#979797",
212
- "border_width": 1,
213
- "radius": 6,
214
- "text_color": "#ffffff",
237
+ "stop1": h["stop1"],
238
+ "border_color": h["border_color"],
239
+ "border_color_opacity": h["border_color_opacity"],
240
+
241
+ "stop2": h["stop2"],
242
+ "border_color2": h["border_color2"],
243
+ "border_color2_opacity": h["border_color2_opacity"],
244
+
245
+ "border_width": h["border_width"],
246
+ "radius": h["radius"],
247
+ "text_color": h["text_color"],
248
+
249
+ "underline_fill": h["underline_fill"],
250
+ "underline_width": r["underline_width"]
215
251
  },
216
- focus={
217
- "back_color": "#1d1d1d",
218
- "border_color": "#272727",
219
- "border_color2": "#60cdff",
220
- "border_width": 2,
221
- "radius": 6,
222
- "text_color": "#ffffff",
252
+ pressed={
253
+ "back_color": p["back_color"],
254
+ "back_opacity": p["back_opacity"],
255
+
256
+ "stop1": p["stop1"],
257
+ "border_color": p["border_color"],
258
+ "border_color_opacity": p["border_color_opacity"],
259
+
260
+ "stop2": p["stop2"],
261
+ "border_color2": p["border_color2"],
262
+ "border_color2_opacity": p["border_color2_opacity"],
263
+
264
+ "border_width": p["border_width"],
265
+ "radius": p["radius"],
266
+ "text_color": p["text_color"],
267
+
268
+ "underline_fill": p["underline_fill"],
269
+ "underline_width": r["underline_width"]
223
270
  },
224
271
  disabled={
225
- "back_color": "#2a2a2a",
226
- "border_color": "#303030",
227
- "border_color2": "#303030",
228
- "border_width": 1,
229
- "radius": 6,
230
- "text_color": "#787878",
272
+ "back_color": d["back_color"],
273
+ "back_opacity": r["back_opacity"],
274
+
275
+ "stop1": d["stop1"],
276
+ "border_color": d["border_color"],
277
+ "border_color_opacity": d["border_color_opacity"],
278
+
279
+ "stop2": d["stop2"],
280
+ "border_color2": d["border_color2"],
281
+ "border_color2_opacity": d["border_color2_opacity"],
282
+
283
+ "border_width": d["border_width"],
284
+ "radius": d["radius"],
285
+ "text_color": d["text_color"],
286
+
287
+ "underline_fill": d["underline_fill"],
288
+ "underline_width": r["underline_width"]
231
289
  }
232
290
  )
291
+
292
+ def _light(self):
293
+ self._theme("light")
294
+
295
+ def _dark(self):
296
+ self._theme("dark")