tkfluent 0.0.8__py3-none-any.whl → 0.1.0__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/slider.py CHANGED
@@ -29,14 +29,14 @@ class FluSliderDraw(DSvgDraw):
29
29
  border.add_stop_color(0.954545, outline2, outline2_opacity)
30
30
  drawing[1].defs.add(border)
31
31
  stroke = f"url(#{border.get_id()})"
32
- print("x1:", x1, "\n", "y1:", y1, "\n", "x2:", x2, "\n", "y2:", y2, "\n", "r1:", r1, "\n", sep="")
32
+ #print("x1:", x1, "\n", "y1:", y1, "\n", "x2:", x2, "\n", "y2:", y2, "\n", "r1:", r1, "\n", sep="")
33
33
 
34
34
  x = x1 + r1 - 4
35
35
  xx = x2 - r1 + 4
36
36
 
37
- print("track_x1:", x, "\n", "track_x2:", xx, sep="")
37
+ #print("track_x1:", x, "\n", "track_x2:", xx, sep="")
38
38
 
39
- print("")
39
+ #print("")
40
40
 
41
41
  drawing[1].add(
42
42
  drawing[1].rect(
@@ -188,9 +188,9 @@ class FluSlider(FluSliderCanvas, DDrawWidget):
188
188
 
189
189
  super()._draw(event)
190
190
 
191
- print("width:", self.winfo_width(), "\n", "height:", self.winfo_height(), sep="")
191
+ #print("width:", self.winfo_width(), "\n", "height:", self.winfo_height(), sep="")
192
192
 
193
- print("")
193
+ #print("")
194
194
 
195
195
  self.delete("all")
196
196
 
@@ -263,8 +263,8 @@ class FluSlider(FluSliderCanvas, DDrawWidget):
263
263
  self.dconfigure(
264
264
  value=value
265
265
  )
266
- print("value:", value, sep="")
267
- print("")
266
+ #print("value:", value, sep="")
267
+ #print("")
268
268
 
269
269
  def _event_button1_motion(self, event):
270
270
  self.pos(event)
tkflu/text.py CHANGED
@@ -72,7 +72,10 @@ class FluTextCanvas(DCanvas):
72
72
  create_roundrect = create_round_rectangle
73
73
 
74
74
 
75
- class FluText(FluTextCanvas, DDrawWidget):
75
+ from .tooltip import FluToolTipBase
76
+
77
+
78
+ class FluText(FluTextCanvas, DDrawWidget, FluToolTipBase):
76
79
  def __init__(self, *args,
77
80
  width=120,
78
81
  height=90,
tkflu/thememanager.py CHANGED
@@ -3,7 +3,7 @@ from .toplevel import FluToplevel
3
3
 
4
4
 
5
5
  class FluThemeManager(object):
6
- def __init__(self, window=None, mode: str = "light"):
6
+ def __init__(self, window=None, mode: str = "light", delay: int or None = 100):
7
7
  if window:
8
8
  self._window = window
9
9
  else:
@@ -11,18 +11,23 @@ class FluThemeManager(object):
11
11
  self._window = _default_root
12
12
  self._mode = mode
13
13
  self.mode(self._mode)
14
- self._window.after(100, lambda: self.mode(self._mode))
14
+ self._window.after(delay, lambda: self.mode(self._mode))
15
15
 
16
- def mode(self, mode: str):
17
- self._mode = mode
18
- if hasattr(self._window, "theme"):
19
- self._window.theme(mode=mode)
20
- if hasattr(self._window, "_draw"):
21
- self._window._draw()
22
- self._window.update()
23
- for widget in self._window.winfo_children():
24
- if hasattr(widget, "theme"):
25
- widget.theme(mode=mode)
26
- if hasattr(widget, "_draw"):
27
- widget._draw()
28
- widget.update()
16
+ def mode(self, mode: str, delay: int or None = None):
17
+ def _():
18
+ self._mode = mode
19
+ if hasattr(self._window, "theme"):
20
+ self._window.theme(mode=mode)
21
+ if hasattr(self._window, "_draw"):
22
+ self._window._draw()
23
+ self._window.update()
24
+ for widget in self._window.winfo_children():
25
+ if hasattr(widget, "theme"):
26
+ widget.theme(mode=mode)
27
+ if hasattr(widget, "_draw"):
28
+ widget._draw()
29
+ widget.update()
30
+ if delay:
31
+ self._window.after(delay, _)
32
+ else:
33
+ _()
tkflu/togglebutton.py CHANGED
@@ -1,3 +1,4 @@
1
+ from easydict import EasyDict
1
2
  from tkdeft.windows.draw import DSvgDraw
2
3
  from tkdeft.windows.canvas import DCanvas
3
4
  from tkdeft.windows.drawwidget import DDrawWidget
@@ -59,7 +60,11 @@ class FluToggleButtonCanvas(DCanvas):
59
60
  create_roundrect = create_round_rectangle_with_text
60
61
 
61
62
 
62
- class FluToggleButton(FluToggleButtonCanvas, DDrawWidget):
63
+ from .tooltip import FluToolTipBase
64
+ from .designs.gradient import FluGradient
65
+
66
+
67
+ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget, FluToolTipBase, FluGradient):
63
68
  def __init__(self, *args,
64
69
  text="",
65
70
  width=120,
@@ -114,7 +119,7 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget):
114
119
 
115
120
  self.theme(mode=mode)
116
121
 
117
- def _draw(self, event=None):
122
+ def _draw(self, event=None, tempcolor: dict = None):
118
123
  super()._draw(event)
119
124
 
120
125
  width = self.winfo_width()
@@ -125,39 +130,49 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget):
125
130
  state = self.dcget("state")
126
131
 
127
132
  _dict = None
128
-
129
- if not self.attributes.checked:
130
- if state == "normal":
131
- if self.enter:
132
- if self.button1:
133
- _dict = self.attributes.uncheck.pressed
133
+ if not tempcolor:
134
+ if not self.attributes.checked:
135
+ if state == "normal":
136
+ if self.enter:
137
+ if self.button1:
138
+ _dict = self.attributes.uncheck.pressed
139
+ else:
140
+ _dict = self.attributes.uncheck.hover
134
141
  else:
135
- _dict = self.attributes.uncheck.hover
142
+ _dict = self.attributes.uncheck.rest
136
143
  else:
137
- _dict = self.attributes.uncheck.rest
144
+ _dict = self.attributes.uncheck.disabled
138
145
  else:
139
- _dict = self.attributes.uncheck.disabled
140
- else:
141
- if state == "normal":
142
- if self.enter:
143
- if self.button1:
144
- _dict = self.attributes.check.pressed
146
+ if state == "normal":
147
+ if self.enter:
148
+ if self.button1:
149
+ _dict = self.attributes.check.pressed
150
+ else:
151
+ _dict = self.attributes.check.hover
145
152
  else:
146
- _dict = self.attributes.check.hover
153
+ _dict = self.attributes.check.rest
147
154
  else:
148
- _dict = self.attributes.check.rest
149
- else:
150
- _dict = self.attributes.check.disabled
151
-
152
- _back_color = _dict.back_color
153
- _back_opacity = _dict.back_opacity
154
- _border_color = _dict.border_color
155
- _border_color_opacity = _dict.border_color_opacity
156
- _border_color2 = _dict.border_color2
157
- _border_color2_opacity = _dict.border_color2_opacity
158
- _border_width = _dict.border_width
159
- _radius = _dict.radius
160
- _text_color = _dict.text_color
155
+ _dict = self.attributes.check.disabled
156
+
157
+ _back_color = _dict.back_color
158
+ _back_opacity = _dict.back_opacity
159
+ _border_color = _dict.border_color
160
+ _border_color_opacity = _dict.border_color_opacity
161
+ _border_color2 = _dict.border_color2
162
+ _border_color2_opacity = _dict.border_color2_opacity
163
+ _border_width = _dict.border_width
164
+ _radius = _dict.radius
165
+ _text_color = _dict.text_color
166
+ else:
167
+ _back_color = tempcolor.back_color
168
+ _back_opacity = tempcolor.back_opacity
169
+ _border_color = tempcolor.border_color
170
+ _border_color_opacity = tempcolor.border_color_opacity
171
+ _border_color2 = tempcolor.border_color2
172
+ _border_color2_opacity = tempcolor.border_color2_opacity
173
+ _border_width = tempcolor.border_width
174
+ _radius = tempcolor.radius
175
+ _text_color = tempcolor.text_color
161
176
 
162
177
  self.element_border = self.create_round_rectangle_with_text(
163
178
  0, 0, width, height, _radius, temppath=self.temppath,
@@ -376,9 +391,90 @@ class FluToggleButton(FluToggleButtonCanvas, DDrawWidget):
376
391
  def invoke(self):
377
392
  self.attributes.command()
378
393
 
379
- def toggle(self):
394
+ def toggle(self, animate_steps: int = 10):
395
+ """
396
+
397
+ "back_color": "#ffffff",
398
+ "back_opacity": "0.7",
399
+ "border_color": "#000000",
400
+ "border_color_opacity": "0.2",
401
+ "border_color2": "#000000",
402
+ "border_color2_opacity": "0.3",
403
+ "border_width": 1,
404
+ "radius": 6,
405
+ "text_color": "#000000",
406
+ :return:
407
+ """
408
+ steps = animate_steps
409
+ check = self.attributes.check
410
+ uncheck = self.attributes.uncheck
411
+ if uncheck.pressed.border_color2 is None:
412
+ uncheck.pressed.border_color2 = uncheck.pressed.border_color
413
+ if check.pressed.border_color2 is None:
414
+ check.pressed.border_color2 = check.pressed.border_color
415
+ if uncheck.pressed.border_color2_opacity is None:
416
+ uncheck.pressed.border_color2_opacity = uncheck.pressed.border_color_opacity
417
+ if check.pressed.border_color2_opacity is None:
418
+ check.pressed.border_color2_opacity = check.pressed.border_color_opacity
380
419
  if self.attributes.checked:
381
420
  self.attributes.checked = False
421
+ back_colors = self.generate_hex2hex(
422
+ check.pressed.back_color, uncheck.rest.back_color, steps
423
+ )
424
+ border_colors = self.generate_hex2hex(
425
+ check.pressed.border_color, uncheck.rest.border_color, steps
426
+ )
427
+ border_colors2 = self.generate_hex2hex(
428
+ check.pressed.border_color2, uncheck.rest.border_color2, steps
429
+ )
430
+ text_colors = self.generate_hex2hex(
431
+ check.pressed.text_color, uncheck.rest.text_color, steps
432
+ )
433
+ import numpy as np
434
+ back_opacitys = np.linspace(
435
+ float(check.pressed.back_opacity), float(uncheck.rest.back_opacity), steps).tolist()
436
+ border_color_opacitys = np.linspace(
437
+ float(check.pressed.border_color_opacity), float(uncheck.rest.border_color_opacity), steps).tolist()
438
+ border_color2_opacitys = np.linspace(
439
+ float(check.pressed.border_color2_opacity), float(uncheck.rest.border_color2_opacity), steps).tolist()
382
440
  else:
383
441
  self.attributes.checked = True
384
- self._draw(None)
442
+ back_colors = self.generate_hex2hex(
443
+ uncheck.pressed.back_color, check.rest.back_color, steps
444
+ )
445
+ border_colors = self.generate_hex2hex(
446
+ uncheck.pressed.back_color, check.rest.back_color, steps
447
+ )
448
+ border_colors2 = self.generate_hex2hex(
449
+ uncheck.pressed.border_color2, check.rest.border_color2, steps
450
+ )
451
+ text_colors = self.generate_hex2hex(
452
+ uncheck.pressed.text_color, check.rest.text_color, steps
453
+ )
454
+ import numpy as np
455
+ back_opacitys = np.linspace(float(uncheck.pressed.back_opacity), float(check.rest.back_opacity),
456
+ steps).tolist()
457
+ border_color_opacitys = np.linspace(float(uncheck.pressed.border_color_opacity), float(check.rest.border_color_opacity),
458
+ steps).tolist()
459
+ border_color2_opacitys = np.linspace(float(uncheck.pressed.border_color2_opacity),
460
+ float(check.rest.border_color2_opacity),
461
+ steps).tolist()
462
+ for i in range(steps):
463
+ def update(ii=i):
464
+ from easydict import EasyDict
465
+ tempcolor = EasyDict(
466
+ {
467
+ "back_color": back_colors[ii],
468
+ "back_opacity": back_opacitys[ii],
469
+ "border_color": border_colors[ii],
470
+ "border_color_opacity": str(border_color_opacitys[ii]),
471
+ "border_color2": border_colors2[ii],
472
+ "border_color2_opacity": str(border_color2_opacitys[ii]),
473
+ "border_width": 1,
474
+ "text_color": text_colors[ii],
475
+ "radius": 6,
476
+ }
477
+ )
478
+ self._draw(None, tempcolor)
479
+ self.after(i*10, update)
480
+ self.after(steps*10+10, lambda: self._draw(None, None))
tkflu/tooltip.py CHANGED
@@ -1,8 +1,151 @@
1
1
  from .popupwindow import FluPopupWindow
2
+ from tkinter import Event, Widget
2
3
 
3
4
 
4
5
  class FluToolTip(FluPopupWindow):
5
- def __init__(self, widget, *args, **kwargs):
6
- super().__init__(*args, **kwargs)
6
+ def __init__(self, widget: Widget, text, mode="light", delay=400, show_time=100.0, *args, **kwargs):
7
+ super().__init__(*args, transparent_color="#ebebeb", **kwargs)
8
+
9
+ from .label import FluLabel
10
+ from .frame import FluFrame
11
+
12
+ self.overrideredirect(True)
13
+
14
+ self._delay = delay
15
+ self._show_time = show_time
16
+ self._widget = widget
17
+
18
+ self._frame = FluFrame(self)
19
+ self._frame.theme(mode, style="popupmenu")
20
+
21
+ self._label = FluLabel(self._frame, text=text)
22
+ self._label.pack(fill="both", expand=True, padx=3, pady=3)
23
+
24
+ self._frame.pack(fill="both", expand=True, padx=3, pady=3)
25
+
26
+ self._widget.bind('<Enter>', self.enter, add="+")
27
+ self._widget.bind('<Leave>', self.leave, add="+")
28
+
29
+ #self.theme(mode)
30
+
31
+ def enter(self, event: Event):
32
+ def check() -> None:
33
+ if self._enter:
34
+ # 先定位工具提示位置
35
+ self.popup(
36
+ round(self._widget.winfo_rootx() + self._widget.winfo_width() / 2 - self.winfo_width() / 2),
37
+ round(self._widget.winfo_rooty() + self._widget.winfo_height() + 2)
38
+ )
39
+ self.wm_attributes("-alpha", 0.0)
40
+ self.deiconify()
41
+
42
+ # 设置初始透明度为0
43
+
44
+
45
+ # 渐显动画
46
+ def fade_in(step=0):
47
+ alpha = step / 10 # 分10步从0到1
48
+ 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
+
52
+ fade_in() # 启动动画
53
+
54
+ self.id = self.after(self._delay, check)
55
+ self._enter = True
56
+
57
+ def leave(self, event):
58
+ self.after_cancel(self.id)
59
+ self._enter = False
60
+ self.withdraw()
61
+
62
+ def theme(self, mode=None):
63
+ from .designs.tooltip import tooltip
64
+ n = tooltip(mode)
65
+ self.configure(
66
+ background=n["back_color"]
67
+ )
68
+ self.wm_attributes("-transparentcolor", n["back_color"])
69
+ #print(n["back_color"])
70
+ if hasattr(self, "_frame"):
71
+ self._frame.dconfigure(
72
+ back_color=n["frame_color"],
73
+ border_color=n["frame_border_color"],
74
+ border_color_opacity=1,
75
+ border_width=2,
76
+ radius=7,
77
+ )
78
+ if hasattr(self, "_label"):
79
+ self._label.theme(mode)
80
+ super().theme(mode)
81
+
82
+
83
+ class FluToolTip2(FluPopupWindow):
84
+ def __init__(self, widget, text, mode="light", *args, **kwargs):
85
+ super().__init__(*args, transparent_color="#ebebeb", **kwargs)
86
+
87
+ from .label import FluLabel
88
+ from .frame import FluFrame
89
+
90
+ self.overrideredirect(True)
91
+
92
+ self._widget = widget
93
+
94
+ self._frame = FluFrame(self)
95
+ self._frame.theme(mode, style="popupmenu")
96
+
97
+ self._label = FluLabel(self._frame, text=text)
98
+ self._label.pack(fill="both", expand=True, padx=3, pady=3)
99
+
100
+ self._frame.pack(fill="both", expand=True, padx=3, pady=3)
101
+
102
+ self._widget.bind('<Enter>', self.show, add="+")
103
+ self._widget.bind('<Leave>', self.hide, add="+")
104
+ self._widget.bind('<Motion>', self.move, add="+")
105
+
106
+ #self.theme(mode)
107
+
108
+ def show(self, event: Event):
109
+ self.popup(
110
+ round(event.x_root - self.winfo_width() / 2),
111
+ round(event.y_root + 10)
112
+ )
113
+ self.deiconify()
114
+
115
+ def hide(self, event):
116
+ self.withdraw()
117
+
118
+ def move(self, event):
119
+ self.popup(
120
+ round(event.x_root - self.winfo_width() / 2),
121
+ round(event.y_root + 10)
122
+ )
123
+
124
+ def theme(self, mode=None):
125
+ from .designs.tooltip import tooltip
126
+ n = tooltip(mode)
127
+ self.configure(
128
+ background=n["back_color"]
129
+ )
130
+ self.wm_attributes("-transparentcolor", n["back_color"])
131
+ #print(n["back_color"])
132
+ if hasattr(self, "_frame"):
133
+ self._frame.dconfigure(
134
+ back_color=n["frame_color"],
135
+ border_color=n["frame_border_color"],
136
+ border_color_opacity=1,
137
+ border_width=2,
138
+ radius=7,
139
+ )
140
+ if hasattr(self, "_label"):
141
+ self._label.theme(mode)
142
+ super().theme(mode)
143
+
144
+
145
+ class FluToolTipBase:
146
+ def tooltip(self, *args, way=0, **kwargs):
147
+ if way == 0:
148
+ self._tooltip = FluToolTip(*args, widget=self, **kwargs)
149
+ elif way == 1:
150
+ self._tooltip = FluToolTip2(*args, widget=self, **kwargs)
7
151
 
8
- self.widget = widget
tkflu/window.py CHANGED
@@ -8,27 +8,31 @@ class FluWindow(Tk, BWm, DObject):
8
8
  """Fluent设计的主窗口"""
9
9
 
10
10
  def __init__(self, *args, className="tkdeft", mode="light", **kwargs):
11
-
12
11
  """
13
- 初始化类
12
+ 初始化类实例,继承自tkinter.TK并添加Fluent主题支持
14
13
 
15
- :param args: 参照tkinter.TK.__init__
16
- :param className: 参照tkinter.TK.__init__
17
- :param mode: Fluent主题模式 分为 “light” “dark
18
- :param kwargs: 参照tkinter.TK.__init__
14
+ :param args: 可变位置参数,传递给父类tkinter.TK.__init__的未命名参数
15
+ :param className: 窗口类名,默认"tkdeft",传递给父类tkinter.TK.__init__
16
+ :param mode: Fluent主题模式,可选值为"light"(明亮)或"dark"(暗黑),默认"light"
17
+ :param kwargs: 可变关键字参数,传递给父类tkinter.TK.__init__的命名参数
19
18
  """
20
19
 
20
+ # 初始化Fluent主题
21
21
  self._init(mode)
22
22
 
23
+ # 标记为未使用自定义配置
23
24
  self.custom = False
24
25
 
26
+ # 调用父类tkinter.TK的初始化方法
25
27
  super().__init__(*args, className=className, **kwargs)
26
28
 
29
+ # 设置窗口图标
27
30
  from .icons import light
28
31
  from tkinter import PhotoImage
29
-
30
32
  self.iconphoto(False, PhotoImage(file=light()))
31
33
 
32
- self.bind("<Configure>", self._event_configure, add="+")
33
- self.bind("<Escape>", self._event_key_esc, add="+")
34
- self.protocol("WM_DELETE_WINDOW", self._event_delete_window)
34
+ # 绑定事件处理函数
35
+ self.bind("<Configure>", self._event_configure, add="+") # 窗口大小/位置改变事件
36
+ self.bind("<Escape>", self._event_key_esc, add="+") # ESC键按下事件
37
+ self.protocol("WM_DELETE_WINDOW", self._event_delete_window) # 窗口关闭事件
38
+
@@ -0,0 +1,83 @@
1
+ Metadata-Version: 2.3
2
+ Name: tkfluent
3
+ Version: 0.1.0
4
+ Summary: Fluent Design for Tkinter
5
+ License: MIT
6
+ Keywords: tkfluent,tksvg,tkinter,fluent,modern,UI,interface
7
+ Author: XiangQinxi
8
+ Author-email: xiangqinxi@outlook.com
9
+ Requires-Python: >=3.8,<4.0
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Environment :: MacOS X
12
+ Classifier: Environment :: Win32 (MS Windows)
13
+ Classifier: Environment :: X11 Applications
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Natural Language :: Chinese (Simplified)
16
+ Classifier: Natural Language :: English
17
+ Classifier: Operating System :: MacOS
18
+ Classifier: Operating System :: Microsoft :: Windows
19
+ Classifier: Operating System :: POSIX :: Linux
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3.8
22
+ Classifier: Programming Language :: Python :: 3.9
23
+ Classifier: Programming Language :: Python :: 3.10
24
+ Classifier: Programming Language :: Python :: 3.11
25
+ Classifier: Programming Language :: Python :: 3.12
26
+ Classifier: Programming Language :: Python :: 3.13
27
+ Classifier: Programming Language :: Tcl
28
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
+ Requires-Dist: easydict (>=1.13,<2.0)
30
+ Requires-Dist: numpy (>=2.3.1,<3.0.0)
31
+ Requires-Dist: pillow (>=10.2.0,<11.0.0)
32
+ Requires-Dist: svgwrite (>=1.4.3,<2.0.0)
33
+ Requires-Dist: tkdeft (>=0.0.9,<0.0.10)
34
+ Requires-Dist: tkextrafont (>=0.6.3,<0.7.0)
35
+ Requires-Dist: tksvg (>=0.7.4,<0.8.0)
36
+ Project-URL: Documentation, https://tkfluent.netlify.app
37
+ Description-Content-Type: text/markdown
38
+
39
+ # tkfluent
40
+
41
+ `tkinter`现代化组件库。设计来于`Fluent` `WinUI3` 设计
42
+
43
+ ![](https://learn.microsoft.com/zh-cn/windows/apps/images/logo-winui.png)
44
+
45
+ ## 依赖图
46
+ ```bash
47
+ PS .\tkfluent> poetry show --tree
48
+ easydict 1.13 Access dict values as attributes (works recursively).
49
+ pillow 10.4.0 Python Imaging Library (Fork)
50
+ svgwrite 1.4.3 A Python library to create SVG drawings.
51
+ tkdeft 0.0.9 使用tkinter+tksvg开发的现代化界面库
52
+ ├── easydict >=1.13,<2.0
53
+ ├── pillow >=10.2.0,<11.0.0
54
+ ├── svgwrite >=1.4.3,<2.0.0
55
+ ├── tkextrafont >=0.6.3,<0.7.0
56
+ │ └── scikit-build *
57
+ │ ├── distro *
58
+ │ ├── packaging *
59
+ │ ├── setuptools >=42.0.0
60
+ │ ├── tomli *
61
+ │ └── wheel >=0.32.0
62
+ └── tksvg >=0.7.4,<0.8.0
63
+ └── scikit-build *
64
+ ├── distro *
65
+ ├── packaging *
66
+ ├── setuptools >=42.0.0
67
+ ├── tomli *
68
+ └── wheel >=0.32.0
69
+ tkextrafont 0.6.3 Fonts loader for Tkinter
70
+ └── scikit-build *
71
+ ├── distro *
72
+ ├── packaging *
73
+ ├── setuptools >=42.0.0
74
+ ├── tomli *
75
+ └── wheel >=0.32.0
76
+ tksvg 0.7.4 SVG support for PhotoImage in Tk 8.6
77
+ └── scikit-build *
78
+ ├── distro *
79
+ ├── packaging *
80
+ ├── setuptools >=42.0.0
81
+ ├── tomli *
82
+ └── wheel >=0.32.0
83
+ ```
@@ -0,0 +1,55 @@
1
+ tkflu/__init__.py,sha256=rw-h1nnCEP1mr_K9A7yAMdK5PS1yZRx3ha4q9AiYPlY,988
2
+ tkflu/__main__.py,sha256=vcx_XgA5wmfCOH6yODEcKHzfIwUyBUoWVP5suySFlWU,3299
3
+ tkflu/badge.py,sha256=mvRTJMOcVXX5h9uSYHYX_CzbVcQ-kl4kLlIMknCNFZM,5787
4
+ tkflu/button.py,sha256=2uwxpWccyupS4s2NfyQ3PHi5GHds9MBpEd60ecQoASc,9612
5
+ tkflu/bwm.py,sha256=Tefe1XWApJlkdvGD5lpHCyWPftvXcnsF623hva9MbbQ,7582
6
+ tkflu/checkbox.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ tkflu/constants.py,sha256=VX3NcSzdOqelK3IRM-fK_RKBHV26d8AgJMuP-8hqCsA,488
8
+ tkflu/customwindow.py,sha256=Fr4CF0vKwj36tYzgX9_5F7OwcD59z9LfOW20Ugm2Hxc,3761
9
+ tkflu/customwindow2.py,sha256=nyNEMoGVnOYXCPbdvxZFUH-VlpAtjjEGI8Ul9VDvgAs,2109
10
+ tkflu/defs.py,sha256=pKVQUm-dK12QiU2MMFD7sxoiXfhEsezN_uAV6eE5Cbk,1144
11
+ tkflu/demos/__init__.py,sha256=0IV8vUG2kAp90bbRXGj7Mte2ABXrZ_rzIyZxmB1fGLY,102
12
+ tkflu/demos/acrylic1.py,sha256=-1SniTxrQeAYz6VSxHu7UsAmZeSIBaElgC2KYVVAghU,423
13
+ tkflu/demos/demo1.py,sha256=xR4a1qOrzxHXhVFlluTjp9izo7sO_YFbS_BGZj1LbZs,112
14
+ tkflu/demos/grad.py,sha256=neRGPq7VkGEzzUJymNdBi7EYI55wMes-OX3l-DQSonA,2195
15
+ tkflu/demos/grad2.py,sha256=poTd0V-iWpt8YxVl5qsRZHuk8lhkuY5vWtXIvwBswIQ,4469
16
+ tkflu/demos/grad3.py,sha256=9eEVWjqrvGU9kNIoux7XNyFWZVx8Gin664xQtnC8g_Q,473
17
+ tkflu/demos/test.py,sha256=DMontyt61qq4ULVExSrHA9tbQlXHH_KSkQPv1EV8TEk,153
18
+ tkflu/demos/tooltip.py,sha256=_tTIUuVo8x9YpdikPLxTvbB3wF1vb-JKppVDgzHXj2k,286
19
+ tkflu/designs/__init__.py,sha256=2Z4lCHHwMtXinGQgowsQeLkGBl20c5iMOR6GjvE4my4,113
20
+ tkflu/designs/badge.py,sha256=SVwDrQPltscB7YDvw5qhPdepKy1S-pcdD6OyYfonwzQ,1463
21
+ tkflu/designs/button.py,sha256=yEKRrH5dcDQCaGGqsYRnKgaCPSSd8cU__31LOQf2JX0,12274
22
+ tkflu/designs/design.py,sha256=RZNNzSl89BE7nFvOPThuzYKhONBZc76DMfYvHJ-pJWc,751
23
+ tkflu/designs/entry.py,sha256=iUilCpOl_zs_PbklIWhKWkkaZGQbt0bCprrZwhE3CEs,5060
24
+ tkflu/designs/fonts/__init__.py,sha256=lKvu4DKjRaWNczHas_YJZNx_LVr9tt3W_kFkJJRju0Q,642
25
+ tkflu/designs/fonts/segoeui.ttf,sha256=dPKz0MIM9zgOsSGgn9fN_cHM3RKgDbg8rsD-tItNufc,975088
26
+ tkflu/designs/frame.py,sha256=ypv5DilK1ZAsbGIzPIBPQFRrnfC7XtFYpvUFmUd6hdg,1167
27
+ tkflu/designs/gradient.py,sha256=xDRN6eQQfSWsct7CZXOmGdsxwgHtTfKA3pjzoducU2Q,1965
28
+ tkflu/designs/menubar.py,sha256=0shuMU182pD-zsjFgDfmpwczRoLYpF-MRzaH00sWTBY,265
29
+ tkflu/designs/primary_color.py,sha256=1gEM9qvHNNA09k4QOEFG0DUMhCqSK5C47YW-Nk6k4vY,729
30
+ tkflu/designs/slider.py,sha256=1JsWvE8tQ6oI3vfS7iDMlES17n6ri8q9D2ym456i5CY,7800
31
+ tkflu/designs/text.py,sha256=YMJR2eGE7lFIZPYrT7p8QBD3zRH4NaVWhrL1dOb6vJ4,5059
32
+ tkflu/designs/tooltip.py,sha256=OFUIO9-EMNjapF9zC5PuLW26HFGib-p800hNIxaWT5Q,442
33
+ tkflu/designs/window.py,sha256=XHMvT0lVsJSeUApMf_bf9ipLSWT-BirkOiiUnVx-N48,625
34
+ tkflu/entry.py,sha256=b4kblEEmZRqtuDM2E5_hhb_8MhTgujbwTNP7aICB6qM,10852
35
+ tkflu/frame.py,sha256=6ORQ3yCm-fwRNOGTDiz_XoAnmTx5EBC2zXwaM3zYIO4,10159
36
+ tkflu/icons.py,sha256=Xzrc9WzexncYEPXqnVg3ywWv_7kLZLyYC5WtaRv30PQ,7129
37
+ tkflu/image.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ tkflu/label.py,sha256=AFkAosNVvvXiD0FAolyCIyhOttYMjwqPS9GpqLf-6co,1614
39
+ tkflu/listbox.py,sha256=gD_oNNWVZtm5qXQ8bVBNRqJL6CGiIYtvhxztM9huzew,9991
40
+ tkflu/litenav.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
+ tkflu/menu.py,sha256=TlJoc2pyuQSjcPNaWa3aXUszp11NjZl0dwaYuODuXaE,3248
42
+ tkflu/menubar.py,sha256=gCCUh7BTkp7EXjs0yZY1gBdnDbeYiN8sHyox8dNRUes,5332
43
+ tkflu/popupmenu.py,sha256=dRwuFK7PKSYXiLhzrrzjKXTjtLfr7vh0KDvJIUjDetg,1592
44
+ tkflu/popupwindow.py,sha256=OVDjW3g5oKeFy82SLz7XiNC2hy8RKeQGW2l0yBKezIs,1010
45
+ tkflu/scrollbar.py,sha256=1hbu5n1mx4KyiF_M3sohpJJPux1zu5Jlw9V6LfQQs1Y,7293
46
+ tkflu/slider.py,sha256=B29fNA0rGSWEdetFfwLEdNhYyprHEm9FCqU3Vpp08Sw,16114
47
+ tkflu/text.py,sha256=OIh79R0NAJdle4aSsIxzdPhBNqiAw15FqtdEip-kU9s,10891
48
+ tkflu/thememanager.py,sha256=J3vCab-u2nD0QPMB9wu5d-Isu7alK7c63aF2Ys7uviw,1175
49
+ tkflu/togglebutton.py,sha256=ooj6ZwFuZEeZB_pFL_8hBdiqK-9OqsMGqLa1kKuCVjs,19784
50
+ tkflu/tooltip.py,sha256=Cjid4E9yFFPBZwOz5uVhSb8kpEEW26Wv8vxiqc0bnw4,4917
51
+ tkflu/toplevel.py,sha256=gcLz93Q9OgWc9dV4d-TK6gXk5eIetFuU5CbO8ybAvsI,815
52
+ tkflu/window.py,sha256=2LjgL2KZIAYA04fXWQvfiNMYj_PKzlpSuEZrR94qHAs,1483
53
+ tkfluent-0.1.0.dist-info/METADATA,sha256=LsMg-SSF9yLbdRe_Yh6XCDLa7HYfSMP3ftHVo7AQLHY,3118
54
+ tkfluent-0.1.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
55
+ tkfluent-0.1.0.dist-info/RECORD,,
@@ -1,29 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: tkfluent
3
- Version: 0.0.8
4
- Summary: Fluent Design for Tkinter
5
- Author: XiangQinxi
6
- Author-email: xiangqinxi@outlook.com
7
- Requires-Python: >=3.7,<4.0
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.7
10
- Classifier: Programming Language :: Python :: 3.8
11
- Classifier: Programming Language :: Python :: 3.9
12
- Classifier: Programming Language :: Python :: 3.10
13
- Classifier: Programming Language :: Python :: 3.11
14
- Classifier: Programming Language :: Python :: 3.12
15
- Classifier: Programming Language :: Python :: 3.13
16
- Requires-Dist: easydict (>=1.13,<2.0)
17
- Requires-Dist: pillow (>=10.2.0,<11.0.0)
18
- Requires-Dist: svgwrite (>=1.4.3,<2.0.0)
19
- Requires-Dist: tkdeft (>=0.0.9,<0.0.10)
20
- Requires-Dist: tkextrafont (>=0.6.3,<0.7.0)
21
- Requires-Dist: tksvg (>=0.7.4,<0.8.0)
22
- Project-URL: Documentation, https://tkfluent.netlify.app
23
- Description-Content-Type: text/markdown
24
-
25
- # tkfluent
26
-
27
- `tkinter`现代化组件库。设计来于`Fluent` `WinUI3` 设计
28
-
29
- ![](https://learn.microsoft.com/zh-cn/windows/apps/images/logo-winui.png)