tkfluent 0.0.3__py3-none-any.whl → 0.0.5__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/entry.py CHANGED
@@ -2,30 +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("85%", 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
+
33
+ drawing[1].add(
34
+ drawing[1].rect(
35
+ (x1 + 1, y1 + 1), (x2 - x1 - 2, y2 - y1 - 2), _rx, _ry,
36
+ id="Base",
37
+ fill=fill, fill_opacity=fill_opacity,
38
+ )
39
+ )
22
40
  drawing[1].add(
23
41
  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()})",
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,
27
46
  )
28
47
  )
48
+ #print("FluEntry", drawing[0])
29
49
  drawing[1].save()
30
50
  return drawing[0]
31
51
 
@@ -35,11 +55,15 @@ class FluEntryCanvas(DCanvas):
35
55
 
36
56
  def create_round_rectangle(self,
37
57
  x1, y1, x2, y2, r1, r2=None, temppath=None,
38
- 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
39
61
  ):
40
62
  self._img = self.svgdraw.create_roundrect(
41
63
  x1, y1, x2, y2, r1, r2, temppath=temppath,
42
- 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
43
67
  )
44
68
  self._tkimg = self.svgdraw.create_tksvg_image(self._img)
45
69
  return self.create_image(x1, y1, anchor="nw", image=self._tkimg)
@@ -55,6 +79,7 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
55
79
  cursor="xterm",
56
80
  textvariable=None,
57
81
  mode="light",
82
+ state="normal",
58
83
  **kwargs):
59
84
  self._init(mode)
60
85
 
@@ -73,9 +98,12 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
73
98
 
74
99
  self.bind("<FocusIn>", self._event_focus_in, add="+")
75
100
 
76
- if font is None:
77
- from tkdeft.utility.fonts import SegoeFont
78
- self.attributes.font = SegoeFont()
101
+ self.dconfigure(
102
+ state=state,
103
+ )
104
+
105
+ from .defs import set_default_font
106
+ set_default_font(font, self.attributes)
79
107
 
80
108
  def _init(self, mode):
81
109
  from easydict import EasyDict
@@ -83,11 +111,12 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
83
111
  self.attributes = EasyDict(
84
112
  {
85
113
  "font": None,
114
+ "state": "normal",
86
115
 
87
116
  "rest": {},
88
-
89
- "focus": {}
90
-
117
+ "hover": {},
118
+ "pressed": {},
119
+ "disabled": {},
91
120
  }
92
121
  )
93
122
 
@@ -96,35 +125,65 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
96
125
  def _draw(self, event=None):
97
126
  super()._draw(event)
98
127
 
128
+ width = self.winfo_width()
129
+ height = self.winfo_height()
130
+
99
131
  self.delete("all")
100
132
 
101
133
  self.entry.configure(font=self.attributes.font)
102
134
 
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
110
- 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
135
+ state = self.dcget("state")
136
+
137
+ _dict = None
117
138
 
118
- self.entry.configure(background=_back_color, insertbackground=_text_color, foreground=_text_color)
139
+ if state == "normal":
140
+ if self.isfocus:
141
+ _dict = self.attributes.pressed
142
+ else:
143
+ if self.enter:
144
+ _dict = self.attributes.hover
145
+ else:
146
+ _dict = self.attributes.rest
147
+ self.entry.configure(state="normal")
148
+ else:
149
+ _dict = self.attributes.disabled
150
+ self.entry.configure(state="disabled")
151
+
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)
119
168
 
120
169
  self.element_border = self.create_round_rectangle(
121
- 0, 0, self.winfo_width(), self.winfo_height(), _radius, temppath=self.temppath,
122
- 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
123
175
  )
124
176
 
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
+ )
183
+
125
184
  self.element_text = self.create_window(
126
- self.winfo_width() / 2, self.winfo_height() / 2,
127
- window=self.entry,
185
+ _radius/2+_border_width, _radius/2+_border_width,
186
+ window=self.entry, anchor="nw",
128
187
  width=self.winfo_width() - _border_width * 2 - _radius,
129
188
  height=self.winfo_height() - _border_width * 2 - _radius
130
189
  )
@@ -146,42 +205,92 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
146
205
  else:
147
206
  self._light()
148
207
 
149
- 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")
150
213
  self.dconfigure(
151
214
  rest={
152
- "back_color": "#ffffff",
153
- "border_color": "#e5e5e5",
154
- "border_color2": "#8d8d8d",
155
- "border_width": 1,
156
- "radius": 6,
157
- "text_color": "#646464",
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"]
158
232
  },
159
- focus={
160
- "back_color": "#ffffff",
161
- "border_color": "#e5e5e5",
162
- "border_color2": "#005fb8",
163
- "border_width": 2,
164
- "radius": 6,
165
- "text_color": "#636363",
166
- }
167
- )
233
+ hover={
234
+ "back_color": h["back_color"],
235
+ "back_opacity": h["back_opacity"],
168
236
 
169
- def _dark(self):
170
- self.dconfigure(
171
- rest={
172
- "back_color": "#272727",
173
- "border_color": "#2c2c2c",
174
- "border_color2": "#979797",
175
- "border_width": 1,
176
- "radius": 6,
177
- "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"]
178
251
  },
179
- focus={
180
- "back_color": "#1d1d1d",
181
- "border_color": "#272727",
182
- "border_color2": "#60cdff",
183
- "border_width": 2,
184
- "radius": 6,
185
- "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"]
270
+ },
271
+ disabled={
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"]
186
289
  }
187
290
  )
291
+
292
+ def _light(self):
293
+ self._theme("light")
294
+
295
+ def _dark(self):
296
+ self._theme("dark")
tkflu/frame.py CHANGED
@@ -1,11 +1,14 @@
1
1
  from tkdeft.windows.draw import DSvgDraw
2
2
  from tkdeft.windows.canvas import DCanvas
3
3
 
4
+ from .designs.frame import frame
5
+
4
6
 
5
7
  class FluFrameDraw(DSvgDraw):
6
8
  def create_roundrect(self,
7
9
  x1, y1, x2, y2, radius, radiusy=None, temppath=None,
8
- fill="transparent", outline="black", outline2="black", width=1
10
+ fill="transparent", #fill_opacity=1,
11
+ outline="black", outline_opacity=1, width=1
9
12
  ):
10
13
  if radiusy:
11
14
  _rx = radius
@@ -13,15 +16,63 @@ class FluFrameDraw(DSvgDraw):
13
16
  else:
14
17
  _rx, _ry = radius, radius
15
18
  drawing = self.create_drawing(x2 - x1, y2 - y1, temppath=temppath)
16
- border = drawing[1].linearGradient(start=(x1, y1), end=(x1, y2), id="DButton.Border")
17
- border.add_stop_color("0%", outline)
18
- border.add_stop_color("100%", outline2)
19
- drawing[1].defs.add(border)
19
+ filter1 = drawing[1].defs.add(
20
+ drawing[1].filter(id="filter", start=(0, 0), size=(x2 - x1, y2 - y1), filterUnits="userSpaceOnUse",
21
+ color_interpolation_filters="sRGB")
22
+ )
23
+
24
+ filter1.feFlood(flood_opacity="0", result="BackgroundImageFix")
25
+ filter1.feColorMatrix("SourceAlpha", type="matrix", values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0",
26
+ result="hardAlpha")
27
+ filter1.feOffset(dx="0", dy="2")
28
+ filter1.feGaussianBlur(stdDeviation="1.33333")
29
+ filter1.feComposite(in2="hardAlpha", operator="out", k2="-1", k3="1")
30
+ filter1.feColorMatrix(type="matrix", values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.039 0")
31
+ filter1.feBlend(mode="normal", in2="BackgroundImageFix", result="effect_dropShadow_1")
32
+ filter1.feBlend(mode="normal", in2="effect_dropShadow_1", result="shape")
33
+
34
+ """if outline2:
35
+ border = drawing[1].linearGradient(start=(x1, y1), end=(x1, y2), id="DButton.Border")
36
+ border.add_stop_color("0%", outline)
37
+ border.add_stop_color("100%", outline2)
38
+ drawing[1].defs.add(border)
39
+ _border = f"url(#{border.get_id()})"
40
+ else:
41
+ _border = outline"""
42
+
43
+ """
44
+ <rect id="Surface / Card Surface" rx="-0.500000" width="159.000000" height="79.000000" transform="translate(3.500000 1.500000)" fill="#FFFFFF" fill-opacity="0"/>
45
+ """
46
+ """drawing[1].add(
47
+ drawing[1].rect(
48
+ rx="-0.500000",
49
+ size=(x2 - x1 - 7, y2 - y1 - 7),
50
+ transform="translate(3.500000 1.500000)",
51
+ fill="#FFFFFF",
52
+ fill_opacity="0"
53
+ )
54
+ )
55
+ drawing[1].add(
56
+ drawing[1].rect(
57
+ (4, 2), (x2 - x1 - 8, y2 - y1 - 8), _rx, _ry,
58
+ fill="#FFFFFF",
59
+ fill_opacity="0.700000",
60
+ )
61
+ )
62
+ group = drawing[1].g(filter="url(#filter)", style="mix-blend-mode:multiply")
63
+ group.add(
64
+ drawing[1].rect(
65
+ (4, 2), (x2 - x1 - 8, y2 - y1 - 8), _rx, _ry,
66
+ fill="#FFFFFF",
67
+ fill_opacity="1",
68
+ )
69
+ )"""
20
70
  drawing[1].add(
21
71
  drawing[1].rect(
22
72
  (x1, y1), (x2 - x1, y2 - y1), _rx, _ry,
23
- fill=fill, stroke_width=width,
24
- stroke=f"url(#{border.get_id()})",
73
+ fill=fill, #fill_opacity=fill_opacity,
74
+ stroke_width=width,
75
+ stroke=outline, stroke_opacity=outline_opacity
25
76
  )
26
77
  )
27
78
  drawing[1].save()
@@ -51,11 +102,13 @@ class FluFrameCanvas(DCanvas):
51
102
 
52
103
  def create_round_rectangle(self,
53
104
  x1, y1, x2, y2, r1, r2=None, temppath=None,
54
- fill="transparent", outline="black", outline2="black", width=1
105
+ fill="transparent", #fill_opacity=1,
106
+ outline="black", outline_opacity=1, width=1
55
107
  ):
56
108
  self._img = self.svgdraw.create_roundrect(
57
109
  x1, y1, x2, y2, r1, r2, temppath=temppath,
58
- fill=fill, outline=outline, outline2=outline2, width=width
110
+ fill=fill, #fill_opacity=fill_opacity,
111
+ outline=outline, outline_opacity=outline_opacity, width=width
59
112
  )
60
113
  self._tkimg = self.svgdraw.create_tksvg_image(self._img)
61
114
  return self.create_image(x1, y1, anchor="nw", image=self._tkimg)
@@ -100,8 +153,9 @@ class FluFrame(Frame, DObject):
100
153
  self.attributes = EasyDict(
101
154
  {
102
155
  "back_color": None,
156
+ #"back_opacity": None,
103
157
  "border_color": None,
104
- "border_color2": None,
158
+ "border_color_opacity": None,
105
159
  "border_width": None,
106
160
  "radius": None,
107
161
  }
@@ -125,41 +179,26 @@ class FluFrame(Frame, DObject):
125
179
  else:
126
180
  self._light()
127
181
 
128
- def _light(self):
182
+ def _theme(self, mode, style):
183
+ n = frame(mode, style)
129
184
  self.dconfigure(
130
- back_color="#f9f9f9",
131
- border_color="#ebebeb",
132
- border_color2="#e4e4e4",
133
- border_width=1.5,
134
- radius=6,
185
+ back_color=n["back_color"],
186
+ border_color=n["border_color"],
187
+ border_color_opacity=n["border_color_opacity"],
188
+ border_width=n["border_width"],
189
+ radius=n["radius"],
135
190
  )
136
191
 
192
+ def _light(self):
193
+ self._theme("light", "standard")
194
+
137
195
  def _light_popupmenu(self):
138
- self.dconfigure(
139
- back_color="#f9f9f9",
140
- border_color="#4d5056",
141
- border_color2="#4d5056",
142
- border_width=1.5,
143
- radius=8,
144
- )
196
+ self._theme("light", "popupmenu")
145
197
 
146
198
  def _dark(self):
147
- self.dconfigure(
148
- back_color="#242424",
149
- border_color="#303030",
150
- border_color2="#282828",
151
- border_width=1.5,
152
- radius=6,
153
- )
154
-
199
+ self._theme("dark", "standard")
155
200
  def _dark_popupmenu(self):
156
- self.dconfigure(
157
- back_color="#242424",
158
- border_color="#4d5056",
159
- border_color2="#4d5056",
160
- border_width=1.5,
161
- radius=8,
162
- )
201
+ self._theme("dark", "popupmenu")
163
202
 
164
203
  def pack_info(self):
165
204
  return self.canvas.pack_info()
@@ -231,21 +270,24 @@ class FluFrame(Frame, DObject):
231
270
  place = place_configure
232
271
 
233
272
  def _draw(self, event=None):
273
+
234
274
  self.canvas.delete("all")
235
275
  self.canvas.config(background=self.canvas.master.cget("background"))
236
- self.config(background=self.attributes.back_color)
237
-
238
276
  _back_color = self.attributes.back_color
277
+ #_back_opacity = self.attributes.back_opacity
239
278
  _border_color = self.attributes.border_color
240
- _border_color2 = self.attributes.border_color2
279
+ _border_color_opacity = self.attributes.border_color_opacity
241
280
  _border_width = self.attributes.border_width
242
281
  _radius = self.attributes.radius
243
282
 
244
283
  self.element1 = self.canvas.create_round_rectangle(
245
284
  0, 0, self.canvas.winfo_width(), self.canvas.winfo_height(), _radius, temppath=self.temppath,
246
- fill=_back_color, outline=_border_color, outline2=_border_color2, width=_border_width
285
+ fill=_back_color, #fill_opacity=_back_opacity,
286
+ outline=_border_color, outline_opacity=_border_color_opacity, width=_border_width
247
287
  )
248
288
 
289
+ self.config(background=_back_color)
290
+
249
291
  self.element2 = self.canvas.create_window(
250
292
  self.canvas.winfo_width() / 2, self.canvas.winfo_height() / 2,
251
293
  window=self,
@@ -255,4 +297,3 @@ class FluFrame(Frame, DObject):
255
297
 
256
298
  def _event_configure(self, event=None):
257
299
  self._draw(event)
258
-
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"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"
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/label.py CHANGED
@@ -17,9 +17,8 @@ class FluLabel(DDrawWidget):
17
17
  text=text,
18
18
  )
19
19
 
20
- if font is None:
21
- from tkdeft.utility.fonts import SegoeFont
22
- self.attributes.font = SegoeFont()
20
+ from .defs import set_default_font
21
+ set_default_font(font, self.attributes)
23
22
 
24
23
  def _init(self, mode):
25
24
 
tkflu/menu.py CHANGED
@@ -12,8 +12,9 @@ class FluMenu(FluPopupMenu):
12
12
  self.attributes = EasyDict(
13
13
  {
14
14
  "back_color": None,
15
+ "back_opacity": None,
15
16
  "border_color": None,
16
- "border_color2": None,
17
+ "border_color_opacity": None,
17
18
  "border_width": None,
18
19
  "radius": None,
19
20
 
@@ -45,10 +46,10 @@ class FluMenu(FluPopupMenu):
45
46
  self.window.wm_withdraw()
46
47
 
47
48
  else:
48
- def empty():
49
- pass
49
+ def c():
50
+ self.window.wm_withdraw()
50
51
 
51
- command = empty
52
+ command = c
52
53
  if "id" in kwargs:
53
54
  id = kwargs.pop("id")
54
55
  else:
@@ -61,5 +62,43 @@ class FluMenu(FluPopupMenu):
61
62
  if hasattr(widget, "theme"):
62
63
  widget.theme(style=style)
63
64
 
65
+ widget.pack(side="top", fill="x", padx=1, pady=(1, 0))
66
+ self.dcget("actions")[id] = widget
67
+
68
+ def add_cascade(self, custom_widget=None, width=40, menu=None, **kwargs):
69
+ if custom_widget:
70
+ widget = custom_widget(self)
71
+ else:
72
+ from .button import FluButton
73
+ widget = FluButton(self, width=width)
74
+ if "label" in kwargs:
75
+ label = kwargs.pop("label")
76
+ else:
77
+ label = ""
78
+ if "style" in kwargs:
79
+ style = kwargs.pop("style")
80
+ else:
81
+ style = "menu"
82
+ if "id" in kwargs:
83
+ id = kwargs.pop("id")
84
+ else:
85
+ id = widget._w
86
+
87
+ def command():
88
+ print(menu._w)
89
+ menu.focus_set()
90
+
91
+ menu.popup(widget.winfo_rootx()+widget.winfo_width()+100, widget.winfo_rooty())
92
+ menu.window.deiconify()
93
+ menu.window.attributes("-topmost")
94
+
95
+ if hasattr(widget, "dconfigure"):
96
+ widget.dconfigure(text=label, command=command)
97
+ else:
98
+ if hasattr(widget, "configure"):
99
+ widget.configure(text=label, command=command)
100
+ if hasattr(widget, "theme"):
101
+ widget.theme(style=style)
102
+
64
103
  widget.pack(side="top", fill="x", padx=1, pady=(1, 0))
65
104
  self.dcget("actions")[id] = widget