tkfluent 0.0.2__py3-none-any.whl → 0.0.4__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/bwm.py ADDED
@@ -0,0 +1,177 @@
1
+ class BWm(object):
2
+ def _draw(self, event=None):
3
+
4
+ """
5
+ 重新绘制窗口及自定义的窗口组件
6
+
7
+ :param event:
8
+ """
9
+
10
+ self.configure(background=self.attributes.back_color)
11
+ if self.custom:
12
+ if hasattr(self, "titlebar"):
13
+ self.titlebar.configure(background=self.attributes.back_color)
14
+ self.titlebar.update()
15
+ if hasattr(self, "titlelabel"):
16
+ self.titlelabel.dconfigure(text_color=self.attributes.text_color)
17
+ self.titlelabel._draw()
18
+ if hasattr(self, "closebutton"):
19
+ self.closebutton.dconfigure(
20
+ rest={
21
+ "back_color": self.titlebar.cget("background"),
22
+ "border_color": "#f0f0f0",
23
+ "border_color2": "#d6d6d6",
24
+ "border_width": 0,
25
+ "radius": 0,
26
+ "text_color": self.attributes.closebutton.text_color,
27
+ },
28
+ hover={
29
+ "back_color": self.attributes.closebutton.back_color,
30
+ "border_color": "#f0f0f0",
31
+ "border_color2": "#d6d6d6",
32
+ "border_width": 0,
33
+ "radius": 0,
34
+ "text_color": self.attributes.closebutton.text_hover_color,
35
+ },
36
+ pressed={
37
+ "back_color": self.attributes.closebutton.back_color,
38
+ "border_color": "#f0f0f0",
39
+ "border_color2": "#f0f0f0",
40
+ "border_width": 0,
41
+ "radius": 0,
42
+ "text_color": self.attributes.closebutton.text_hover_color,
43
+ }
44
+ )
45
+ self.closebutton._draw()
46
+
47
+ def _event_key_esc(self, event=None):
48
+ self._event_delete_window()
49
+
50
+ def _event_delete_window(self):
51
+ self.destroy()
52
+
53
+ def _event_configure(self, event=None):
54
+
55
+ """
56
+ 触发 `<Configure>` 事件
57
+
58
+ :param event:
59
+ :return:
60
+ """
61
+
62
+ self._draw()
63
+
64
+ def _init(self, mode):
65
+ from easydict import EasyDict
66
+ self.attributes = EasyDict(
67
+ {
68
+ "back_color": None,
69
+ "text_color": None,
70
+ "closebutton": {
71
+ "back_color": None,
72
+ "text_color": None,
73
+ "text_hover_color": None
74
+ }
75
+ }
76
+ )
77
+
78
+ self.theme(mode)
79
+
80
+ def theme(self, mode: str):
81
+
82
+ """
83
+ 同 `theme_myself`
84
+
85
+ :param mode:
86
+ :return:
87
+ """
88
+
89
+ self.theme_myself(mode=mode)
90
+
91
+ def theme_myself(self, mode: str):
92
+
93
+ """
94
+ 修改该窗口的Fluent主题
95
+
96
+ :param mode:
97
+ :return:
98
+ """
99
+
100
+ self.mode = mode
101
+ if mode.lower() == "dark":
102
+ self._dark()
103
+ else:
104
+ self._light()
105
+
106
+ def _light(self):
107
+ self.dconfigure(
108
+ back_color="#ffffff",
109
+ text_color="#000000",
110
+ closebutton={
111
+ "back_color": "red",
112
+ "text_color": "#000000",
113
+ "text_hover_color": "#ffffff"
114
+ }
115
+ )
116
+
117
+ def _dark(self):
118
+ self.dconfigure(
119
+ back_color="#202020",
120
+ text_color="#ffffff",
121
+ closebutton={
122
+ "back_color": "red",
123
+ "text_color": "#ffffff",
124
+ "text_hover_color": "#000000"
125
+ }
126
+ )
127
+
128
+ def wincustom(self, wait=200, way=1):
129
+
130
+ """
131
+ 自定义窗口 仅限`Windows系统`
132
+
133
+ :param wait: 直接执行自定义窗口容易出错误 需要一点时间等待才能执行 同`after()`中的`ms`
134
+ :param way: 取0时保留原版边框,但稳定性很差,容易崩溃。取1时不保留原版边框,但稳定性较好。
135
+ :return:
136
+ """
137
+
138
+ from sys import platform
139
+ from .button import FluButton
140
+ from .label import FluLabel
141
+ from tkinter import Frame
142
+ self.titlebar = Frame(self, width=180, height=35, background=self.attributes.back_color)
143
+ self.titlelabel = FluLabel(self.titlebar, text=self.title(), width=50)
144
+ self.titlelabel.pack(fill="y", side="left")
145
+ self.closebutton = FluButton(self.titlebar, text="", width=32, height=32, command=lambda: self._event_delete_window())
146
+ self.closebutton.pack(fill="y", side="right")
147
+ self.titlebar.pack(fill="x", side="top")
148
+
149
+ if platform == "win32":
150
+ if way == 0:
151
+ from .customwindow import CustomWindow
152
+ self.customwindow = CustomWindow(self, wait=wait)
153
+ self.customwindow.bind_drag(self.titlebar)
154
+ self.customwindow.bind_drag(self.titlelabel)
155
+ else:
156
+ self.overrideredirect(True)
157
+ try:
158
+ from win32gui import GetParent, GetWindowLong, SetWindowLong
159
+ from win32con import GWL_EXSTYLE, WS_EX_APPWINDOW, WS_EX_TOOLWINDOW
160
+ hwnd = GetParent(self.winfo_id())
161
+ style = GetWindowLong(hwnd, GWL_EXSTYLE)
162
+ style = style & ~WS_EX_TOOLWINDOW
163
+ style = style | WS_EX_APPWINDOW
164
+ SetWindowLong(hwnd, GWL_EXSTYLE, style)
165
+ self.after(30, lambda: self.withdraw())
166
+ self.after(60, lambda: self.deiconify())
167
+ except:
168
+ pass
169
+
170
+ self.wm_attributes("-topmost", True)
171
+
172
+ from .customwindow2 import WindowDragArea
173
+ self.dragarea = WindowDragArea(self)
174
+ self.dragarea.bind(self.titlebar)
175
+ self.dragarea.bind(self.titlelabel)
176
+
177
+ self.custom = True
tkflu/constants.py ADDED
@@ -0,0 +1,15 @@
1
+ NO = FALSE = OFF = 0
2
+ YES = TRUE = ON = 1
3
+
4
+ # Modes
5
+ LIGHT = 'light'
6
+ DARK = 'dark'
7
+
8
+ # States
9
+ NORMAL = 'normal'
10
+ DISABLED = 'disabled'
11
+
12
+ # FluButton Styles
13
+ STANDARD = 'standard'
14
+ ACCENT = 'accent'
15
+ MENU = 'menu'
tkflu/entry.py CHANGED
@@ -16,7 +16,7 @@ class FluEntryDraw(DSvgDraw):
16
16
  drawing = self.create_drawing(x2 - x1, y2 - y1, temppath=temppath)
17
17
  border = drawing[1].linearGradient(start=(x1, y1), end=(x1, y2), id="DButton.Border")
18
18
  border.add_stop_color("0%", outline)
19
- border.add_stop_color("85%", outline)
19
+ border.add_stop_color("90%", outline)
20
20
  border.add_stop_color("100%", outline2)
21
21
  drawing[1].defs.add(border)
22
22
  drawing[1].add(
@@ -24,8 +24,15 @@ class FluEntryDraw(DSvgDraw):
24
24
  (x1, y1), (x2 - x1, y2 - y1), _rx, _ry,
25
25
  fill=fill, stroke_width=width,
26
26
  stroke=f"url(#{border.get_id()})",
27
+ ),
28
+ )
29
+ """print((x1, y1), (x2 - x1, y2 - y1))
30
+ drawing[1].add(
31
+ drawing[1].line(
32
+ (x1 + radius / 2, y2 - width), (x2 - radius / 2, y2 - width,)
27
33
  )
28
34
  )
35
+ print((x1 + radius / 2, y2 - width), (x2 - radius / 2, y2 - width,))"""
29
36
  drawing[1].save()
30
37
  return drawing[0]
31
38
 
@@ -55,6 +62,7 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
55
62
  cursor="xterm",
56
63
  textvariable=None,
57
64
  mode="light",
65
+ state="normal",
58
66
  **kwargs):
59
67
  self._init(mode)
60
68
 
@@ -71,6 +79,12 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
71
79
 
72
80
  super().__init__(*args, width=width, height=height, cursor=cursor, **kwargs)
73
81
 
82
+ self.bind("<FocusIn>", self._event_focus_in, add="+")
83
+
84
+ self.dconfigure(
85
+ state=state,
86
+ )
87
+
74
88
  if font is None:
75
89
  from tkdeft.utility.fonts import SegoeFont
76
90
  self.attributes.font = SegoeFont()
@@ -81,11 +95,11 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
81
95
  self.attributes = EasyDict(
82
96
  {
83
97
  "font": None,
98
+ "state": "normal",
84
99
 
85
100
  "rest": {},
86
-
87
- "focus": {}
88
-
101
+ "focus": {},
102
+ "disabled": {}
89
103
  }
90
104
  )
91
105
 
@@ -98,28 +112,45 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
98
112
 
99
113
  self.entry.configure(font=self.attributes.font)
100
114
 
101
- if self.isfocus:
102
- _back_color = self.attributes.focus.back_color
103
- _border_color = self.attributes.focus.border_color
104
- _border_color2 = self.attributes.focus.border_color2
105
- _border_width = self.attributes.focus.border_width
106
- _radius = self.attributes.focus.radius
107
- _text_color = self.attributes.focus.text_color
115
+ state = self.dcget("state")
116
+
117
+ if state == "normal":
118
+ self.entry.configure(state="normal")
119
+ if self.isfocus:
120
+ _back_color = self.attributes.focus.back_color
121
+ _border_color = self.attributes.focus.border_color
122
+ _border_color2 = self.attributes.focus.border_color2
123
+ _border_width = self.attributes.focus.border_width
124
+ _radius = self.attributes.focus.radius
125
+ _text_color = self.attributes.focus.text_color
126
+ else:
127
+ _back_color = self.attributes.rest.back_color
128
+ _border_color = self.attributes.rest.border_color
129
+ _border_color2 = self.attributes.rest.border_color2
130
+ _border_width = self.attributes.rest.border_width
131
+ _radius = self.attributes.rest.radius
132
+ _text_color = self.attributes.rest.text_color
108
133
  else:
109
- _back_color = self.attributes.rest.back_color
110
- _border_color = self.attributes.rest.border_color
111
- _border_color2 = self.attributes.rest.border_color2
112
- _border_width = self.attributes.rest.border_width
113
- _radius = self.attributes.rest.radius
114
- _text_color = self.attributes.rest.text_color
134
+ self.entry.configure(state="disabled")
135
+ _back_color = self.attributes.disabled.back_color
136
+ _border_color = self.attributes.disabled.border_color
137
+ _border_color2 = self.attributes.disabled.border_color2
138
+ _border_width = self.attributes.disabled.border_width
139
+ _radius = self.attributes.disabled.radius
140
+ _text_color = self.attributes.disabled.text_color
115
141
 
116
- self.entry.configure(background=_back_color, insertbackground=_text_color, foreground=_text_color)
142
+ self.entry.configure(background=_back_color, insertbackground=_text_color, foreground=_text_color, disabledbackground=_back_color, disabledforeground=_text_color)
117
143
 
118
144
  self.element_border = self.create_round_rectangle(
119
145
  0, 0, self.winfo_width(), self.winfo_height(), _radius, temppath=self.temppath,
120
146
  fill=_back_color, outline=_border_color, outline2=_border_color2, width=_border_width
121
147
  )
122
148
 
149
+ self.element_line = self.create_line(
150
+ _radius / 3, self.winfo_height() - _radius / 3, self.winfo_width() - _radius / 3, self.winfo_height() - _radius / 3,
151
+ width=1, fill=_border_color2
152
+ )
153
+
123
154
  self.element_text = self.create_window(
124
155
  self.winfo_width() / 2, self.winfo_height() / 2,
125
156
  window=self.entry,
@@ -148,7 +179,7 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
148
179
  self.dconfigure(
149
180
  rest={
150
181
  "back_color": "#ffffff",
151
- "border_color": "#f0f0f0",
182
+ "border_color": "#e5e5e5",
152
183
  "border_color2": "#8d8d8d",
153
184
  "border_width": 1,
154
185
  "radius": 6,
@@ -156,11 +187,19 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
156
187
  },
157
188
  focus={
158
189
  "back_color": "#ffffff",
159
- "border_color": "#f0f0f0",
190
+ "border_color": "#e5e5e5",
160
191
  "border_color2": "#005fb8",
161
192
  "border_width": 2,
162
193
  "radius": 6,
163
194
  "text_color": "#636363",
195
+ },
196
+ disabled={
197
+ "back_color": "#fdfdfd",
198
+ "border_color": "#e5e5e5",
199
+ "border_color2": "#e5e5e5",
200
+ "border_width": 1,
201
+ "radius": 6,
202
+ "text_color": "#a2a2a2",
164
203
  }
165
204
  )
166
205
 
@@ -181,5 +220,13 @@ class FluEntry(FluEntryCanvas, DDrawWidget):
181
220
  "border_width": 2,
182
221
  "radius": 6,
183
222
  "text_color": "#ffffff",
223
+ },
224
+ disabled={
225
+ "back_color": "#2a2a2a",
226
+ "border_color": "#303030",
227
+ "border_color2": "#303030",
228
+ "border_width": 1,
229
+ "radius": 6,
230
+ "text_color": "#787878",
184
231
  }
185
232
  )
tkflu/frame.py CHANGED
@@ -74,6 +74,7 @@ class FluFrame(Frame, DObject):
74
74
  width=300,
75
75
  height=150,
76
76
  mode="light",
77
+ style="standard",
77
78
  **kwargs,
78
79
  ):
79
80
  from tempfile import mkstemp
@@ -84,7 +85,7 @@ class FluFrame(Frame, DObject):
84
85
 
85
86
  super().__init__(master=self.canvas)
86
87
 
87
- self._init(mode)
88
+ self._init(mode, style)
88
89
 
89
90
  self.enter = False
90
91
  self.button1 = False
@@ -93,7 +94,7 @@ class FluFrame(Frame, DObject):
93
94
 
94
95
  self.canvas.bind("<Configure>", self._event_configure, add="+")
95
96
 
96
- def _init(self, mode):
97
+ def _init(self, mode, style):
97
98
  from easydict import EasyDict
98
99
 
99
100
  self.attributes = EasyDict(
@@ -106,33 +107,60 @@ class FluFrame(Frame, DObject):
106
107
  }
107
108
  )
108
109
 
109
- self.theme(mode)
110
-
111
- def theme(self, mode="light"):
112
- self.mode = mode
113
- if mode.lower() == "dark":
114
- self._dark()
110
+ self.theme(mode=mode, style=style)
111
+
112
+ def theme(self, mode=None, style=None):
113
+ if mode:
114
+ self.mode = mode
115
+ if style:
116
+ self.style = style
117
+ if self.mode.lower() == "dark":
118
+ if self.style.lower() == "popupmenu":
119
+ self._dark_popupmenu()
120
+ else:
121
+ self._dark()
115
122
  else:
116
- self._light()
123
+ if self.style.lower() == "popupmenu":
124
+ self._light_popupmenu()
125
+ else:
126
+ self._light()
117
127
 
118
128
  def _light(self):
119
129
  self.dconfigure(
120
- back_color="#ffffff",
130
+ back_color="#f9f9f9",
121
131
  border_color="#ebebeb",
122
132
  border_color2="#e4e4e4",
123
- border_width=1,
133
+ border_width=1.5,
124
134
  radius=6,
125
135
  )
126
136
 
137
+ def _light_popupmenu(self):
138
+ self.dconfigure(
139
+ back_color="#f9f9f9",
140
+ border_color="#4d5056",
141
+ border_color2="#4d5056",
142
+ border_width=1.5,
143
+ radius=8,
144
+ )
145
+
127
146
  def _dark(self):
128
147
  self.dconfigure(
129
148
  back_color="#242424",
130
149
  border_color="#303030",
131
150
  border_color2="#282828",
132
- border_width=1,
151
+ border_width=1.5,
133
152
  radius=6,
134
153
  )
135
154
 
155
+ def _dark_popupmenu(self):
156
+ self.dconfigure(
157
+ back_color="#242424",
158
+ border_color="#4d5056",
159
+ border_color2="#4d5056",
160
+ border_width=1.5,
161
+ radius=8,
162
+ )
163
+
136
164
  def pack_info(self):
137
165
  return self.canvas.pack_info()
138
166
 
tkflu/icons.py ADDED
@@ -0,0 +1,47 @@
1
+ def icon():
2
+ from tempfile import mkstemp
3
+
4
+ _icon = b"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABp1JREFUWEe9V/lvVFUU/u682Wc6nZnOvrUdoK2lrdC0algbQCmOCy5x16iJf4CJMfpnmJhoUKClLXRDE/aERfiJkGIIPwACU6C2JWFNSBqY5d139dx5M91pq8abzGQyM+9+3znnO989l2GJSwjBAEQBvAxgs/74SQBHAIwzxsRStqTNlrSEEMsAvKODJ/WHbwAgEv2MseGlbLgkAkKIFQDeA/ABAPqsEFg+n+ePHj26brfb99rt9l7G2PXFklg0AT3yD3VwyoKRQDRNw82bNzE0NKTa7fbhmpqavXV1dT2LzcSCBPSaVwL4TE/98iI45xxjY2M4cuQIBgYGYLVa1VQqlX41lepPVFXt/vuZkYU0sRgC1Tr423raZeQEPj4+jkOHDmHfvn0YHh6GyWRCQ0OD+tLWbddfe+Otwep4uIMxRvqYdz2VgF5zqve7c4EfOHAA+/fvx+XLl2UpDIzBVlaOxKo2dXX7x+n2NQ0D65Z7u11Wdm0+BvMSEEIkdODPAZTSThs9fvwYR48exc6dO3H+/Hm5N2MMwmCE6kogG1sHb/169eWWyltbV/p7Ui2RvVY2N4k5CQghqM/fAkCiWwXAXIwgl8vh4sWL2L17N06dOoWHDx+CNhGKGbwsikx8HTKRFwCbGwGbpm5vDtza2hTpTcTcnc1+y/BMTcwiIISI6GKjdnsWgLUIrqoqLly4gM7OTpw5cwb379+XqafIJXhiI7LhVnC7n3IChWmIuZn6YkNg5JXWql+iHsePrcHpmphGQAgRB/AmgPdnghPQuXPnpOAo8iI4U4xQy+LIJNYjG2oFdwQAZpCcTWYjgmEXnklWaM0J1821QdPg8jLsrA9YSz5RIqDX/HU97bMiHxoaQl9fH44fP44HDx7IyJmseRyZ2Fpko8+D2yfBzRYT/BEPYtUhlLkdKDdqvM6pjaz2GPY1eg3dtT7LH1I79CaEiAF4A8BHeuSWmTXv6urCyZMnJbjQNEBGHkMmugbZ2Bpwuw9g0hhB4L6QB/FlIXh8LhhNimxbC8/xVW4x2uQy9NR7rF21PqSZEKIGwDY97SS4Eng+n5eC6+jowOnTp2XaCVwoJnBnGJn4emQjL4A7/CVwE0Ue8iCxLAS3Di6DpBfnMKs53uTiI6u9xp8NfOJ7IrADQDOAlVMFRymmFtuzZ48U3L179ybTXhZBJr4R2UgLuCM4CW42wh/xIp4M6pFLzyotSULlsKlPhFPLdlZ7tW+JwDkAdKr5iv8k8HQ6jf7+fvm6c+cOlQkMohB5YoNMPX2WaRcCiskAf9gr014RKIfRNB18KpF8Lo+AOX/i60bLD0SgD0ArALJcuYoEyN8nCWgSiFP0iTZkZN0peibzq5gUBKNeJJaH4fGXQ1EKnTDX4ipHwKyd+GqlQRL4Qm+9tpklOHv2LHbs2CFLMDExAUVRIAwmcFccTyrbkAs1g9tIfAbphBarCaG4D9HqIFxuJxTjbBIUnI3n4GD5zqTT8A0RIOPZDuAT3fVKIrx796486Xbt2oVr164VNECWq5gL7SeNpwWa1TtJwmaWmYgnqf2mkxCagElTtRobH6sr034SxsffFduQDIhITGtDcj46bsn3e3t7ceXKlUnfJxLllcjE1iEbeQ6a1VMwIAbY7BYEIhWIJYNweZyyHJomYIGq1dr5+AqH6EnalU5UmdMLGhFFTSQOHjyIwcFBXLp0acrhY4Lqrpb+nwu3gFsrCpqgU9FOmahAtCoIp9sBp6JpSSsfrXWJ3hoH37OhsuxyyYiKQplhxU0AbPQbmcjt27dBxy+J8urVq/I7g8FQKAdlIrGxoAmdhNSEzYxQ1IOaap9YGXbcaixnv4Rt+Glb0nq1iPm0w6hYjmkDCGmiu7tbDiBUogIJC3h5Ak8SbciGmgua0A+juM/M19cH/mxrjPwa9Rh/aI9b01M7Y77jmKz5U10T0+a/0dFRHDt2TJIgYUp/kMK0FDIR3yCFKSwu+GyCv9LkH9nSGOr1+9wdLyYt6QWP4ynlKE7ANBPMInH48GFZDpqGZC317si7k1KYnto1fOuq+MjmuoqeTU2+nqhrMu0LZmAGiaeOZCRM6o7SSObyIPrsJrVhywc3tjxfP7B2hbNrPvBZIpzLtYQQSx5KN73Unt7c/ub+SFV0V9D6L4ZSIvRPxvJUKtVf9V+N5VPKQTr4/y8mU8sy42pWmpT/l6vZHJmg2bECwASAMQC/Aehb7JVsXiOa9wyd8oMQog7AlwDo7nALwO8Ajv2T6/lf6YEqv39NI4MAAAAASUVORK5CYII="
5
+
6
+ _, _temp = mkstemp()
7
+
8
+ with open(_temp, "wb") as _file:
9
+ from base64 import b64decode
10
+
11
+ _file.write(b64decode(_icon))
12
+
13
+ _icon2 = (_temp).replace("\\", "//")
14
+
15
+ return _icon2
16
+
17
+
18
+ def light():
19
+ from tempfile import mkstemp
20
+
21
+ _icon = b"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABjRJREFUWEetV0uMHNUVPfd1dbWxDe62u7rN2I5JUAi2AfGxITYi5AMSYgUBx3ICIea3QQjBimUWsGKBxCciMUE4BAnZTCJCYPhFCVklDpBEEYuQgIfg2MxUTYOHAWY8Xe+kzuiV1TQz4xni3rS6uurdc+8599xbhi/2qTabzSW1Wi2emJjwjUbj0+Hh4ckvcpQt9qF2u73Me3+GmW01sw0kPzCzP3jv96dpOrHY8xYFYO3atSdNTk5eZGZXm1kTwEcAjpjZR3mev21mv0/T9P3FgFgwgIGBgaVHjx7d4pz7HsmNAF4k+atKpRKT3O693+acG+p2u3s7nc7BhYJYEAAFn56ePt/MriP5NQUHMJim6YFms/kV59z3AewCUDGzR0juHh0dHVkIiOMCUPBut3seyV1mtl5l9t7vS9P03Xq9fmoURdc653YCWEfyFDMbJfmEc+6BkZGR0eOBmBeAOJ+amtqizAEo+B+993vTNB2u1+sDcRzvMLPtJNcDOEpyqZk1SL5nZo977x/JsuzQfCDmBBAEd6E4B3Cmmf0uz/Onsyx7S52Q5/lVzrlbAWwC8DGAiORyM4sBLAGQeu8f9N4/3ul03psLxKwAAuebzUwZbvLei/On0zT9F4C41WpdQPIW59xW7/0yM1NwfddIfghgRNcALPfePwZg91yV+ByAknMANwA4neQrIfi/AbhWq3URyRvNbAuAUwQoZK7g4wD2O+eeITkG4A6SXxYdRds+NJsmPgOgVDuAH5nZOjN7NQhOwZEkySVm9oOiC7b2BC8zV/C/CCyAoVqtdmR6evo7JO8meRqAPWb2QH93HAPQw7kUfbrcLc/zfeJc7ZUkycUkdzrnLlFpQ+Zl8CMAXlPwPM9flg+E8y5zzt0G4DKSh0k+6r3/ea9PCIAlSbKMpEzmWpmMc+7lUnCB882Bkov7g8sJSSr4IMkXxHWSJMtJXmpmN5iZnk30HEl5w4N5nv+iFKYARCtXrjwjiqJdJHXzSz2Cq7Zarc1FW91kZhfOUvYy80EAz8uGg2N+y8zkG+cCaANYKv2IRpLyiYeDMN83lSpw9U2SKclfZ1kmztlqtbaRlB76gy8hqTmwX2BD5odVrWazeYV8w8zOB7AawEll8J5W/C+An8Vx/JCtWLGiUQjmTgA18ZNlmVoNq1ev3uC93wHgKgArBAjAyQCWAZgsgA0XCt8DYG9osWq73VZ7yrSuBNCaI/gMjqKLniuqf4+tWbNmVbfb/THJqvf+/izL/qn/BSDP851yuoK3VboWSlkFoLH7jgB47wfHxsaU0aIAkHzWOXevNZvNk51z1wOQyv8RhszbAHyr1bq86O27AFwasqGZCUgXQCYKRBnJF7MsO7xx48Z4dHS0pEB6Witgs7jgmJk9GkXRfTqsmiTJWep9AOf0ijBJEnF4TWGraqUzQxVUPp0pEBLU68653+R5/pxAlCIMNv0NAPU+AB+SHHTO7R4ZGXlj5qTg7WpDDZbeNjzQbrfXyfel6kJwAlpyWIKYKBaUvwN4MoAo2/DbAG6XXQfdCPgHJCXaJ6rV6uuHDh36ZF4jCpPvQL1eXxPHsRYRCUxVOgaCpA7+xMzkgr/sdrtD0kRwVYnxTjPbVoBR2Z/RcKrVaq8dPHjw0xkx9pZnHisebjQap1ar1R0kfxgm4MyzoiOAUGf8yTn3pAQWx/G42tt7f3eYpr9V70dR9FdlfiyJfoHMMYzKBWQgiqJrzOxmANqMZsylF4SZ/ZnkU9JHGEa67/kgur/1Bv9cBUow84zjY5pwzt0cdsN+OrQbaBxrQamTHALwWLVafaM/+JwA9MdsC0mYjO+02+0v5Xn+XXl90bZnz6IJXRonuU9TsJfz/or/3ysZSY3nzwgTwH8K3p/SQKvVam/OlvmcGphLE31LqfbCdyXMSqWyPVRigwYbAK3ke07IUtqnid61vJyYw0mSnKYlRSua9gaSP3HO/fSEreW9IHpfTMxsKLyYaIjtKPZGGc6QvOOEv5iUIIIwv+6ck8HQey+1y2ob2ogEaqGZL1gD/ZrQtlOpVNZr2Sy6YhPJVcXEfHNqaurZ8fHxTv/9x/t93DejWQ7QMy5JEi0aXyVZ8d6/1el0tJQu+vM/Pe3YF3/DEJ8AAAAASUVORK5CYII="
22
+
23
+ _, _temp = mkstemp()
24
+
25
+ with open(_temp, "wb") as _file:
26
+ from base64 import b64decode
27
+
28
+ _file.write(b64decode(_icon))
29
+
30
+ _icon2 = (_temp).replace("\\", "//")
31
+
32
+ return _icon2
33
+
34
+ def dark():
35
+ from tempfile import mkstemp
36
+ _icon = b"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAABMlJREFUWEe1l1msXmMUhp9lnucYY455iHmMmIIEF2Yxz1wQwg2XLrhyITEFVTEmokqookoMV4a2iPRCq+ZS89yKSD/f06x9srv773P+U/XdnOHf/7fetdb7vmvtYDlOKWVVYA1gNWAxsCgi/lqOq4jxfqmUsjawM3AosBvwM/A68E5E/DHe+8YFoJSyJnAwcCqwCfA78Gv+nAe8FhELxgNiaACllLWAA4GzgN1rBaYBT2cbzgQOq+BerJ89GRFfDQtiKAAZfD/gfGCXDD4Z+BTYATgXuARYGbgXmBAR3w4DYkwAGXzfDLCtZQYm1b8/B7YAzgDOAbYG1gO+Ax4F7ogIfx/1jAoge27Zzdzgb1pi4DNgS+BswPL72d+AbdoQ+BJ4yGpExNejIegFkMEPyp7vCrwKPBURc1IJpwBX1mrsAfwJrAKsk5xQot8DdwokIgQ08AwEkGU/IDM0gIQz+NxSitrfH7gipagsDe7P1YFfAPvfAHowOTGwEssAaPX8otrLHYFXDF7b8DGwUsrw0lSEPReQmRv8N/0AeBb4sXrEdcD22Y67BnFiKQAttl+cpHojCWdwzxHAeZl5E7zJ3ODvJljlqD8cC9xUAWxXgTycxFxKHSMAWj2X0Wauu03Kniuvw5Ptgmh63QQ32IwMPl0fyGSOB66p5D2m8sUWTKiJTWz7RJRSBOFFsl1JaTLTW4SzxPLBlgiiL7i+8JKsL6WsW+V6JGCrJPLGOTvMXmI+0hBTAJJFb9dIDPRyi3AOHf93WV7ULXuTucFf0IYzczP2O/sAmwJaeFNtveHurMYCAfihvToqpfNMEq6kvcoHs2gHV2bOAQknQc38m1TIiekbOudmneCNFOdXH7nfaghA47g+WTyxkmxuPuWk02jU+/qAgCyt7XL0akYSS++37FZLeVrJk9KQBKpyBp2pVaq3CMD+3Ax4we0R8VHyQgASUqfzGUuo0/mcY/eTBDA5Iua3ANj3kyvjN0qJ9pndlHrXrQIwqwuSYB8C9nNeRCwupRxXtX1DEspWWQUv/Key+4dsgS2b1mqB2ds2uSNwSdwFoUc8UKt5mwDMaM/80t4dEm4OnF65cTWgHbcvEoSEmgk8V1U0NUHYIjl1VTUkh1i3EjqlSSrJWUsuTG9XhpZ7RIY5bp1y8sDeCrR9BGE7PgAeTxCNDI9Ou3aB2SBb5/YkaZ2WMyNi4VhG5ORz5m+VQ8mpaJW6Z2G64GMuJckJ+XICcG0qzLJr0U7JGRGxyEuGtWIZ7+xXFRfmBOz2VWW8lZWQYFqzrbgxd8fns+zvmXmTwbDDqFlA3AHkxOW5GXUlJoi3K1+eSH44jNygnA32/P128GUq0KDqG8cdTghCvnSPu4GW64Ji7w3uSJ7VDd4LIImp7LoLiZVQ/9sAp+V82KvHaGyBz2tWIz3vPrsiVjLHc5eYX2QbZPzsQZn3cqCLsGcpVR3NUqp0nZQ6p4PNlbyZ/f9tKe1wor2WL5mYOQ9cNqyCK5p7wz1VMfetsLW8A6L9YiK5fDFxFVOevqr9Py8mLRAS85A6Axy5zgXZLtOdqG5EmtBQLyRDc2AAJ9yIfA9w2XRjduDMrqN4SkT81KOI3n+P+WY0AIDf0YCsxk7Z9zkRoezGff4FJEWot2oJkhgAAAAASUVORK5CYII="
37
+
38
+ _, _temp = mkstemp()
39
+
40
+ with open(_temp, "wb") as _file:
41
+ from base64 import b64decode
42
+
43
+ _file.write(b64decode(_icon))
44
+
45
+ _icon2 = (_temp).replace("\\", "//")
46
+
47
+ return _icon2
tkflu/menu.py ADDED
@@ -0,0 +1,103 @@
1
+ from .popupmenu import FluPopupMenu
2
+ from tkdeft.object import DObject
3
+
4
+
5
+ class FluMenu(FluPopupMenu):
6
+ def __init__(self, *args, **kwargs):
7
+ super().__init__(*args, **kwargs)
8
+
9
+ def _init(self, mode, style):
10
+ from easydict import EasyDict
11
+
12
+ self.attributes = EasyDict(
13
+ {
14
+ "back_color": None,
15
+ "border_color": None,
16
+ "border_color2": None,
17
+ "border_width": None,
18
+ "radius": None,
19
+
20
+ "actions": {}
21
+ }
22
+ )
23
+
24
+ self.theme(mode=mode, style=style)
25
+
26
+ def add_command(self, custom_widget=None, width=40, **kwargs):
27
+ if custom_widget:
28
+ widget = custom_widget(self)
29
+ else:
30
+ from .button import FluButton
31
+ widget = FluButton(self, width=width)
32
+ if "label" in kwargs:
33
+ label = kwargs.pop("label")
34
+ else:
35
+ label = ""
36
+ if "style" in kwargs:
37
+ style = kwargs.pop("style")
38
+ else:
39
+ style = "menu"
40
+ if "command" in kwargs:
41
+ c = kwargs.pop("command")
42
+
43
+ def command():
44
+ c()
45
+ self.window.wm_withdraw()
46
+
47
+ else:
48
+ def c():
49
+ self.window.wm_withdraw()
50
+
51
+ command = c
52
+ if "id" in kwargs:
53
+ id = kwargs.pop("id")
54
+ else:
55
+ id = widget._w
56
+ if hasattr(widget, "dconfigure"):
57
+ widget.dconfigure(text=label, command=command)
58
+ else:
59
+ if hasattr(widget, "configure"):
60
+ widget.configure(text=label, command=command)
61
+ if hasattr(widget, "theme"):
62
+ widget.theme(style=style)
63
+
64
+ widget.pack(side="top", fill="x", padx=1, pady=(1, 0))
65
+ self.dcget("actions")[id] = widget
66
+
67
+ def add_cascade(self, custom_widget=None, width=40, menu=None, **kwargs):
68
+ if custom_widget:
69
+ widget = custom_widget(self)
70
+ else:
71
+ from .button import FluButton
72
+ widget = FluButton(self, width=width)
73
+ if "label" in kwargs:
74
+ label = kwargs.pop("label")
75
+ else:
76
+ label = ""
77
+ if "style" in kwargs:
78
+ style = kwargs.pop("style")
79
+ else:
80
+ style = "menu"
81
+ if "id" in kwargs:
82
+ id = kwargs.pop("id")
83
+ else:
84
+ id = widget._w
85
+
86
+ def command():
87
+ print(menu._w)
88
+ menu.focus_set()
89
+
90
+ menu.popup(widget.winfo_rootx()+widget.winfo_width()+100, widget.winfo_rooty())
91
+ menu.window.deiconify()
92
+ menu.window.attributes("-topmost")
93
+
94
+ if hasattr(widget, "dconfigure"):
95
+ widget.dconfigure(text=label, command=command)
96
+ else:
97
+ if hasattr(widget, "configure"):
98
+ widget.configure(text=label, command=command)
99
+ if hasattr(widget, "theme"):
100
+ widget.theme(style=style)
101
+
102
+ widget.pack(side="top", fill="x", padx=1, pady=(1, 0))
103
+ self.dcget("actions")[id] = widget