tkfluent 0.1.2__py3-none-any.whl → 0.1.3__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/__init__.py CHANGED
@@ -1,9 +1,11 @@
1
- """
1
+ """
2
2
 
3
3
  Fluent设计的tkinter组件库(模板)
4
4
 
5
5
  -------------
6
6
  作者:XiangQinxi
7
+
8
+ 贡献者:totowang-hhh
7
9
  -------------
8
10
  """
9
11
 
tkflu/__main__.py CHANGED
@@ -2,9 +2,9 @@ from tkflu import *
2
2
  from tkinter import *
3
3
  from tkinter.font import *
4
4
 
5
- orange_primary_color()
5
+ purple_primary_color()
6
6
  set_animation_steps(10)
7
- set_animation_step_time(20)
7
+ set_animation_step_time(10)
8
8
 
9
9
  def togglestate():
10
10
  if button1.dcget("state") == NORMAL:
tkflu/button.py CHANGED
@@ -4,13 +4,39 @@ from tkdeft.windows.drawwidget import DDrawWidget
4
4
 
5
5
  from .designs.button import button
6
6
 
7
+ from typing import Union
8
+
7
9
 
8
10
  class FluButtonDraw(DSvgDraw):
9
11
  def create_roundrect(self,
10
- x1, y1, x2, y2, radius, radiusy=None, temppath=None,
11
- fill="transparent", fill_opacity=1,
12
- outline="black", outline2=None, outline_opacity=1, outline2_opacity=1, width=1,
13
- ):
12
+ x1: Union[int, float], y1: Union[int, float], x2: Union[int, float], y2: Union[int, float],
13
+ radius: Union[int, float], radiusy: Union[int, float] = None, temppath: Union[str, None] = None,
14
+ fill: Union[str, tuple]="transparent", fill_opacity: Union[int, float]=1,
15
+ outline: Union[str, tuple] = "black", outline2: Union[str, tuple] = None,
16
+ outline_opacity: Union[int, float] = 1, outline2_opacity: Union[int, float] = 1, width: Union[int, float] = 1,
17
+ ) -> str:
18
+ """
19
+ 用于生成svg圆角矩形图片,图片默认将会保存至临时文件夹。
20
+
21
+ Parameters:
22
+ x1: 第一个x轴的坐标
23
+ y1: 第一个y轴的坐标
24
+ x2: 第二个x轴的坐标,与x1连起来
25
+ y2: 第二个y轴的坐标,与y1连起来
26
+ radius: 圆角大小
27
+ radiusy: 圆角大小(y轴方向),如果不设置,将默认为参数radius的值
28
+ temppath: 临时文件地址,如果你不知道,就别设置
29
+ fill: 背景颜色
30
+ fill_opacity: 背景透明度
31
+ outline: 边框颜色
32
+ outline2: 边框颜色2(渐变),如果取了这个值,边框将会变为渐变,从左到右,outline为第一个渐变色,outline2为第二个渐变色
33
+ outline_opacity: 边框透明度
34
+ outline2_opacity: 第二个边框渐变颜色的透明度,如果outline没有设置,则这个值不会被用到
35
+ width: 边框宽度
36
+
37
+ Returns:
38
+ svg图片保存地址
39
+ """
14
40
  if radiusy:
15
41
  _rx = radius
16
42
  _ry = radiusy
@@ -19,9 +45,9 @@ class FluButtonDraw(DSvgDraw):
19
45
  drawing = self.create_drawing(x2 - x1, y2 - y1, temppath=temppath)
20
46
  if outline2:
21
47
  border = drawing[1].linearGradient(start=(x1, y1), end=(x1, y2), id="DButton.Border",
22
- gradientUnits="userSpaceOnUse")
23
- border.add_stop_color("0.9", outline, outline_opacity)
24
- border.add_stop_color("1", outline2, outline2_opacity)
48
+ gradientUnits="userSpaceOnUse") # 渐变色配置
49
+ border.add_stop_color("0.9", outline, outline_opacity) # 第一个渐变色的位置、第一个渐变色、第一个渐变色的透明度
50
+ border.add_stop_color("1", outline2, outline2_opacity) # 第二个渐变色的位置、第二个渐变色、第二个渐变色的透明度
25
51
  drawing[1].defs.add(border)
26
52
  stroke = f"url(#{border.get_id()})"
27
53
  stroke_opacity = 1
@@ -41,41 +67,80 @@ class FluButtonDraw(DSvgDraw):
41
67
 
42
68
 
43
69
  class FluButtonCanvas(DCanvas):
44
- draw = FluButtonDraw
70
+
71
+ draw = FluButtonDraw # 设置svg绘图引擎
45
72
 
46
73
  def create_round_rectangle(self,
47
- x1, y1, x2, y2, r1, r2=None, temppath=None,
48
- fill="transparent", fill_opacity=1,
49
- outline="black", outline2="black", outline_opacity=1, outline2_opacity=1,
50
- width=1,
51
- ):
74
+ x1: Union[int, float], y1: Union[int, float], x2: Union[int, float], y2: Union[int, float],
75
+ r1: Union[int, float], r2: Union[int, float] = None, temppath: Union[str, None] = None,
76
+ fill: Union[str, tuple]="transparent", fill_opacity: Union[int, float] = 1,
77
+ outline: Union[str, tuple] = "black", outline2: Union[str, tuple] = "black",
78
+ outline_opacity: Union[int, float] = 1, outline2_opacity: Union[int, float] = 1,
79
+ width: Union[int, float] = 1, *args, **kwargs
80
+ ) -> int:
81
+ """
82
+ 在画布上创建个圆角矩形
83
+
84
+ Parameters:
85
+ x1: 第一个x轴的坐标
86
+ y1: 第一个y轴的坐标
87
+ x2: 第二个x轴的坐标,与x1连起来
88
+ y2: 第二个y轴的坐标,与y1连起来
89
+ r1: 圆角大小
90
+ r2: 圆角大小(y轴方向),如果不设置,将默认为参数r1的值
91
+ temppath: 临时文件地址,如果你不知道,就别设置
92
+ fill: 背景颜色
93
+ fill_opacity: 背景透明度
94
+ outline: 边框颜色
95
+ outline2: 边框颜色2(渐变),如果取了这个值,边框将会变为渐变,从左到右,outline为第一个渐变色,outline2为第二个渐变色
96
+ outline_opacity: 边框透明度
97
+ outline2_opacity: 第二个边框渐变颜色的透明度,如果outline没有设置,则这个值不会被用到
98
+ width: 边框宽度
99
+
100
+ Returns: svg图片保存地址
101
+ """
52
102
  self._img = self.svgdraw.create_roundrect(
53
103
  x1, y1, x2, y2, r1, r2, temppath=temppath,
54
104
  fill=fill, fill_opacity=fill_opacity,
55
105
  outline=outline, outline2=outline2, outline_opacity=outline_opacity, outline2_opacity=outline2_opacity,
56
106
  width=width,
57
- )
58
- self._tkimg = self.svgdraw.create_tksvg_image(self._img)
59
- return self.create_image(x1, y1, anchor="nw", image=self._tkimg)
107
+ ) # 创建个svg圆角矩形图片
108
+ self._tkimg = self.svgdraw.create_tksvg_image(self._img) # 用tksvg读取svg图片
109
+ return self.create_image(x1, y1, anchor="nw", image=self._tkimg, *args, **kwargs) # 在画布上创建个以svg图片为图片的元件
60
110
 
61
- create_roundrect = create_round_rectangle
111
+ create_roundrect = create_round_rectangle # 缩写
62
112
 
63
113
 
64
114
  from .constants import MODE, STATE, BUTTONSTYLE
65
115
  from .tooltip import FluToolTipBase
66
116
  from .designs.gradient import FluGradient
117
+ from tkinter import Event
118
+ from tkinter.font import Font
67
119
 
68
120
  class FluButton(FluButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
69
121
  def __init__(self, *args,
70
- text="",
71
- width=120,
72
- height=32,
73
- command=None,
74
- font=None,
122
+ text: Union[str, int, float]= "",
123
+ width: Union[int, float] = 120,
124
+ height: Union[int, float] = 32,
125
+ command: callable = None,
126
+ font: Union[Font, tuple] = None,
75
127
  mode: MODE = "light",
76
128
  style: BUTTONSTYLE = "standard",
77
129
  state: STATE = "normal",
78
- **kwargs):
130
+ **kwargs) -> None:
131
+ """
132
+ 按钮组件
133
+
134
+ Parameters:
135
+ text: 按钮的标签文本
136
+ width: 默认宽带
137
+ height: 默认高度
138
+ command: 点击时出发的事件
139
+ font: 自定义标签字体
140
+ mode: 按钮深浅主题,参考tkflu.constants.MODE
141
+ style: 按钮样式,参考tkflu.constants.BUTTONSTYLE
142
+ state: 按钮的状态,参考tkflu.constants.STATE
143
+ """
79
144
  self._init(mode, style)
80
145
 
81
146
  super().__init__(*args, width=width, height=height, **kwargs)
@@ -101,6 +166,14 @@ class FluButton(FluButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
101
166
 
102
167
  def _init(self, mode: MODE, style: BUTTONSTYLE):
103
168
 
169
+ """
170
+ 初始化按钮,正常情况下无需在程序中调用
171
+
172
+ Parameters:
173
+ mode: 按钮深浅主题,参考tkflu.constants.MODE
174
+ style: 按钮样式,参考tkflu.constants.BUTTONSTYLE
175
+ """
176
+
104
177
  from easydict import EasyDict
105
178
 
106
179
  self.enter = False
@@ -122,13 +195,17 @@ class FluButton(FluButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
122
195
 
123
196
  self.theme(mode=mode, style=style)
124
197
 
125
- def _draw(self, event=None, tempcolor: dict = None):
198
+ def _draw(self, event: Union[Event, None] = None, tempcolor: Union[dict, None] = None):
199
+ """
200
+
201
+ Parameters:
202
+ 绘制按钮
203
+ """
126
204
  super()._draw(event)
127
205
 
128
206
  width = self.winfo_width()
129
207
  height = self.winfo_height()
130
-
131
- self.delete("all")
208
+ # 提前定义,反正多次调用浪费资源
132
209
 
133
210
  state = self.dcget("state")
134
211
 
@@ -166,6 +243,9 @@ class FluButton(FluButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
166
243
  _radius = tempcolor.radius
167
244
  _text_color = tempcolor.text_color
168
245
 
246
+ if hasattr(self, "element_border"):
247
+ self.delete(self.element_border)
248
+
169
249
  self.element_border = self.create_round_rectangle(
170
250
  0, 0, width, height, _radius, temppath=self.temppath,
171
251
  fill=_back_color, fill_opacity=_back_opacity,
@@ -174,10 +254,15 @@ class FluButton(FluButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
174
254
  width=_border_width,
175
255
  )
176
256
 
177
- self.element_text = self.create_text(
178
- self.winfo_width() / 2, self.winfo_height() / 2, anchor="center",
179
- fill=_text_color, text=self.attributes.text, font=self.attributes.font
180
- )
257
+ if hasattr(self, "element_text"):
258
+ self.itemconfigure(self.element_text, fill=_text_color, text=self.attributes.text, font=self.attributes.font)
259
+ self.coords(self.element_text, width / 2, height / 2)
260
+ else:
261
+ self.element_text = self.create_text(
262
+ width / 2, height / 2, anchor="center",
263
+ fill=_text_color, text=self.attributes.text, font=self.attributes.font
264
+ )
265
+ self.tag_raise(self.element_text, self.element_border)
181
266
 
182
267
  self.update()
183
268
 
@@ -186,7 +271,17 @@ class FluButton(FluButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
186
271
  self.mode = mode
187
272
  if style:
188
273
  self.style = style
189
- if self.mode.lower() == "dark":
274
+ theme_handlers = {
275
+ ("light", "accent"): self._light_accent,
276
+ ("light", "menu"): self._light_menu,
277
+ ("light", "standard"): self._light,
278
+ ("dark", "accent"): self._dark_accent,
279
+ ("dark", "menu"): self._dark_menu,
280
+ ("dark", "standard"): self._dark,
281
+ }
282
+ handler = theme_handlers.get((self.mode.lower(), self.style.lower()))
283
+ handler()
284
+ """if self.mode.lower() == "dark":
190
285
  if self.style.lower() == "accent":
191
286
  self._dark_accent()
192
287
  elif self.style.lower() == "menu":
@@ -199,9 +294,9 @@ class FluButton(FluButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
199
294
  elif self.style.lower() == "menu":
200
295
  self._light_menu()
201
296
  else:
202
- self._light()
297
+ self._light()"""
203
298
 
204
- def _theme(self, mode, style, animation_steps: int = None, animation_step_time: int = None):
299
+ def _theme(self, mode: MODE, style: BUTTONSTYLE, animation_steps: int = None, animation_step_time: int = None):
205
300
  if animation_steps is None:
206
301
  from .designs.animation import get_animation_steps
207
302
  animation_steps = get_animation_steps()
@@ -212,66 +307,67 @@ class FluButton(FluButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
212
307
  h = button(mode, style, "hover")
213
308
  p = button(mode, style, "pressed")
214
309
  d = button(mode, style, "disabled")
215
- if self.dcget("state") == "normal":
216
- if self.enter:
217
- if self.button1:
218
- now = p
310
+ if not animation_steps == 0 or not animation_step_time == 0:
311
+ if self.dcget("state") == "normal":
312
+ if self.enter:
313
+ if self.button1:
314
+ now = p
315
+ else:
316
+ now = h
219
317
  else:
220
- now = h
318
+ now = r
221
319
  else:
222
- now = r
223
- else:
224
- now = d
225
- #print(animation_step_time)
226
- #print(type(animation_step_time))
227
- if hasattr(self.attributes.rest, "back_color"):
228
- back_colors = self.generate_hex2hex(
229
- self.attributes.rest.back_color, now["back_color"], animation_steps
230
- )
231
- border_colors = self.generate_hex2hex(
232
- self.attributes.rest.border_color, now["border_color"], animation_steps
233
- )
234
- if self.attributes.rest.border_color2 is None:
235
- self.attributes.rest.border_color2 = self.attributes.rest.border_color
236
- if now["border_color2"] is None:
237
- now["border_color2"] = now["border_color"]
238
- border_colors2 = self.generate_hex2hex(
239
- self.attributes.rest.border_color2, now["border_color2"], animation_steps
240
- )
241
- text_colors = self.generate_hex2hex(
242
- self.attributes.rest.text_color, now["text_color"], animation_steps
243
- )
244
- import numpy as np
245
- back_opacitys = np.linspace(
246
- float(self.attributes.rest.back_opacity), float(now["back_opacity"]), animation_steps).tolist()
247
- border_color_opacitys = np.linspace(
248
- float(self.attributes.rest.border_color_opacity), float(now["border_color_opacity"]), animation_steps).tolist()
249
- if self.attributes.rest.border_color2_opacity is None:
250
- self.attributes.rest.border_color2_opacity = self.attributes.rest.border_color_opacity
251
- if now["border_color2_opacity"] is None:
252
- now["border_color2_opacity"] = now["border_color_opacity"]
253
- border_color2_opacitys = np.linspace(
254
- float(self.attributes.rest.border_color2_opacity), float(now["border_color2_opacity"]), animation_steps).tolist()
255
- for i in range(animation_steps):
256
- def update(ii=i):
257
- from easydict import EasyDict
258
- tempcolor = EasyDict(
259
- {
260
- "back_color": back_colors[ii],
261
- "back_opacity": back_opacitys[ii],
262
- "border_color": border_colors[ii],
263
- "border_color_opacity": str(border_color_opacitys[ii]),
264
- "border_color2": border_colors2[ii],
265
- "border_color2_opacity": str(border_color2_opacitys[ii]),
266
- "border_width": 1,
267
- "text_color": text_colors[ii],
268
- "radius": 6,
269
- }
270
- )
271
- self._draw(None, tempcolor)
272
-
273
- self.after(i * animation_step_time, update)
274
- #self.after(animation_steps * animation_step_time + 10, lambda: self._draw(None, None))
320
+ now = d
321
+ #print(animation_step_time)
322
+ #print(type(animation_step_time))
323
+ if hasattr(self.attributes.rest, "back_color"):
324
+ back_colors = self.generate_hex2hex(
325
+ self.attributes.rest.back_color, now["back_color"], animation_steps
326
+ )
327
+ border_colors = self.generate_hex2hex(
328
+ self.attributes.rest.border_color, now["border_color"], animation_steps
329
+ )
330
+ if self.attributes.rest.border_color2 is None:
331
+ self.attributes.rest.border_color2 = self.attributes.rest.border_color
332
+ if now["border_color2"] is None:
333
+ now["border_color2"] = now["border_color"]
334
+ border_colors2 = self.generate_hex2hex(
335
+ self.attributes.rest.border_color2, now["border_color2"], animation_steps
336
+ )
337
+ text_colors = self.generate_hex2hex(
338
+ self.attributes.rest.text_color, now["text_color"], animation_steps
339
+ )
340
+ import numpy as np
341
+ back_opacitys = np.linspace(
342
+ float(self.attributes.rest.back_opacity), float(now["back_opacity"]), animation_steps).tolist()
343
+ border_color_opacitys = np.linspace(
344
+ float(self.attributes.rest.border_color_opacity), float(now["border_color_opacity"]), animation_steps).tolist()
345
+ if self.attributes.rest.border_color2_opacity is None:
346
+ self.attributes.rest.border_color2_opacity = self.attributes.rest.border_color_opacity
347
+ if now["border_color2_opacity"] is None:
348
+ now["border_color2_opacity"] = now["border_color_opacity"]
349
+ border_color2_opacitys = np.linspace(
350
+ float(self.attributes.rest.border_color2_opacity), float(now["border_color2_opacity"]), animation_steps).tolist()
351
+ for i in range(animation_steps):
352
+ def update(ii=i):
353
+ from easydict import EasyDict
354
+ tempcolor = EasyDict(
355
+ {
356
+ "back_color": back_colors[ii],
357
+ "back_opacity": back_opacitys[ii],
358
+ "border_color": border_colors[ii],
359
+ "border_color_opacity": str(border_color_opacitys[ii]),
360
+ "border_color2": border_colors2[ii],
361
+ "border_color2_opacity": str(border_color2_opacitys[ii]),
362
+ "border_width": 1,
363
+ "text_color": text_colors[ii],
364
+ "radius": 6,
365
+ }
366
+ )
367
+ self._draw(None, tempcolor)
368
+
369
+ self.after(i * animation_step_time, update)
370
+ #self.after(animation_steps * animation_step_time + 10, lambda: self._draw(None, None))
275
371
 
276
372
  self.dconfigure(
277
373
  rest={
@@ -341,7 +437,7 @@ class FluButton(FluButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
341
437
  def invoke(self):
342
438
  self.attributes.command()
343
439
 
344
- def _event_off_button1(self, event=None):
440
+ def _event_off_button1(self, event: Event = None):
345
441
  self.button1 = False
346
442
 
347
443
  self._draw(event)
tkflu/bwm.py CHANGED
@@ -137,14 +137,15 @@ class BWm(FluGradient):
137
137
  if animation_step_time is None:
138
138
  from .designs.animation import get_animation_step_time
139
139
  animation_step_time = get_animation_step_time()
140
- if self.dcget("back_color"):
141
- back_colors = self.generate_hex2hex(self.dcget("back_color"), n["back_color"], steps=animation_steps)
142
- for i in range(animation_steps):
143
- def update(ii=i): # 使用默认参数立即捕获i的值
144
- self.dconfigure(back_color=back_colors[ii])
145
- self._draw()
140
+ if not animation_steps == 0 or not animation_step_time == 0:
141
+ if self.dcget("back_color"):
142
+ back_colors = self.generate_hex2hex(self.dcget("back_color"), n["back_color"], steps=animation_steps)
143
+ for i in range(animation_steps):
144
+ def update(ii=i): # 使用默认参数立即捕获i的值
145
+ self.dconfigure(back_color=back_colors[ii])
146
+ self._draw()
146
147
 
147
- self.after(i * animation_step_time, update) # 直接传递函数,不需要lambda
148
+ self.after(i * animation_step_time, update) # 直接传递函数,不需要lambda
148
149
 
149
150
  self.dconfigure(
150
151
  back_color=n["back_color"],
@@ -186,6 +187,8 @@ class BWm(FluGradient):
186
187
  if platform == "win32":
187
188
  if way == 0:
188
189
  from .customwindow import CustomWindow
190
+ import warnings
191
+ warnings.warn("This is EXPERIMENTAL! Please consider way=1 in production.")
189
192
  self.customwindow = CustomWindow(self, wait=wait)
190
193
  self.customwindow.bind_drag(self.titlebar)
191
194
  self.customwindow.bind_drag(self.titlelabel)
tkflu/demos/grad2.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from tkflu import *
2
2
 
3
3
  set_animation_steps(20)
4
- set_animation_step_time(50)
4
+ set_animation_step_time(20)
5
5
 
6
6
  root = FluWindow()
7
7
 
tkflu/frame.py CHANGED
@@ -189,17 +189,17 @@ class FluFrame(Frame, DObject, FluGradient):
189
189
  if animation_step_time is None:
190
190
  from .designs.animation import get_animation_step_time
191
191
  animation_step_time = get_animation_step_time()
192
-
193
- if hasattr(self.attributes, "back_color") and hasattr(n, "back_color"):
194
- back_colors = self.generate_hex2hex(self.attributes.back_color, n["back_color"], steps=animation_steps)
195
- for i in range(animation_steps):
196
- def update(ii=i): # 使用默认参数立即捕获i的值
197
- print(back_colors[ii])
198
- self._draw(tempcolor=back_colors[ii])
199
- self.update()
200
-
201
- self.after(i * animation_step_time, update) # 直接传递函数,不需要lambda
202
- self.after(animation_steps * animation_step_time + 10, lambda: self._draw())
192
+ if not animation_steps == 0 or not animation_step_time == 0:
193
+ if hasattr(self.attributes, "back_color") and hasattr(n, "back_color"):
194
+ back_colors = self.generate_hex2hex(self.attributes.back_color, n["back_color"], steps=animation_steps)
195
+ for i in range(animation_steps):
196
+ def update(ii=i): # 使用默认参数立即捕获i的值
197
+ print(back_colors[ii])
198
+ self._draw(tempcolor=back_colors[ii])
199
+ self.update()
200
+
201
+ self.after(i * animation_step_time, update) # 直接传递函数,不需要lambda
202
+ self.after(animation_steps * animation_step_time + 10, lambda: self._draw())
203
203
  self.dconfigure(
204
204
  back_color=n["back_color"],
205
205
  border_color=n["border_color"],
tkflu/image.py CHANGED
@@ -0,0 +1,4 @@
1
+ from .frame import FluFrame
2
+
3
+
4
+ class FluImage(FluFrame):
tkflu/label.py CHANGED
@@ -41,17 +41,19 @@ class FluLabel(DDrawWidget, FluToolTipBase, FluGradient):
41
41
  def _draw(self, event=None, tempcolor=None):
42
42
  super()._draw(event)
43
43
 
44
- self.delete("all")
45
-
46
44
  if tempcolor:
47
45
  _text_color = tempcolor
48
46
  else:
49
47
  _text_color = self.attributes.text_color
50
48
 
51
- self.element_text = self.create_text(
52
- self.winfo_width() / 2, self.winfo_height() / 2, anchor="center",
53
- fill=_text_color, text=self.attributes.text, font=self.attributes.font
54
- )
49
+ if not hasattr(self, "element_text"):
50
+ self.element_text = self.create_text(
51
+ self.winfo_width() / 2, self.winfo_height() / 2, anchor="center",
52
+ fill=_text_color, text=self.attributes.text, font=self.attributes.font
53
+ )
54
+ else:
55
+ self.coords(self.element_text, self.winfo_width() / 2, self.winfo_height() / 2)
56
+ self.itemconfigure(self.element_text, fill=_text_color, text=self.attributes.text, font=self.attributes.font)
55
57
 
56
58
  def theme(self, mode="light", animation_steps: int = None, animation_step_time: int = None):
57
59
  from .designs.label import label
tkflu/menubar.py CHANGED
@@ -141,24 +141,31 @@ class FluMenuBar(Frame, DObject, FluGradient):
141
141
  m = menubar(mode)
142
142
  self.mode = mode
143
143
  if hasattr(self, "tk"):
144
- if mode.lower() == "dark":
145
- back_colors = self.generate_hex2hex(self.attributes.back_color, m["back_color"], steps=animation_steps)
146
- for i in range(animation_steps):
147
- def update(ii=i): # 使用默认参数立即捕获i的值
148
- self.dconfigure(back_color=back_colors[ii])
149
- self._draw()
150
-
151
- self.after(i * animation_step_time, update) # 直接传递函数,不需要lambda
144
+ if not animation_steps == 0 or not animation_step_time == 0:
145
+ if mode.lower() == "dark":
146
+ back_colors = self.generate_hex2hex(self.attributes.back_color, m["back_color"], steps=animation_steps)
147
+ for i in range(animation_steps):
148
+ def update(ii=i): # 使用默认参数立即捕获i的值
149
+ self.dconfigure(back_color=back_colors[ii])
150
+ self._draw()
151
+
152
+ self.after(i * animation_step_time, update) # 直接传递函数,不需要lambda
153
+ else:
154
+ back_colors = self.generate_hex2hex(self.attributes.back_color, m["back_color"], steps=animation_steps)
155
+ for i in range(animation_steps):
156
+ def update(ii=i): # 使用默认参数立即捕获i的值
157
+ self.dconfigure(back_color=back_colors[ii])
158
+ self._draw()
159
+
160
+ self.after(i * animation_step_time, update) # 直接传递函数,不需要lambda
161
+
162
+ self.after(animation_steps * animation_step_time + 50, lambda: self.update_children())
152
163
  else:
153
- back_colors = self.generate_hex2hex(self.attributes.back_color, m["back_color"], steps=animation_steps)
154
- for i in range(animation_steps):
155
- def update(ii=i): # 使用默认参数立即捕获i的值
156
- self.dconfigure(back_color=back_colors[ii])
157
- self._draw()
158
-
159
- self.after(i * animation_step_time, update) # 直接传递函数,不需要lambda
160
-
161
- self.after(animation_steps * animation_step_time + 50, lambda: self.update_children())
164
+ if mode.lower() == "dark":
165
+ self.dconfigure(back_color=m["back_color"])
166
+ else:
167
+ self.dconfigure(back_color=m["back_color"])
168
+ self._draw()
162
169
 
163
170
  def _draw(self, event=None):
164
171
  self.config(background=self.attributes.back_color)
tkflu/text.py CHANGED
@@ -172,6 +172,8 @@ class FluText(FluTextCanvas, DDrawWidget, FluToolTipBase):
172
172
  height=self.winfo_height() - _border_width * 2 - _radius
173
173
  )
174
174
 
175
+ if hasattr(self, "element_border"):
176
+ self.delete(self.element_border)
175
177
  self.element_border = self.create_round_rectangle(
176
178
  0, 0, width, height, _radius, temppath=self.temppath,
177
179
  fill=_back_color, fill_opacity=_back_opacity, stop1=_stop1, stop2=_stop2,
@@ -179,20 +181,50 @@ class FluText(FluTextCanvas, DDrawWidget, FluToolTipBase):
179
181
  outline2_opacity=_border_color2_opacity,
180
182
  width=_border_width
181
183
  )
182
-
184
+ """if _underline_fill:
185
+ if not hasattr(self, "element_line"):
186
+ self.element_line = self.create_line(
187
+ _radius / 3 + _border_width, self.winfo_height() - _radius / 3,
188
+ self.winfo_width() - _radius / 3 - _border_width * 2, self.winfo_height() - _radius / 3,
189
+ width=_underline_width, fill=_underline_fill
190
+ )
191
+ else:
192
+ self.coords(
193
+ self.element_line, _radius / 3 + _border_width, self.winfo_height() - _radius / 3,
194
+ self.winfo_width() - _radius / 3 - _border_width * 2, self.winfo_height() - _radius / 3,
195
+ )
196
+ self.itemconfigure(self.element_line, width=_underline_width, fill=_underline_fill)
197
+ """
198
+ if hasattr(self, "element_line"):
199
+ self.delete(self.element_line)
183
200
  if _underline_fill:
184
201
  self.element_line = self.create_line(
185
202
  _radius / 3 + _border_width, self.winfo_height() - _radius / 3,
186
203
  self.winfo_width() - _radius / 3 - _border_width * 2, self.winfo_height() - _radius / 3,
187
204
  width=_underline_width, fill=_underline_fill
188
205
  )
189
-
206
+ """
207
+ if not hasattr(self, "element_text"):
208
+ self.element_text = self.create_window(
209
+ self.winfo_width() / 2, self.winfo_height() / 2,
210
+ window=self.text,
211
+ width=self.winfo_width() - _border_width * 2 - _radius,
212
+ height=self.winfo_height() - _border_width * 2 - _radius
213
+ )
214
+ else:
215
+ self.coords(self.element_text, self.winfo_width() / 2, self.winfo_height() / 2,
216
+ self.winfo_width() - _border_width * 2 - _radius, self.winfo_height() - _border_width * 2 - _radius)
217
+ """
218
+ if hasattr(self, "element_text"):
219
+ self.delete(self.element_text)
190
220
  self.element_text = self.create_window(
191
221
  self.winfo_width() / 2, self.winfo_height() / 2,
192
222
  window=self.text,
193
223
  width=self.winfo_width() - _border_width * 2 - _radius,
194
224
  height=self.winfo_height() - _border_width * 2 - _radius
195
225
  )
226
+ self.tag_raise(self.element_text, self.element_border)
227
+ self.tag_raise(self.element_line, self.element_border)
196
228
 
197
229
  #self.tag_raise(self.element_text)
198
230
 
tkflu/thememanager.py CHANGED
@@ -1,9 +1,10 @@
1
1
  from .window import FluWindow
2
2
  from .toplevel import FluToplevel
3
+ from typing import Union
3
4
 
4
5
 
5
6
  class FluThemeManager(object):
6
- def __init__(self, window=None, mode: str = "light", delay: int or None = 100):
7
+ def __init__(self, window=None, mode: str = "light", delay: Union[int, None] = 100):
7
8
  if window:
8
9
  self._window = window
9
10
  else:
@@ -13,7 +14,7 @@ class FluThemeManager(object):
13
14
  self.mode(self._mode)
14
15
  self._window.after(delay, lambda: self.mode(self._mode))
15
16
 
16
- def mode(self, mode: str, delay: int or None = 50):
17
+ def mode(self, mode: str, delay: Union[int, None] = 50):
17
18
  def _():
18
19
  self._mode = mode
19
20
  if hasattr(self._window, "theme"):
@@ -43,7 +44,7 @@ class FluThemeManager(object):
43
44
  #print(len(self._window.winfo_children()))
44
45
  self._window.after(delay+len(self._window.winfo_children()), __)
45
46
 
46
- def toggle(self, delay: int or None = None):
47
+ def toggle(self, delay: Union[int, None] = None):
47
48
  if self._mode == "light":
48
49
  mode = "dark"
49
50
  else:
tkflu/togglebutton.py CHANGED
@@ -398,76 +398,82 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget, FluToolTipBase, FluGra
398
398
  if animation_step_time is None:
399
399
  from .designs.animation import get_animation_step_time
400
400
  animation_step_time = get_animation_step_time()
401
- steps = animation_steps
402
401
  check = self.attributes.check
403
402
  uncheck = self.attributes.uncheck
404
- if uncheck.pressed.border_color2 is None:
405
- uncheck.pressed.border_color2 = uncheck.pressed.border_color
406
- if check.pressed.border_color2 is None:
407
- check.pressed.border_color2 = check.pressed.border_color
408
- if uncheck.pressed.border_color2_opacity is None:
409
- uncheck.pressed.border_color2_opacity = uncheck.pressed.border_color_opacity
410
- if check.pressed.border_color2_opacity is None:
411
- check.pressed.border_color2_opacity = check.pressed.border_color_opacity
412
- if self.attributes.checked:
413
- self.attributes.checked = False
414
- back_colors = self.generate_hex2hex(
415
- check.pressed.back_color, uncheck.rest.back_color, steps
416
- )
417
- border_colors = self.generate_hex2hex(
418
- check.pressed.border_color, uncheck.rest.border_color, steps
419
- )
420
- border_colors2 = self.generate_hex2hex(
421
- check.pressed.border_color2, uncheck.rest.border_color2, steps
422
- )
423
- text_colors = self.generate_hex2hex(
424
- check.pressed.text_color, uncheck.rest.text_color, steps
425
- )
426
- import numpy as np
427
- back_opacitys = np.linspace(
428
- float(check.pressed.back_opacity), float(uncheck.rest.back_opacity), steps).tolist()
429
- border_color_opacitys = np.linspace(
430
- float(check.pressed.border_color_opacity), float(uncheck.rest.border_color_opacity), steps).tolist()
431
- border_color2_opacitys = np.linspace(
432
- float(check.pressed.border_color2_opacity), float(uncheck.rest.border_color2_opacity), steps).tolist()
433
- else:
434
- self.attributes.checked = True
435
- back_colors = self.generate_hex2hex(
436
- uncheck.pressed.back_color, check.rest.back_color, steps
437
- )
438
- border_colors = self.generate_hex2hex(
439
- uncheck.pressed.back_color, check.rest.back_color, steps
440
- )
441
- border_colors2 = self.generate_hex2hex(
442
- uncheck.pressed.border_color2, check.rest.border_color2, steps
443
- )
444
- text_colors = self.generate_hex2hex(
445
- uncheck.pressed.text_color, check.rest.text_color, steps
446
- )
447
- import numpy as np
448
- back_opacitys = np.linspace(float(uncheck.pressed.back_opacity), float(check.rest.back_opacity),
449
- steps).tolist()
450
- border_color_opacitys = np.linspace(float(uncheck.pressed.border_color_opacity), float(check.rest.border_color_opacity),
451
- steps).tolist()
452
- border_color2_opacitys = np.linspace(float(uncheck.pressed.border_color2_opacity),
453
- float(check.rest.border_color2_opacity),
454
- steps).tolist()
455
- for i in range(steps):
456
- def update(ii=i):
457
- from easydict import EasyDict
458
- tempcolor = EasyDict(
459
- {
460
- "back_color": back_colors[ii],
461
- "back_opacity": back_opacitys[ii],
462
- "border_color": border_colors[ii],
463
- "border_color_opacity": str(border_color_opacitys[ii]),
464
- "border_color2": border_colors2[ii],
465
- "border_color2_opacity": str(border_color2_opacitys[ii]),
466
- "border_width": 1,
467
- "text_color": text_colors[ii],
468
- "radius": 6,
469
- }
403
+ if not animation_steps == 0 or not animation_step_time == 0:
404
+ steps = animation_steps
405
+ if uncheck.pressed.border_color2 is None:
406
+ uncheck.pressed.border_color2 = uncheck.pressed.border_color
407
+ if check.pressed.border_color2 is None:
408
+ check.pressed.border_color2 = check.pressed.border_color
409
+ if uncheck.pressed.border_color2_opacity is None:
410
+ uncheck.pressed.border_color2_opacity = uncheck.pressed.border_color_opacity
411
+ if check.pressed.border_color2_opacity is None:
412
+ check.pressed.border_color2_opacity = check.pressed.border_color_opacity
413
+ if self.attributes.checked:
414
+ self.attributes.checked = False
415
+ back_colors = self.generate_hex2hex(
416
+ check.pressed.back_color, uncheck.rest.back_color, steps
417
+ )
418
+ border_colors = self.generate_hex2hex(
419
+ check.pressed.border_color, uncheck.rest.border_color, steps
470
420
  )
471
- self._draw(None, tempcolor)
472
- self.after(i*animation_step_time, update)
473
- self.after(steps*animation_step_time+10, lambda: self._draw(None, None))
421
+ border_colors2 = self.generate_hex2hex(
422
+ check.pressed.border_color2, uncheck.rest.border_color2, steps
423
+ )
424
+ text_colors = self.generate_hex2hex(
425
+ check.pressed.text_color, uncheck.rest.text_color, steps
426
+ )
427
+ import numpy as np
428
+ back_opacitys = np.linspace(
429
+ float(check.pressed.back_opacity), float(uncheck.rest.back_opacity), steps).tolist()
430
+ border_color_opacitys = np.linspace(
431
+ float(check.pressed.border_color_opacity), float(uncheck.rest.border_color_opacity), steps).tolist()
432
+ border_color2_opacitys = np.linspace(
433
+ float(check.pressed.border_color2_opacity), float(uncheck.rest.border_color2_opacity), steps).tolist()
434
+ else:
435
+ self.attributes.checked = True
436
+ back_colors = self.generate_hex2hex(
437
+ uncheck.pressed.back_color, check.rest.back_color, steps
438
+ )
439
+ border_colors = self.generate_hex2hex(
440
+ uncheck.pressed.back_color, check.rest.back_color, steps
441
+ )
442
+ border_colors2 = self.generate_hex2hex(
443
+ uncheck.pressed.border_color2, check.rest.border_color2, steps
444
+ )
445
+ text_colors = self.generate_hex2hex(
446
+ uncheck.pressed.text_color, check.rest.text_color, steps
447
+ )
448
+ import numpy as np
449
+ back_opacitys = np.linspace(float(uncheck.pressed.back_opacity), float(check.rest.back_opacity),
450
+ steps).tolist()
451
+ border_color_opacitys = np.linspace(float(uncheck.pressed.border_color_opacity), float(check.rest.border_color_opacity),
452
+ steps).tolist()
453
+ border_color2_opacitys = np.linspace(float(uncheck.pressed.border_color2_opacity),
454
+ float(check.rest.border_color2_opacity),
455
+ steps).tolist()
456
+ for i in range(steps):
457
+ def update(ii=i):
458
+ from easydict import EasyDict
459
+ tempcolor = EasyDict(
460
+ {
461
+ "back_color": back_colors[ii],
462
+ "back_opacity": back_opacitys[ii],
463
+ "border_color": border_colors[ii],
464
+ "border_color_opacity": str(border_color_opacitys[ii]),
465
+ "border_color2": border_colors2[ii],
466
+ "border_color2_opacity": str(border_color2_opacitys[ii]),
467
+ "border_width": 1,
468
+ "text_color": text_colors[ii],
469
+ "radius": 6,
470
+ }
471
+ )
472
+ self._draw(None, tempcolor)
473
+ self.after(i*animation_step_time, update)
474
+ self.after(steps*animation_step_time+10, lambda: self._draw(None, None))
475
+ else:
476
+ if self.attributes.checked:
477
+ self.attributes.checked = False
478
+ else:
479
+ self.attributes.checked = True
tkflu/tooltip.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from .popupwindow import FluPopupWindow
2
2
  from tkinter import Event, Widget
3
+ import sys
3
4
 
4
5
 
5
6
  class FluToolTip(FluPopupWindow):
@@ -26,7 +27,7 @@ class FluToolTip(FluPopupWindow):
26
27
  self._widget.bind('<Enter>', self.enter, add="+")
27
28
  self._widget.bind('<Leave>', self.leave, add="+")
28
29
 
29
- #self.theme(mode)
30
+ self.theme(mode)
30
31
 
31
32
  def enter(self, event: Event):
32
33
  def check() -> None:
@@ -44,10 +45,12 @@ class FluToolTip(FluPopupWindow):
44
45
 
45
46
  # 渐显动画
46
47
  def fade_in(step=0):
47
- alpha = step / 10 # 分10步从0到1
48
+ FRAMES_COUNT = 20
49
+ alpha = step / FRAMES_COUNT # 按帧数变化,从0到1
48
50
  self.wm_attributes("-alpha", alpha)
49
- if step < 10:
50
- self.after(int(round(self._show_time/10)), lambda: fade_in(step + 1)) # 每50ms增加一次透明度
51
+ if step < FRAMES_COUNT:
52
+ # 每执行一次,增加一次透明度,间隔由帧数决定
53
+ self.after(int(round(self._show_time/FRAMES_COUNT)), lambda: fade_in(step + 1))
51
54
 
52
55
  fade_in() # 启动动画
53
56
 
@@ -103,7 +106,7 @@ class FluToolTip2(FluPopupWindow):
103
106
  self._widget.bind('<Leave>', self.hide, add="+")
104
107
  self._widget.bind('<Motion>', self.move, add="+")
105
108
 
106
- #self.theme(mode)
109
+ self.theme(mode)
107
110
 
108
111
  def show(self, event: Event):
109
112
  self.popup(
@@ -127,7 +130,9 @@ class FluToolTip2(FluPopupWindow):
127
130
  self.configure(
128
131
  background=n["back_color"]
129
132
  )
130
- self.wm_attributes("-transparentcolor", n["back_color"])
133
+
134
+ if sys.platform == "win32": # Only Windows supports the transparentcolor attribute
135
+ self.wm_attributes("-transparentcolor", n["back_color"])
131
136
  #print(n["back_color"])
132
137
  if hasattr(self, "_frame"):
133
138
  self._frame.dconfigure(
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: tkfluent
3
- Version: 0.1.2
4
- Summary: Fluent Design for Tkinter
3
+ Version: 0.1.3
4
+ Summary: Fluent(SunValley) Design for Tkinter. Modern GUI
5
5
  License: GPL-3.0
6
- Keywords: tkfluent,tksvg,tkinter,fluent,modern,UI,interface
6
+ Keywords: tkfluent,tksvg,tkinter,fluent,modern,GUI,interface
7
7
  Author: XiangQinxi
8
8
  Author-email: xiangqinxi@outlook.com
9
9
  Requires-Python: >=3.8,<4.0
@@ -27,10 +27,10 @@ Classifier: Programming Language :: Python :: 3.13
27
27
  Classifier: Programming Language :: Tcl
28
28
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
29
  Requires-Dist: easydict (>=1.13,<2.0)
30
- Requires-Dist: numpy (>=2.3.1,<3.0.0)
30
+ Requires-Dist: numpy
31
31
  Requires-Dist: pillow (>=10.2.0,<11.0.0)
32
32
  Requires-Dist: svgwrite (>=1.4.3,<2.0.0)
33
- Requires-Dist: tkdeft (>=0.0.9,<0.0.10)
33
+ Requires-Dist: tkdeft (==0.0.9)
34
34
  Requires-Dist: tkextrafont (>=0.6.3,<0.7.0)
35
35
  Requires-Dist: tksvg (>=0.7.4,<0.8.0)
36
36
  Project-URL: Documentation, https://tkfluent.netlify.app
@@ -44,10 +44,18 @@ Description-Content-Type: text/markdown
44
44
  ![Light.png](https://img.picui.cn/free/2025/06/22/6857e613bc150.png)
45
45
  ![Dark.png](https://img.picui.cn/free/2025/06/22/6857e613b7fc2.png)
46
46
 
47
+ ## 文档
48
+ 请查阅[tkfluent文档网站](https://tkfluent.netlify.app/)。
49
+ 使用`mkdocs`和`mkdocs-material`构建,由`netlify`部署
50
+
51
+ ## 贡献者
52
+ 1. [真_人工智障](https://github.com/TotoWang-hhh)
53
+
47
54
  ## 依赖图
48
55
  ```bash
49
56
  PS .\tkfluent> poetry show --tree
50
57
  easydict 1.13 Access dict values as attributes (works recursively).
58
+ numpy 1.24.4 Fundamental package for array computing in Python
51
59
  pillow 10.4.0 Python Imaging Library (Fork)
52
60
  svgwrite 1.4.3 A Python library to create SVG drawings.
53
61
  tkdeft 0.0.9 使用tkinter+tksvg开发的现代化界面库
@@ -1,8 +1,8 @@
1
- tkflu/__init__.py,sha256=rw-h1nnCEP1mr_K9A7yAMdK5PS1yZRx3ha4q9AiYPlY,988
2
- tkflu/__main__.py,sha256=o7f_U4B2BvffR0XuUSKsEzS7xVsf6T6ifroxImH8-KE,3303
1
+ tkflu/__init__.py,sha256=2h8-989xFYDdt2BAxVn0_6jkfq96Hy-0MfZnjm4Bacc,1013
2
+ tkflu/__main__.py,sha256=QCVBJeyYGwtiMvS8wArcJrW8KL169w7wwXEBkjloGeM,3303
3
3
  tkflu/badge.py,sha256=p9kY-JbsDraohNg2ZJMk3xA4PS9LEKxFpaSGX_NgHBw,5836
4
- tkflu/button.py,sha256=ai5CuSSRdR8q4C7P8ngAyVCQij1uM75M2TCKaTwVhqI,13932
5
- tkflu/bwm.py,sha256=jKGzvvmMHWn5y7GNrsMmcxIpM5j5v3zwxkpnMpsrYLk,8009
4
+ tkflu/button.py,sha256=N6wvcNNsqVf_Rb0c1ZOw3JpXqJcR9QJAFvjl2aaQXPw,19263
5
+ tkflu/bwm.py,sha256=6N4fLxnMIAFVXdNriBk-88-rmCVu0j245zAjYA6Bq-k,8233
6
6
  tkflu/checkbox.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  tkflu/constants.py,sha256=VX3NcSzdOqelK3IRM-fK_RKBHV26d8AgJMuP-8hqCsA,488
8
8
  tkflu/customwindow.py,sha256=Fr4CF0vKwj36tYzgX9_5F7OwcD59z9LfOW20Ugm2Hxc,3761
@@ -13,7 +13,7 @@ tkflu/demos/acrylic1.py,sha256=-1SniTxrQeAYz6VSxHu7UsAmZeSIBaElgC2KYVVAghU,423
13
13
  tkflu/demos/demo1.py,sha256=xR4a1qOrzxHXhVFlluTjp9izo7sO_YFbS_BGZj1LbZs,112
14
14
  tkflu/demos/designer.py,sha256=EI40war1G_XuXBrf9qKK0FJVGfS_WSsCwVBTSWxveeY,961
15
15
  tkflu/demos/grad.py,sha256=neRGPq7VkGEzzUJymNdBi7EYI55wMes-OX3l-DQSonA,2195
16
- tkflu/demos/grad2.py,sha256=U2PI1942CvfNGWXJ8WztW9LOg6tHIFcGrJNKfMl4Pf4,442
16
+ tkflu/demos/grad2.py,sha256=2ZixYVCaqWoWxTqYD4p6x9Sz7VUT3KCeQDNzOX0aAkI,442
17
17
  tkflu/demos/grad3.py,sha256=vJQ70C0amAJMbDvudOvHBqwb59SuXoWDCk7QovFuFts,441
18
18
  tkflu/demos/test.py,sha256=DMontyt61qq4ULVExSrHA9tbQlXHH_KSkQPv1EV8TEk,153
19
19
  tkflu/demos/tooltip.py,sha256=_tTIUuVo8x9YpdikPLxTvbB3wF1vb-JKppVDgzHXj2k,286
@@ -35,24 +35,24 @@ tkflu/designs/text.py,sha256=YMJR2eGE7lFIZPYrT7p8QBD3zRH4NaVWhrL1dOb6vJ4,5059
35
35
  tkflu/designs/tooltip.py,sha256=OFUIO9-EMNjapF9zC5PuLW26HFGib-p800hNIxaWT5Q,442
36
36
  tkflu/designs/window.py,sha256=XHMvT0lVsJSeUApMf_bf9ipLSWT-BirkOiiUnVx-N48,625
37
37
  tkflu/entry.py,sha256=b4kblEEmZRqtuDM2E5_hhb_8MhTgujbwTNP7aICB6qM,10852
38
- tkflu/frame.py,sha256=XN2yTxzbwwQPiWj3RpCI5ndkYE7LEMWNlNbQaXE9L2U,11527
38
+ tkflu/frame.py,sha256=oMy6fZcDfoYEZsGnKw23wlMAlojckavs7X6JbB8OQpw,11631
39
39
  tkflu/icons.py,sha256=Xzrc9WzexncYEPXqnVg3ywWv_7kLZLyYC5WtaRv30PQ,7129
40
- tkflu/image.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- tkflu/label.py,sha256=sfLeYJP20604h8bgUKjbo7WnOJs-q41rTm1Tl3sMxec,2560
40
+ tkflu/image.py,sha256=w5CbUBsn5KG8EekLwMyXC5T0w6E_dlP8tlKjnut9194,58
41
+ tkflu/label.py,sha256=pt_xmL5cdrVwOMDGdbGdQKCwiCnsGp3OpMAG57Ow8Mw,2824
42
42
  tkflu/listbox.py,sha256=gD_oNNWVZtm5qXQ8bVBNRqJL6CGiIYtvhxztM9huzew,9991
43
43
  tkflu/litenav.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
44
  tkflu/menu.py,sha256=j15DzZuWGsG_xMvsDh7XfO-aV6zlF9AhzHN2rdjwQLU,3263
45
- tkflu/menubar.py,sha256=gm5zaNKM8_jbJ3SLJQZFJcOcR6-WAFG1MPKVyCO35j4,5765
45
+ tkflu/menubar.py,sha256=MrqUzH5Znv92IkDGnZa4MEYZkH9ynfMzPNdx0JpQQwU,6145
46
46
  tkflu/popupmenu.py,sha256=dRwuFK7PKSYXiLhzrrzjKXTjtLfr7vh0KDvJIUjDetg,1592
47
47
  tkflu/popupwindow.py,sha256=OVDjW3g5oKeFy82SLz7XiNC2hy8RKeQGW2l0yBKezIs,1010
48
48
  tkflu/scrollbar.py,sha256=1hbu5n1mx4KyiF_M3sohpJJPux1zu5Jlw9V6LfQQs1Y,7293
49
49
  tkflu/slider.py,sha256=B29fNA0rGSWEdetFfwLEdNhYyprHEm9FCqU3Vpp08Sw,16114
50
- tkflu/text.py,sha256=OIh79R0NAJdle4aSsIxzdPhBNqiAw15FqtdEip-kU9s,10891
51
- tkflu/thememanager.py,sha256=xf8zIriAyGWzmSD-e1D7igW3uWvSZkIVoPi3YJ3Brj8,1897
52
- tkflu/togglebutton.py,sha256=ZOGJbZRs_vcw9s7rOuaGblKSpOCaj-ws7ZcX9vRMhZo,19831
53
- tkflu/tooltip.py,sha256=Cjid4E9yFFPBZwOz5uVhSb8kpEEW26Wv8vxiqc0bnw4,4917
50
+ tkflu/text.py,sha256=OpGySgIpATrSR95cyhE-OTbtkBmQ3Eqqlw8DqVtioXI,12725
51
+ tkflu/thememanager.py,sha256=2Vrkg0OEeTpwz0WU89IQCuN6VfhoUjI_N8vwth-W20A,1938
52
+ tkflu/togglebutton.py,sha256=WWx6iFuNzvv8_1ujXEN2MwoHgo3itZHnVpeQeO6gqqQ,20355
53
+ tkflu/tooltip.py,sha256=JDSqa2Q4kJmlnY5fu9kR0dlcexwvQoscomiaxw7BGQg,5163
54
54
  tkflu/toplevel.py,sha256=dPrnhHTiciJtrlsh5oZNuv77Q-YCRK6OgQQ0mrhfTeo,1382
55
55
  tkflu/window.py,sha256=2LjgL2KZIAYA04fXWQvfiNMYj_PKzlpSuEZrR94qHAs,1483
56
- tkfluent-0.1.2.dist-info/METADATA,sha256=lvU3Vw-ZIcpsOpBqgjX3LKnHAfKoD4MWxRcLxJlgqhs,37953
57
- tkfluent-0.1.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
58
- tkfluent-0.1.2.dist-info/RECORD,,
56
+ tkfluent-0.1.3.dist-info/METADATA,sha256=GomtMRLj71TsxHwvOo4oE8rHH7WGBHGk0WlPr2QOZ_M,38223
57
+ tkfluent-0.1.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
58
+ tkfluent-0.1.3.dist-info/RECORD,,