tkfluent 0.1.4__py3-none-any.whl → 0.1.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/__init__.py +1 -0
- tkflu/__main__.py +19 -9
- tkflu/bwm.py +10 -0
- tkflu/demos/designer.py +2 -2
- tkflu/demos/screenshot.py +8 -0
- tkflu/demos/scroll.py +19 -0
- tkflu/designs/__init__.py +3 -1
- tkflu/designs/animation.py +2 -2
- tkflu/designs/design.py +20 -0
- tkflu/designs/fonts/__init__.py +16 -1
- tkflu/designs/fonts/segoe_fluent_icons.ttf +0 -0
- tkflu/designs/frame.py +2 -2
- tkflu/designs/menubar.py +2 -0
- tkflu/designs/scrollbar.py +17 -39
- tkflu/designs/text.py +5 -5
- tkflu/label.py +11 -8
- tkflu/menubar.py +17 -15
- tkflu/popupmenu.py +1 -1
- tkflu/popupwindow.py +16 -12
- tkflu/scrollbar.py +346 -132
- tkflu/slider.py +82 -62
- tkflu/text.py +10 -9
- tkflu/togglebutton.py +89 -86
- tkflu/tooltip.py +4 -13
- {tkfluent-0.1.4.dist-info → tkfluent-0.1.5.dist-info}/METADATA +7 -4
- {tkfluent-0.1.4.dist-info → tkfluent-0.1.5.dist-info}/RECORD +27 -24
- {tkfluent-0.1.4.dist-info → tkfluent-0.1.5.dist-info}/WHEEL +0 -0
tkflu/slider.py
CHANGED
@@ -119,12 +119,15 @@ class FluSlider(FluSliderCanvas, DDrawWidget):
|
|
119
119
|
text="",
|
120
120
|
width=70,
|
121
121
|
height=28,
|
122
|
+
orient="horizontal",
|
123
|
+
tick=False, # 自动吸附
|
122
124
|
font=None,
|
123
125
|
mode="light",
|
124
126
|
state="normal",
|
125
127
|
value=20,
|
126
128
|
max=100,
|
127
129
|
min=0,
|
130
|
+
changed=None,
|
128
131
|
**kwargs
|
129
132
|
):
|
130
133
|
|
@@ -148,12 +151,17 @@ class FluSlider(FluSliderCanvas, DDrawWidget):
|
|
148
151
|
state=state,
|
149
152
|
value=value,
|
150
153
|
max=max, min=min,
|
154
|
+
orient=orient, tick=tick, changed=changed,
|
151
155
|
)
|
152
156
|
|
157
|
+
|
158
|
+
|
153
159
|
super().__init__(*args, width=width, height=height, **kwargs)
|
154
160
|
|
155
161
|
self.bind("<<Clicked>>", lambda event=None: self.focus_set(), add="+")
|
156
162
|
|
163
|
+
#self.bind("<Left>", lambda event:print("asd1"))
|
164
|
+
|
157
165
|
self.bind("<B1-Motion>", self._event_button1_motion)
|
158
166
|
|
159
167
|
self.enter_thumb = False
|
@@ -168,6 +176,9 @@ class FluSlider(FluSliderCanvas, DDrawWidget):
|
|
168
176
|
{
|
169
177
|
"command": None,
|
170
178
|
"state": None,
|
179
|
+
"orient": "horizontal",
|
180
|
+
"tick": False,
|
181
|
+
"changed": None,
|
171
182
|
|
172
183
|
"value": 20,
|
173
184
|
"max": 100,
|
@@ -250,74 +261,83 @@ class FluSlider(FluSliderCanvas, DDrawWidget):
|
|
250
261
|
_thumb_inner_back_color = _dict.thumb.inner_back_color
|
251
262
|
_thumb_inner_back_opacity = _dict.thumb.inner_back_opacity
|
252
263
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
264
|
+
if self.attributes.orient == "horizontal":
|
265
|
+
thumb_xp = self.attributes.value / (self.attributes.max - self.attributes.min) # 滑块对应数值的比例
|
266
|
+
thumb_x = self.winfo_width() * thumb_xp # 滑块对应数值的x左边
|
267
|
+
|
268
|
+
width = self.winfo_width()
|
269
|
+
height = self.winfo_height()
|
270
|
+
# 修改滑块位置计算
|
271
|
+
thumb_width = _thumb_width
|
272
|
+
min_x = thumb_width / 2
|
273
|
+
max_x = self.winfo_width() - thumb_width / 2
|
274
|
+
track_length = max_x - min_x
|
275
|
+
|
276
|
+
# 计算轨道实际可用宽度(减去滑块宽度)
|
277
|
+
effective_track_width = self.winfo_width() - thumb_width
|
278
|
+
|
279
|
+
thumb_xp = (self.attributes.value - self.attributes.min) / (self.attributes.max - self.attributes.min)
|
280
|
+
thumb_center = thumb_width / 2 + thumb_xp * effective_track_width
|
281
|
+
|
282
|
+
thumb_width = _thumb_width
|
283
|
+
effective_width = self.winfo_width() - thumb_width
|
284
|
+
ratio = (self.attributes.value - self.attributes.min) / (self.attributes.max - self.attributes.min)
|
285
|
+
thumb_left = thumb_width / 2 + ratio * effective_width - thumb_width / 2
|
286
|
+
|
287
|
+
# 确保不会超出右边界
|
288
|
+
thumb_left = min(thumb_left, self.winfo_width() - thumb_width)
|
289
|
+
|
290
|
+
# 创建轨道时,width2 参数应为选中部分的宽度(滑块中心位置)
|
291
|
+
self.element_track = self.create_track(
|
292
|
+
_thumb_width / 4,
|
293
|
+
height / 2 - _track_height,
|
294
|
+
self.winfo_width() - _thumb_width / 2,
|
295
|
+
_track_height,
|
296
|
+
thumb_center - _thumb_width / 4, # 关键修正:使用滑块中心相对于轨道起点的距离
|
297
|
+
temppath=self.temppath, radius=_radius,
|
298
|
+
track_fill=_track_back_color, track_opacity=_track_back_opacity,
|
299
|
+
rail_fill=_rail_back_color, rail_opacity=_rail_back_opacity
|
300
|
+
)
|
289
301
|
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
302
|
+
self.element_thumb = self.create_thumb(
|
303
|
+
thumb_left, 0, # 直接使用计算出的左上角位置
|
304
|
+
thumb_width, thumb_width,
|
305
|
+
_thumb_radius, _thumb_inner_radius,
|
306
|
+
temppath=self.temppath2, fill=_thumb_back_color, fill_opacity=_thumb_back_opacity,
|
307
|
+
outline=_thumb_border_color, outline_opacity=_thumb_border_color_opacity,
|
308
|
+
outline2=_thumb_border_color2, outline2_opacity=_thumb_border_color2_opacity,
|
309
|
+
inner_fill=_thumb_inner_back_color, inner_fill_opacity=_thumb_inner_back_opacity,
|
310
|
+
)
|
299
311
|
|
300
312
|
self._e1 = self.tag_bind(self.element_thumb, "<Enter>", self._event_enter_thumb, add="+")
|
301
313
|
self._e2 = self.tag_bind(self.element_thumb, "<Leave>", self._event_leave_thumb, add="+")
|
302
314
|
|
303
315
|
def pos(self, event):
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
316
|
+
if self.attributes.state == "normal":
|
317
|
+
#print(event.x, event.y)
|
318
|
+
#if self.enter and self.button1:
|
319
|
+
# 获取滑块宽度
|
320
|
+
thumb_width = self.attributes.pressed.thumb.width
|
321
|
+
|
322
|
+
# 计算有效轨道长度
|
323
|
+
effective_width = self.winfo_width() - thumb_width
|
324
|
+
|
325
|
+
# 计算滑块位置比例(考虑滑块宽度边界)
|
326
|
+
ratio = (event.x - thumb_width/2) / effective_width
|
327
|
+
ratio = max(0, min(1, ratio)) # 限制在0-1范围内
|
328
|
+
|
329
|
+
# 计算实际值
|
330
|
+
value = self.attributes.min + ratio * (self.attributes.max - self.attributes.min)
|
331
|
+
if self.attributes.tick:
|
332
|
+
value = round(value)
|
333
|
+
self.dconfigure(value=value)
|
334
|
+
self._draw()
|
335
|
+
#print(self.focus_get())
|
336
|
+
|
337
|
+
def _event_off_button1(self, event=None):
|
338
|
+
if self.attributes.state == "normal":
|
339
|
+
if self.attributes.changed:
|
340
|
+
self.attributes.changed()
|
321
341
|
|
322
342
|
|
323
343
|
def _event_enter_thumb(self, event=None):
|
tkflu/text.py
CHANGED
@@ -195,14 +195,7 @@ class FluText(FluTextCanvas, DDrawWidget, FluToolTipBase):
|
|
195
195
|
)
|
196
196
|
self.itemconfigure(self.element_line, width=_underline_width, fill=_underline_fill)
|
197
197
|
"""
|
198
|
-
|
199
|
-
self.delete(self.element_line)
|
200
|
-
if _underline_fill:
|
201
|
-
self.element_line = self.create_line(
|
202
|
-
_radius / 3 + _border_width, self.winfo_height() - _radius / 3,
|
203
|
-
self.winfo_width() - _radius / 3 - _border_width * 2, self.winfo_height() - _radius / 3,
|
204
|
-
width=_underline_width, fill=_underline_fill
|
205
|
-
)
|
198
|
+
|
206
199
|
"""
|
207
200
|
if not hasattr(self, "element_text"):
|
208
201
|
self.element_text = self.create_window(
|
@@ -223,8 +216,16 @@ class FluText(FluTextCanvas, DDrawWidget, FluToolTipBase):
|
|
223
216
|
width=self.winfo_width() - _border_width * 2 - _radius,
|
224
217
|
height=self.winfo_height() - _border_width * 2 - _radius
|
225
218
|
)
|
219
|
+
if hasattr(self, "element_line"):
|
220
|
+
self.delete(self.element_line)
|
221
|
+
if _underline_fill:
|
222
|
+
self.element_line = self.create_line(
|
223
|
+
_radius / 3 + _border_width, self.winfo_height() - _radius / 3,
|
224
|
+
self.winfo_width() - _radius / 3 - _border_width * 2, self.winfo_height() - _radius / 3,
|
225
|
+
width=_underline_width, fill=_underline_fill
|
226
|
+
)
|
226
227
|
self.tag_raise(self.element_text, self.element_border)
|
227
|
-
self.tag_raise(self.element_line, self.
|
228
|
+
#self.tag_raise(self.element_line, self.element_text)
|
228
229
|
|
229
230
|
#self.tag_raise(self.element_text)
|
230
231
|
|
tkflu/togglebutton.py
CHANGED
@@ -91,9 +91,9 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget, FluToolTipBase, FluGra
|
|
91
91
|
|
92
92
|
self.bind("<<Clicked>>", lambda event=None: self.toggle(), add="+")
|
93
93
|
self.bind("<<Clicked>>", lambda event=None: self.focus_set(), add="+")
|
94
|
-
self.bind("<<Clicked>>", lambda event=None: self.
|
94
|
+
self.bind("<<Clicked>>", lambda event=None: self.invoke(), add="+")
|
95
95
|
|
96
|
-
self.bind("<Return>", lambda event=None: self.
|
96
|
+
self.bind("<Return>", lambda event=None: self.invoke(), add="+") # 可以使用回车键模拟点击
|
97
97
|
self.bind("<Return>", lambda event=None: self.toggle(), add="+") # 可以使用回车键模拟点击
|
98
98
|
|
99
99
|
from .defs import set_default_font
|
@@ -389,91 +389,94 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget, FluToolTipBase, FluGra
|
|
389
389
|
)
|
390
390
|
|
391
391
|
def invoke(self):
|
392
|
-
self.attributes.
|
392
|
+
if self.attributes.state == "normal":
|
393
|
+
self.attributes.command()
|
393
394
|
|
394
395
|
def toggle(self, animation_steps: int = None, animation_step_time: int = None):
|
395
|
-
if
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
uncheck.pressed.border_color2
|
407
|
-
|
408
|
-
check.pressed.border_color2
|
409
|
-
|
410
|
-
uncheck.pressed.border_color2_opacity
|
411
|
-
|
412
|
-
check.pressed.border_color2_opacity
|
413
|
-
|
414
|
-
self.attributes.checked
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
border_colors = self.generate_hex2hex(
|
419
|
-
check.pressed.border_color, uncheck.rest.border_color, steps
|
420
|
-
)
|
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
|
-
}
|
396
|
+
if self.attributes.state == "normal":
|
397
|
+
if animation_steps is None:
|
398
|
+
from .designs.animation import get_animation_steps
|
399
|
+
animation_steps = get_animation_steps()
|
400
|
+
if animation_step_time is None:
|
401
|
+
from .designs.animation import get_animation_step_time
|
402
|
+
animation_step_time = get_animation_step_time()
|
403
|
+
check = self.attributes.check
|
404
|
+
uncheck = self.attributes.uncheck
|
405
|
+
if not animation_steps == 0 or not animation_step_time == 0:
|
406
|
+
steps = animation_steps
|
407
|
+
if uncheck.pressed.border_color2 is None:
|
408
|
+
uncheck.pressed.border_color2 = uncheck.pressed.border_color
|
409
|
+
if check.pressed.border_color2 is None:
|
410
|
+
check.pressed.border_color2 = check.pressed.border_color
|
411
|
+
if uncheck.pressed.border_color2_opacity is None:
|
412
|
+
uncheck.pressed.border_color2_opacity = uncheck.pressed.border_color_opacity
|
413
|
+
if check.pressed.border_color2_opacity is None:
|
414
|
+
check.pressed.border_color2_opacity = check.pressed.border_color_opacity
|
415
|
+
if self.attributes.checked:
|
416
|
+
self.attributes.checked = False
|
417
|
+
back_colors = self.generate_hex2hex(
|
418
|
+
check.pressed.back_color, uncheck.rest.back_color, steps
|
471
419
|
)
|
472
|
-
self.
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
420
|
+
border_colors = self.generate_hex2hex(
|
421
|
+
check.pressed.border_color, uncheck.rest.border_color, steps
|
422
|
+
)
|
423
|
+
border_colors2 = self.generate_hex2hex(
|
424
|
+
check.pressed.border_color2, uncheck.rest.border_color2, steps
|
425
|
+
)
|
426
|
+
text_colors = self.generate_hex2hex(
|
427
|
+
check.pressed.text_color, uncheck.rest.text_color, steps
|
428
|
+
)
|
429
|
+
import numpy as np
|
430
|
+
back_opacitys = np.linspace(
|
431
|
+
float(check.pressed.back_opacity), float(uncheck.rest.back_opacity), steps).tolist()
|
432
|
+
border_color_opacitys = np.linspace(
|
433
|
+
float(check.pressed.border_color_opacity), float(uncheck.rest.border_color_opacity), steps).tolist()
|
434
|
+
border_color2_opacitys = np.linspace(
|
435
|
+
float(check.pressed.border_color2_opacity), float(uncheck.rest.border_color2_opacity), steps).tolist()
|
436
|
+
else:
|
437
|
+
self.attributes.checked = True
|
438
|
+
back_colors = self.generate_hex2hex(
|
439
|
+
uncheck.pressed.back_color, check.rest.back_color, steps
|
440
|
+
)
|
441
|
+
border_colors = self.generate_hex2hex(
|
442
|
+
uncheck.pressed.back_color, check.rest.back_color, steps
|
443
|
+
)
|
444
|
+
border_colors2 = self.generate_hex2hex(
|
445
|
+
uncheck.pressed.border_color2, check.rest.border_color2, steps
|
446
|
+
)
|
447
|
+
text_colors = self.generate_hex2hex(
|
448
|
+
uncheck.pressed.text_color, check.rest.text_color, steps
|
449
|
+
)
|
450
|
+
import numpy as np
|
451
|
+
back_opacitys = np.linspace(float(uncheck.pressed.back_opacity), float(check.rest.back_opacity),
|
452
|
+
steps).tolist()
|
453
|
+
border_color_opacitys = np.linspace(float(uncheck.pressed.border_color_opacity), float(check.rest.border_color_opacity),
|
454
|
+
steps).tolist()
|
455
|
+
border_color2_opacitys = np.linspace(float(uncheck.pressed.border_color2_opacity),
|
456
|
+
float(check.rest.border_color2_opacity),
|
457
|
+
steps).tolist()
|
458
|
+
for i in range(steps):
|
459
|
+
def update(ii=i):
|
460
|
+
from easydict import EasyDict
|
461
|
+
tempcolor = EasyDict(
|
462
|
+
{
|
463
|
+
"back_color": back_colors[ii],
|
464
|
+
"back_opacity": back_opacitys[ii],
|
465
|
+
"border_color": border_colors[ii],
|
466
|
+
"border_color_opacity": str(border_color_opacitys[ii]),
|
467
|
+
"border_color2": border_colors2[ii],
|
468
|
+
"border_color2_opacity": str(border_color2_opacitys[ii]),
|
469
|
+
"border_width": 1,
|
470
|
+
"text_color": text_colors[ii],
|
471
|
+
"radius": 6,
|
472
|
+
}
|
473
|
+
)
|
474
|
+
self._draw(None, tempcolor)
|
475
|
+
self.after(i*animation_step_time, update)
|
476
|
+
self.after(steps*animation_step_time+10, lambda: self._draw(None, None))
|
478
477
|
else:
|
479
|
-
self.attributes.checked
|
478
|
+
if self.attributes.checked:
|
479
|
+
self.attributes.checked = False
|
480
|
+
else:
|
481
|
+
self.attributes.checked = True
|
482
|
+
self._draw()
|
tkflu/tooltip.py
CHANGED
@@ -37,18 +37,6 @@ class FluToolTip(FluPopupWindow):
|
|
37
37
|
round(self._widget.winfo_rootx() + self._widget.winfo_width() / 2 - self.winfo_width() / 2),
|
38
38
|
round(self._widget.winfo_rooty() + self._widget.winfo_height() + 2)
|
39
39
|
)
|
40
|
-
self.wm_attributes("-alpha", 0.0)
|
41
|
-
self.deiconify()
|
42
|
-
|
43
|
-
def fade_in(step=0):
|
44
|
-
FRAMES_COUNT = 20
|
45
|
-
alpha = step / FRAMES_COUNT # 按帧数变化,从0到1
|
46
|
-
self.wm_attributes("-alpha", alpha)
|
47
|
-
if step < FRAMES_COUNT:
|
48
|
-
# 每执行一次,增加一次透明度,间隔由帧数决定
|
49
|
-
self.after(int(round(self._show_time/FRAMES_COUNT)), lambda: fade_in(step + 1))
|
50
|
-
|
51
|
-
fade_in() # 启动动画
|
52
40
|
|
53
41
|
self.id = self.after(self._delay, check)
|
54
42
|
self._enter = True
|
@@ -104,6 +92,9 @@ class FluToolTip2(FluPopupWindow):
|
|
104
92
|
|
105
93
|
self.theme(mode)
|
106
94
|
|
95
|
+
def popup2(self, x, y):
|
96
|
+
self.geometry(f"+{x}+{y}")
|
97
|
+
|
107
98
|
def show(self, event: Event):
|
108
99
|
self.popup(
|
109
100
|
round(event.x_root - self.winfo_width() / 2),
|
@@ -115,7 +106,7 @@ class FluToolTip2(FluPopupWindow):
|
|
115
106
|
self.withdraw()
|
116
107
|
|
117
108
|
def move(self, event):
|
118
|
-
self.
|
109
|
+
self.popup2(
|
119
110
|
round(event.x_root - self.winfo_width() / 2),
|
120
111
|
round(event.y_root + 10)
|
121
112
|
)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: tkfluent
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.5
|
4
4
|
Summary: Fluent(SunValley) Design for Tkinter. Modern GUI
|
5
5
|
License: GPL-3.0
|
6
6
|
Keywords: tkfluent,tksvg,tkinter,fluent,modern,GUI,interface
|
@@ -30,17 +30,20 @@ Requires-Dist: easydict (>=1.13,<2.0)
|
|
30
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.1.
|
33
|
+
Requires-Dist: tkdeft (==0.1.1)
|
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
|
37
37
|
Description-Content-Type: text/markdown
|
38
38
|
|
39
|
-
|
39
|
+
<div align="center">
|
40
40
|
|
41
|
+
# tkfluent
|
41
42
|
`tkinter`现代化组件库。设计来于`Fluent` `WinUI3` 设计
|
42
43
|
|
43
|
-
|
44
|
+
</div>
|
45
|
+
|
46
|
+
|
44
47
|

|
45
48
|

|
46
49
|
|
@@ -1,8 +1,8 @@
|
|
1
|
-
tkflu/__init__.py,sha256=
|
2
|
-
tkflu/__main__.py,sha256=
|
1
|
+
tkflu/__init__.py,sha256=VuP9kfPYQLNi0qMFkQD2-9df0ltf59g8cRVL1CWKlR0,1050
|
2
|
+
tkflu/__main__.py,sha256=AohjpJd-T5sXIQWH9vdNv4WkP7G5417GXjcwHia2AYA,3787
|
3
3
|
tkflu/badge.py,sha256=p9kY-JbsDraohNg2ZJMk3xA4PS9LEKxFpaSGX_NgHBw,5836
|
4
4
|
tkflu/button.py,sha256=N6wvcNNsqVf_Rb0c1ZOw3JpXqJcR9QJAFvjl2aaQXPw,19263
|
5
|
-
tkflu/bwm.py,sha256=
|
5
|
+
tkflu/bwm.py,sha256=dAkBkoiZTzxshU2SwJCcFd8L9Ftf6JS7PSqC6c2yVBo,8578
|
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
|
@@ -11,49 +11,52 @@ tkflu/defs.py,sha256=pKVQUm-dK12QiU2MMFD7sxoiXfhEsezN_uAV6eE5Cbk,1144
|
|
11
11
|
tkflu/demos/__init__.py,sha256=0IV8vUG2kAp90bbRXGj7Mte2ABXrZ_rzIyZxmB1fGLY,102
|
12
12
|
tkflu/demos/acrylic1.py,sha256=-1SniTxrQeAYz6VSxHu7UsAmZeSIBaElgC2KYVVAghU,423
|
13
13
|
tkflu/demos/demo1.py,sha256=xR4a1qOrzxHXhVFlluTjp9izo7sO_YFbS_BGZj1LbZs,112
|
14
|
-
tkflu/demos/designer.py,sha256=
|
14
|
+
tkflu/demos/designer.py,sha256=iiQqZxsYW0jBo60yigwLx9LV9RQQGEd81ewTHmVB-S4,960
|
15
15
|
tkflu/demos/grad.py,sha256=neRGPq7VkGEzzUJymNdBi7EYI55wMes-OX3l-DQSonA,2195
|
16
16
|
tkflu/demos/grad2.py,sha256=2ZixYVCaqWoWxTqYD4p6x9Sz7VUT3KCeQDNzOX0aAkI,442
|
17
17
|
tkflu/demos/grad3.py,sha256=vJQ70C0amAJMbDvudOvHBqwb59SuXoWDCk7QovFuFts,441
|
18
|
+
tkflu/demos/screenshot.py,sha256=jYvNHHukzUKzzefyL4isQbd8PDbemHQFZpRWyUTF2iQ,66
|
19
|
+
tkflu/demos/scroll.py,sha256=x5nh5ytg6IQZKowm0SR1Mrm7Elf586hAKI76LH7qtEQ,528
|
18
20
|
tkflu/demos/test.py,sha256=DMontyt61qq4ULVExSrHA9tbQlXHH_KSkQPv1EV8TEk,153
|
19
21
|
tkflu/demos/tooltip.py,sha256=_tTIUuVo8x9YpdikPLxTvbB3wF1vb-JKppVDgzHXj2k,286
|
20
|
-
tkflu/designs/__init__.py,sha256=
|
21
|
-
tkflu/designs/animation.py,sha256=
|
22
|
+
tkflu/designs/__init__.py,sha256=c7kL0jokEen-EEvW7PBXFfKcZHtC_rdcxM8nHGfVpv8,297
|
23
|
+
tkflu/designs/animation.py,sha256=yn9GCd7sTiHLGgJ6xOMCRqJnVT1XyEoE-Ots_XtU_Ag,1183
|
22
24
|
tkflu/designs/badge.py,sha256=SVwDrQPltscB7YDvw5qhPdepKy1S-pcdD6OyYfonwzQ,1463
|
23
25
|
tkflu/designs/button.py,sha256=yEKRrH5dcDQCaGGqsYRnKgaCPSSd8cU__31LOQf2JX0,12274
|
24
|
-
tkflu/designs/design.py,sha256=
|
26
|
+
tkflu/designs/design.py,sha256=Gpe9SYgiasea_1wBA_ykd0qPzuVnUJMP9SVvrLdjU9Y,1357
|
25
27
|
tkflu/designs/entry.py,sha256=iUilCpOl_zs_PbklIWhKWkkaZGQbt0bCprrZwhE3CEs,5060
|
26
|
-
tkflu/designs/fonts/__init__.py,sha256=
|
28
|
+
tkflu/designs/fonts/__init__.py,sha256=4kE0elI2pNYJksqvdJUXM6mM8Yk_2MQR90XGOa6rvs0,1285
|
29
|
+
tkflu/designs/fonts/segoe_fluent_icons.ttf,sha256=gvXcDgy59B761J5UI8dnaK4PyW4GKgiTtscpuGMDMBM,408752
|
27
30
|
tkflu/designs/fonts/segoeui.ttf,sha256=dPKz0MIM9zgOsSGgn9fN_cHM3RKgDbg8rsD-tItNufc,975088
|
28
|
-
tkflu/designs/frame.py,sha256=
|
31
|
+
tkflu/designs/frame.py,sha256=tpvgnnzbriLLQEAxuSamqo5meadDxqGf2dAaZh5Kks4,1167
|
29
32
|
tkflu/designs/gradient.py,sha256=f5_FiWfYYfQ_obAj1n2qtNKWvxfC1wCOIONozNa27xs,2017
|
30
33
|
tkflu/designs/label.py,sha256=0uNOWxlGvpbeAh5NLb_ZTyyDTznW8i32rLXkVBkC19M,218
|
31
|
-
tkflu/designs/menubar.py,sha256=
|
34
|
+
tkflu/designs/menubar.py,sha256=I3deMwvBUT1iASLMg7eXcovTI6fc-zvYPcnGPn9r4UU,295
|
32
35
|
tkflu/designs/primary_color.py,sha256=TKhGFX8jtFPQYmEV2f0Yq9jMuy0KG3ewTtsOBa1eds4,746
|
33
|
-
tkflu/designs/scrollbar.py,sha256=
|
36
|
+
tkflu/designs/scrollbar.py,sha256=bKH4xwCvsqACocIOXjPZIGULDxRIiLaoGVdYkwknCW8,938
|
34
37
|
tkflu/designs/slider.py,sha256=UDi4sw4K9fe-FGvhl4Hhr4zqZtfOdSiCjhdKFQmw6Q0,8088
|
35
|
-
tkflu/designs/text.py,sha256=
|
38
|
+
tkflu/designs/text.py,sha256=0g8gvWZYXWYb_HrqGZhureZicdErnDyKCqH8LCXLqrg,5069
|
36
39
|
tkflu/designs/tooltip.py,sha256=OFUIO9-EMNjapF9zC5PuLW26HFGib-p800hNIxaWT5Q,442
|
37
40
|
tkflu/designs/window.py,sha256=XHMvT0lVsJSeUApMf_bf9ipLSWT-BirkOiiUnVx-N48,625
|
38
41
|
tkflu/entry.py,sha256=b4kblEEmZRqtuDM2E5_hhb_8MhTgujbwTNP7aICB6qM,10852
|
39
42
|
tkflu/frame.py,sha256=oMy6fZcDfoYEZsGnKw23wlMAlojckavs7X6JbB8OQpw,11631
|
40
43
|
tkflu/icons.py,sha256=Xzrc9WzexncYEPXqnVg3ywWv_7kLZLyYC5WtaRv30PQ,7129
|
41
44
|
tkflu/image.py,sha256=w5CbUBsn5KG8EekLwMyXC5T0w6E_dlP8tlKjnut9194,58
|
42
|
-
tkflu/label.py,sha256=
|
45
|
+
tkflu/label.py,sha256=Y3kvljeXnvSq_rOPB-G_v87D3jS7nnF-kS41vRZS6jg,2981
|
43
46
|
tkflu/listbox.py,sha256=gD_oNNWVZtm5qXQ8bVBNRqJL6CGiIYtvhxztM9huzew,9991
|
44
47
|
tkflu/litenav.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
48
|
tkflu/menu.py,sha256=j15DzZuWGsG_xMvsDh7XfO-aV6zlF9AhzHN2rdjwQLU,3263
|
46
|
-
tkflu/menubar.py,sha256=
|
47
|
-
tkflu/popupmenu.py,sha256=
|
48
|
-
tkflu/popupwindow.py,sha256=
|
49
|
-
tkflu/scrollbar.py,sha256=
|
50
|
-
tkflu/slider.py,sha256=
|
51
|
-
tkflu/text.py,sha256=
|
49
|
+
tkflu/menubar.py,sha256=Y5JD9h2RoLeNFlaRyAY47lxckrhb0VcI7w53SHdtCPw,6435
|
50
|
+
tkflu/popupmenu.py,sha256=cn0clfnJuibCbHebSZB2CaaAfks7IFJ5yQPgbi59CUs,1589
|
51
|
+
tkflu/popupwindow.py,sha256=nN-YMSddR9gT5TnC8fug_Pme7r_MCsFNN3k5BZvGhOo,2543
|
52
|
+
tkflu/scrollbar.py,sha256=SPYGsZ2DXoaMFh_kMqn9WFysYBaVRmi_zLBB8ZavOjU,14160
|
53
|
+
tkflu/slider.py,sha256=XOWsS8h0zaLI7qwgKgsFQe9bxZ1ACbLVm4tE6SGJetQ,18836
|
54
|
+
tkflu/text.py,sha256=1GKUJ3-e7V0O_pObbBbhW_kt4WsN82wXTqG1KlEGf-Q,12726
|
52
55
|
tkflu/thememanager.py,sha256=N2aMX2CfMvXFYz0N8vi-9zHjxzvGumhDsKJJ0UgroAA,1914
|
53
|
-
tkflu/togglebutton.py,sha256=
|
54
|
-
tkflu/tooltip.py,sha256=
|
56
|
+
tkflu/togglebutton.py,sha256=aCEyvTEsi_rbOPagBvzuZqxGnJ-NO-9f0LO7LOlxWEg,20799
|
57
|
+
tkflu/tooltip.py,sha256=6nW-1eVKcyyX9kdjzetv0n83PxNmr5N1Gd7tztaw8bE,4468
|
55
58
|
tkflu/toplevel.py,sha256=dPrnhHTiciJtrlsh5oZNuv77Q-YCRK6OgQQ0mrhfTeo,1382
|
56
59
|
tkflu/window.py,sha256=2LjgL2KZIAYA04fXWQvfiNMYj_PKzlpSuEZrR94qHAs,1483
|
57
|
-
tkfluent-0.1.
|
58
|
-
tkfluent-0.1.
|
59
|
-
tkfluent-0.1.
|
60
|
+
tkfluent-0.1.5.dist-info/METADATA,sha256=99lfDe4PLG4TeZudnBZqaNGxfgHki-t-sd4kze4o2UQ,38240
|
61
|
+
tkfluent-0.1.5.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
62
|
+
tkfluent-0.1.5.dist-info/RECORD,,
|
File without changes
|