qpuiq 0.23__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.
Files changed (104) hide show
  1. PUI/PySide6/__init__.py +49 -0
  2. PUI/PySide6/application.py +58 -0
  3. PUI/PySide6/base.py +285 -0
  4. PUI/PySide6/button.py +21 -0
  5. PUI/PySide6/canvas.py +345 -0
  6. PUI/PySide6/checkbox.py +32 -0
  7. PUI/PySide6/combobox.py +85 -0
  8. PUI/PySide6/dialog.py +72 -0
  9. PUI/PySide6/divider.py +23 -0
  10. PUI/PySide6/image.py +48 -0
  11. PUI/PySide6/label.py +33 -0
  12. PUI/PySide6/layout.py +141 -0
  13. PUI/PySide6/matplotlib.py +23 -0
  14. PUI/PySide6/mdi.py +33 -0
  15. PUI/PySide6/menu.py +85 -0
  16. PUI/PySide6/modal.py +132 -0
  17. PUI/PySide6/progressbar.py +17 -0
  18. PUI/PySide6/radiobutton.py +29 -0
  19. PUI/PySide6/scroll.py +155 -0
  20. PUI/PySide6/splitter.py +25 -0
  21. PUI/PySide6/tab.py +39 -0
  22. PUI/PySide6/table.py +147 -0
  23. PUI/PySide6/text.py +35 -0
  24. PUI/PySide6/textfield.py +62 -0
  25. PUI/PySide6/toolbar.py +57 -0
  26. PUI/PySide6/tree.py +290 -0
  27. PUI/PySide6/window.py +82 -0
  28. PUI/__init__.py +46 -0
  29. PUI/common.py +26 -0
  30. PUI/decorator.py +20 -0
  31. PUI/dom.py +263 -0
  32. PUI/flet/__init__.py +22 -0
  33. PUI/flet/application.py +42 -0
  34. PUI/flet/base.py +37 -0
  35. PUI/flet/button.py +20 -0
  36. PUI/flet/canvas.py +86 -0
  37. PUI/flet/checkbox.py +23 -0
  38. PUI/flet/divider.py +14 -0
  39. PUI/flet/label.py +27 -0
  40. PUI/flet/layout.py +50 -0
  41. PUI/flet/progressbar.py +21 -0
  42. PUI/flet/radiobutton.py +27 -0
  43. PUI/flet/scroll.py +83 -0
  44. PUI/flet/tab.py +42 -0
  45. PUI/flet/text.py +55 -0
  46. PUI/flet/textfield.py +58 -0
  47. PUI/flet/window.py +25 -0
  48. PUI/interfaces.py +97 -0
  49. PUI/node.py +432 -0
  50. PUI/state.py +711 -0
  51. PUI/textual/__init__.py +35 -0
  52. PUI/textual/application.py +82 -0
  53. PUI/textual/base.py +148 -0
  54. PUI/textual/button.py +17 -0
  55. PUI/textual/checkbox.py +21 -0
  56. PUI/textual/label.py +36 -0
  57. PUI/textual/layout.py +52 -0
  58. PUI/textual/progressbar.py +17 -0
  59. PUI/textual/radiobutton.py +24 -0
  60. PUI/textual/scroll.py +74 -0
  61. PUI/textual/tab.py +75 -0
  62. PUI/textual/text.py +32 -0
  63. PUI/textual/textfield.py +55 -0
  64. PUI/textual/window.py +7 -0
  65. PUI/timeline.py +36 -0
  66. PUI/tkinter/__init__.py +43 -0
  67. PUI/tkinter/application.py +49 -0
  68. PUI/tkinter/base.py +68 -0
  69. PUI/tkinter/button.py +15 -0
  70. PUI/tkinter/canvas.py +52 -0
  71. PUI/tkinter/checkbox.py +27 -0
  72. PUI/tkinter/label.py +17 -0
  73. PUI/tkinter/layout.py +114 -0
  74. PUI/tkinter/progressbar.py +17 -0
  75. PUI/tkinter/radiobutton.py +26 -0
  76. PUI/tkinter/scroll.py +201 -0
  77. PUI/tkinter/tab.py +52 -0
  78. PUI/tkinter/text.py +20 -0
  79. PUI/tkinter/textfield.py +53 -0
  80. PUI/tkinter/window.py +51 -0
  81. PUI/utils.py +15 -0
  82. PUI/view.py +161 -0
  83. PUI/wx/__init__.py +19 -0
  84. PUI/wx/application.py +44 -0
  85. PUI/wx/base.py +246 -0
  86. PUI/wx/button.py +16 -0
  87. PUI/wx/canvas.py +255 -0
  88. PUI/wx/checkbox.py +25 -0
  89. PUI/wx/combobox.py +81 -0
  90. PUI/wx/dialog.py +66 -0
  91. PUI/wx/divider.py +19 -0
  92. PUI/wx/label.py +18 -0
  93. PUI/wx/layout.py +52 -0
  94. PUI/wx/progressbar.py +19 -0
  95. PUI/wx/radiobutton.py +27 -0
  96. PUI/wx/scroll.py +55 -0
  97. PUI/wx/text.py +23 -0
  98. PUI/wx/textfield.py +66 -0
  99. PUI/wx/window.py +64 -0
  100. qpuiq-0.23.dist-info/LICENSE.txt +21 -0
  101. qpuiq-0.23.dist-info/METADATA +234 -0
  102. qpuiq-0.23.dist-info/RECORD +104 -0
  103. qpuiq-0.23.dist-info/WHEEL +5 -0
  104. qpuiq-0.23.dist-info/top_level.txt +1 -0
PUI/wx/textfield.py ADDED
@@ -0,0 +1,66 @@
1
+ from .. import *
2
+ from .base import *
3
+
4
+ class TextField(WxBaseWidget):
5
+ def __init__(self, model, edit_model=None):
6
+ super().__init__()
7
+ self.model = model
8
+ self.edit_model = edit_model
9
+ self.editing = False
10
+ self.changed_cb = None
11
+ self.layout_width = 50
12
+ self.layout_height = -1
13
+
14
+ def update(self, prev):
15
+ model_value = str(self.model.value)
16
+ if prev and prev.ui:
17
+ self.editing = prev.editing
18
+ self.ui = prev.ui
19
+ self.curr_value = prev.curr_value
20
+ if self.curr_value.set(model_value) and not self.editing:
21
+ self.ui.SetValue(model_value)
22
+ else:
23
+ self.curr_value = Prop(model_value)
24
+ self.ui = wx.TextCtrl(getWindow(self.parent), style=wx.TE_PROCESS_ENTER)
25
+ self.ui.SetValue(model_value)
26
+ self.ui.Bind(wx.EVT_TEXT, self.on_textchanged)
27
+ self.ui.Bind(wx.EVT_KILL_FOCUS, self.on_kill_focus)
28
+ self.ui.Bind(wx.EVT_TEXT_ENTER, self.on_enter)
29
+
30
+ self.ui.SetMinSize((self.layout_width, self.layout_height))
31
+
32
+ if self.edit_model and not self.editing:
33
+ self.edit_model.value = model_value
34
+
35
+ super().update(prev)
36
+
37
+ def on_enter(self, event):
38
+ from .window import Window
39
+ p = self.parent
40
+ while p:
41
+ if isinstance(p, Window):
42
+ p.panel.SetFocus()
43
+ break
44
+ p = p.parent
45
+ event.Skip()
46
+
47
+ def on_textchanged(self, event): # editing
48
+ node = self.get_node()
49
+ node.editing = True
50
+ value = self.ui.GetValue()
51
+ if node.edit_model:
52
+ node.edit_model.value = value
53
+ e = PUIEvent()
54
+ e.value = value
55
+ self._input(e)
56
+
57
+ def on_kill_focus(self, event): # finish editing
58
+ node = self.get_node()
59
+ node.editing = False
60
+ value = self.ui.GetValue()
61
+ node.model.value = value
62
+ if node.edit_model:
63
+ node.edit_model.value = value
64
+ e = PUIEvent()
65
+ e.value = value
66
+ self._change(e)
PUI/wx/window.py ADDED
@@ -0,0 +1,64 @@
1
+ from .. import *
2
+ from .base import *
3
+
4
+ class Window(WxBaseWidget):
5
+ pui_terminal = False
6
+
7
+ def __init__(self, title=None, icon=None, size=None, maximize=None, fullscreen=None):
8
+ super().__init__()
9
+ self.title = title
10
+ self.icon = icon
11
+ self.size = size
12
+ self.curr_icon = None
13
+ self.curr_size = None
14
+ self.maximize = maximize
15
+ self.curr_maximize = None
16
+ self.fullscreen = fullscreen
17
+ self.curr_fullscreen = None
18
+
19
+ @property
20
+ def inner(self):
21
+ return self.panel
22
+
23
+ def update(self, prev=None):
24
+ if prev and prev.ui:
25
+ self.ui = prev.ui
26
+ self.panel = prev.panel
27
+ self.curr_icon = prev.curr_icon
28
+ self.curr_size = prev.curr_size
29
+ self.curr_maximize = prev.curr_maximize
30
+ self.curr_fullscreen = prev.curr_fullscreen
31
+ else:
32
+ self.ui = wx.Frame(None)
33
+ self.panel = wx.Panel(self.ui) # to grab focus when clicked
34
+ self.curr_icon = Prop()
35
+ self.curr_size = Prop()
36
+ self.curr_maximize = Prop()
37
+ self.curr_fullscreen = Prop()
38
+
39
+ if self.curr_icon.set(self.icon):
40
+ self.ui.SetIcon(wx.Icon(self.icon))
41
+ if self.curr_size.set(self.size):
42
+ self.ui.SetSize(wx.Size(*self.size))
43
+ if self.curr_maximize.set(self.maximize):
44
+ self.ui.Maximize(True)
45
+ if self.curr_fullscreen.set(self.fullscreen):
46
+ self.ui.ShowFullScreen(True)
47
+ if not self.title is None:
48
+ self.ui.SetTitle(self.title)
49
+ super().update(prev)
50
+
51
+ def addChild(self, idx, child):
52
+ if isinstance(child, WxBaseLayout):
53
+ self.ui.SetSizer(child.outer)
54
+ elif isinstance(child, WxBaseWidget):
55
+ pass
56
+
57
+ def removeChild(self, idx, child):
58
+ if isinstance(child, WxBaseLayout):
59
+ pass
60
+ elif isinstance(child, WxBaseWidget):
61
+ pass
62
+
63
+ def postSync(self):
64
+ self.ui.Layout()
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 buganini@b612.tw
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,234 @@
1
+ Metadata-Version: 2.1
2
+ Name: qpuiq
3
+ Version: 0.23
4
+ Summary: "PUI" Python Declarative UI Framework
5
+ Home-page: https://github.com/buganini/PUI
6
+ Author: Buganini Chiu
7
+ Author-email: buganini@b612.tw
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE.txt
10
+
11
+ # What is PUI
12
+ PUI is a reactive/declarative UI framework with two-way data binding.
13
+ PUI doesn't do UI itself, it turns imperative UI libraries into reactive/declarative flavor with virtual DOM and aims to maintain interoperability.
14
+
15
+ [Slides for SciWork 2023](https://speakerdeck.com/buganini/pui-declarative-ui-framework-for-python)
16
+
17
+ [CPPUI: Experimental C++ Version](https://github.com/buganini/CPPUI)
18
+
19
+ # Installation
20
+ ``` shell
21
+ pip install QPUIQ
22
+
23
+ # Optional, for hot-reload
24
+ pip install jurigged
25
+
26
+ # Optional, for PySide6 backend
27
+ pip install PySide6
28
+
29
+ # Optional, for textual backend
30
+ pip install textual
31
+
32
+ # Optional, for wxPython backend
33
+ pip install wxPython
34
+
35
+ # Optional, for flet backend
36
+ pip install flet
37
+ ```
38
+
39
+ # Get Started
40
+ ## Hello World
41
+ ```python
42
+ # example/hello_world.py
43
+ from PUI.PySide6 import *
44
+
45
+ @PUIApp
46
+ def Example():
47
+ with Window(title="test", size=(320,240)):
48
+ Label("Hello world")
49
+
50
+ root = Example()
51
+ root.run()
52
+ ```
53
+ ![Hello World](screenshots/hello_world.png)
54
+
55
+ ## State & Data Binding
56
+ ```python
57
+ # example/generic_textfield.py
58
+ from PUI.PySide6 import *
59
+
60
+ data = State()
61
+ class Example(Application):
62
+ def __init__(self):
63
+ super().__init__()
64
+ data.var = 0
65
+
66
+ def content(self):
67
+ with Window(title="blah"):
68
+ with VBox():
69
+ with HBox():
70
+ Button("-").click(self.on_minus)
71
+ Label(f"{data.var}")
72
+ Button("+").click(self.on_plus)
73
+
74
+ TextField(data("var")) # binding
75
+
76
+ def on_minus(self):
77
+ data.var -= 1
78
+
79
+ def on_plus(self):
80
+ data.var += 1
81
+
82
+ root = Example()
83
+ root.run()
84
+ ```
85
+ ![State & Data Binding](screenshots/pyside6_textfield.png)
86
+
87
+ ## View Component
88
+ ```python
89
+ # example/bleak_list.py
90
+
91
+ ....
92
+
93
+ @PUI # View Component
94
+ def DeviceView(device, advertising_data):
95
+ Label(f"{device.address} {device.name} {advertising_data.rssi}")
96
+
97
+ class GUI(Application):
98
+ def __init__(self, state):
99
+ super().__init__()
100
+ self.state = state
101
+
102
+ def content(self):
103
+ with Window(title="BLE List"):
104
+ with VBox():
105
+ Label(f"Found {len(self.state.scanned_devices)} devices")
106
+ for device, advertising_data in self.state.scanned_devices:
107
+ DeviceView(device, advertising_data)
108
+
109
+ ....
110
+ ```
111
+ ![View Component](screenshots/bleak_list.png)
112
+
113
+ ## Layout & Styling
114
+ ```python
115
+ # example/pyside6_feedparser.py
116
+
117
+ ...
118
+ with VBox():
119
+ Label(title).qt(StyleSheet={"font-weight":"bold"}) # QT-specific
120
+
121
+ with HBox():
122
+ with Scroll():
123
+ with VBox():
124
+ for i,e in enumerate(entries):
125
+ Label(e.title).click(self.entry_selected, i)
126
+ Spacer()
127
+
128
+ with Scroll().layout(weight=1): # Generic Layout Parameter
129
+ if 0 <= selected and selected < len(entries):
130
+ (Text(entries[selected].description)
131
+ .layout(padding=10) # Generic Layout Parameter
132
+ .qt(StyleSheet={"background-color":"white", "color":"black"})) # QT-specific
133
+ ...
134
+ ```
135
+ ![Layout & Styling](screenshots/feed_parser_padding.png)
136
+
137
+
138
+ ## Canvas
139
+ ```python
140
+ # example/generic_canvas.py
141
+
142
+ from PUI.PySide6 import *
143
+
144
+ data = State()
145
+ class Example(Application):
146
+ def __init__(self):
147
+ super().__init__()
148
+ data.var = 50
149
+
150
+ def content(self):
151
+ with Window(title="blah", size=(640,480)):
152
+ with VBox():
153
+ Canvas(self.painter, data.var)
154
+ with HBox():
155
+ Button("-").click(self.on_minus)
156
+ Label(f"{data.var}").layout(weight=1)
157
+ Button("+").click(self.on_plus)
158
+
159
+ @staticmethod
160
+ def painter(canvas, var):
161
+ canvas.drawText(var, var/2, f"blah {var}")
162
+ canvas.drawLine(var, var, var*2, var*3, color=0xFFFF00)
163
+
164
+ def on_minus(self):
165
+ data.var -= 1
166
+
167
+ def on_plus(self):
168
+ data.var += 1
169
+
170
+ root = Example()
171
+ root.run()
172
+ ```
173
+ ![Canvas](screenshots/pyside6_canvas.gif)
174
+
175
+ ## Cookbook
176
+ `python -m cookbook PySide6` (requires pygments for syntax highlight)
177
+
178
+ ![Cookbook 1](screenshots/cookbook1.png)
179
+ ![Cookbook 2](screenshots/cookbook2.png)
180
+
181
+ `python -m cookbook textual`
182
+ ![Cookbook textual](screenshots/cookbook_textual.png)
183
+
184
+ `python -m cookbook flet`
185
+ ![Cookbook flet](screenshots/cookbook_flet.png)
186
+
187
+ `python -m cookbook tkinter`
188
+ ![Cookbook tkinter](screenshots/cookbook_tkinter.png)
189
+
190
+ # Hot Reload
191
+ ``` shell
192
+ pip install jurigged
193
+ ```
194
+ Then PUI will take care of view update [(code)](https://github.com/buganini/PUI/blob/main/PUI/__init__.py#L11)
195
+
196
+
197
+ # Backends
198
+ ## Tier-1
199
+ * PySide6
200
+ ## Lower Priority
201
+ * wx
202
+ * tkinter
203
+ * or https://github.com/rdbende/Sun-Valley-ttk-theme
204
+ * flet
205
+ * textual (Text Mode)
206
+ * no canvas
207
+
208
+ # Documents
209
+ * [Components Reference](https://buganini.github.io/PUI/doc/Reference.html)
210
+ * [Layout Strategy](https://buganini.github.io/PUI/doc/Layout.html)
211
+
212
+ # Used by
213
+ * https://github.com/buganini/Kikakuka
214
+ * https://github.com/solvcon/modmesh
215
+
216
+ # TODO
217
+ * Dump with layout parameters and add test cases
218
+ * [Toga](https://beeware.org/project/projects/libraries/toga/)
219
+ * [ISSUE] flet layout sizing (cookbook scroll example)
220
+ * nested state trigger
221
+ * set state in PUIView __init__
222
+ * set state in setup() ?
223
+ * Tabs(`tabposition`)
224
+ * Lazy List
225
+ * UI Flow
226
+ * Navigation Stack
227
+ * View Router
228
+ * Model Window/Dialog
229
+ * Layout
230
+ * SwiftUI style overlay ??
231
+ * Canvas
232
+ * Arc
233
+ * ...
234
+ * State with Pydantic support?
@@ -0,0 +1,104 @@
1
+ PUI/__init__.py,sha256=xwRcW9B2CxbRehuqeuXG8tlas75GXO1Ad__y-ALwtWc,966
2
+ PUI/common.py,sha256=fUJmHOu5lSCeiOhFDF6YqulJxFqWmsneqnDZ2kZFFmM,581
3
+ PUI/decorator.py,sha256=BN3POYv69QCDomoHENN-UA-d4wY_vfARIb5RJ2qEnS8,483
4
+ PUI/dom.py,sha256=8tsDW-ccyl56gPSx4GlKPgJ1Cwta6xkMwfa8WDQ8NTE,11456
5
+ PUI/interfaces.py,sha256=rGUciM3S6ICEVgVoahkva8yXUGpweqy1kAzhUQut40E,2182
6
+ PUI/node.py,sha256=er4omxVyiUc2hq5eNe70vXMJA0SexsAIdrrBvn68Fyc,13666
7
+ PUI/state.py,sha256=R-LEXuwpSfCe3C4BnyVv0RNjzBBrQYRUeKAHhKaEa6A,20414
8
+ PUI/timeline.py,sha256=-mO1TLqxp2_3dk-EvdBE9wBkQf5RIPrPazTPXDzWSN0,940
9
+ PUI/utils.py,sha256=canb7_Uz0sQ1UZDzyDuIsfAVXzEfZCkc9F81sMY4rTE,505
10
+ PUI/view.py,sha256=Oe6sXLHD554GnlLlO5QpY7kegngkzrmMEYRHrdzGZUQ,4623
11
+ PUI/PySide6/__init__.py,sha256=z895ldBVUaEqfGQW4CvYhWh2F6L0qGQA1MXUHVMf9Ms,1110
12
+ PUI/PySide6/application.py,sha256=OsIE47efST4I13txD-7rS1cTWAGhynckl45Wdb1bafk,1471
13
+ PUI/PySide6/base.py,sha256=GmfT10tewYkGW95tVczXBkQTTUEo3k2svFkk4vsODpw,8649
14
+ PUI/PySide6/button.py,sha256=mHfcH98dABYgksuT58fK0amSwtCM9aaYwr7Y2EArEJA,561
15
+ PUI/PySide6/canvas.py,sha256=Cu1CKCTTphsIqYP667uwCSM_qngTaRWFt79u-j2LVNQ,11297
16
+ PUI/PySide6/checkbox.py,sha256=Rsns0BleE4g9yTDdlsD8IADU3qcQkVO2VsFVvYlNL88,900
17
+ PUI/PySide6/combobox.py,sha256=4FvMt8D9MSyGk_oNHZ0jDuop7A-dkrxEesUXMdKghuw,2503
18
+ PUI/PySide6/dialog.py,sha256=4rAyLMqd47ALDxrBGLFHS5FD75SP1I8tkMSKBdaPkv0,2364
19
+ PUI/PySide6/divider.py,sha256=jRR8Qtdil-8JTxj8SyJydzRB_MGTKa_TxegsqkYKcXc,733
20
+ PUI/PySide6/image.py,sha256=uORM63K6v-1Ug4KpRJW3YHc-PpICqmRxmAzcEL6MaME,1969
21
+ PUI/PySide6/label.py,sha256=_G8bckRPPQdzZTS3j9JaOmfRAnLragBXnyJUG9_kblU,1038
22
+ PUI/PySide6/layout.py,sha256=jE6a15IuDf8Ahwj7uDzItjHo-tnkm0XWrfV84sRkmUM,4717
23
+ PUI/PySide6/matplotlib.py,sha256=fzVfwgmEX7s_WDtc_JULRdBOfZgcBewiH79f4ahZHQ4,825
24
+ PUI/PySide6/mdi.py,sha256=OGE2-5--Cy-srAzM-ZexnJ1efeORQvlsH2UA7qp18iE,805
25
+ PUI/PySide6/menu.py,sha256=Qbw_0WX56vzC2vkvn-4DXzYX0vZ-4Rq6tW1Kj_M-Qb8,2806
26
+ PUI/PySide6/modal.py,sha256=PfF21YRQu4NYMANlfKqllMLcei78Cn9Cv9MsU_XNrK4,4266
27
+ PUI/PySide6/progressbar.py,sha256=u55YFofqobF_j5k77CGT7dOAMgtNeWmLwXI5Ht3Go8U,479
28
+ PUI/PySide6/radiobutton.py,sha256=Qe5jjVkGSx8Pf3deAm-9c0cbYsrWl15W9UxrwrWuOo4,797
29
+ PUI/PySide6/scroll.py,sha256=za2_PkoukhBRAUHKFGgsR4hH4dqgQnKr4MiEMBBNW2k,5882
30
+ PUI/PySide6/splitter.py,sha256=ObjcC8UgkAL7o-xXhi4XIkDEKhC4s5Ukk7tKMNa023Q,797
31
+ PUI/PySide6/tab.py,sha256=tMkhEfD4Wb_7Hs4-u4nOzm87GSHqmehcnwcFm24qRIg,953
32
+ PUI/PySide6/table.py,sha256=TTCMf_YNKmkFiqs_qLqw3qbvFsxoBNnz9VMObx_2l3s,4800
33
+ PUI/PySide6/text.py,sha256=4kRRZiuH-bLLJMNZ6hK9zAWOorsG-l4uujHbG6I5S20,1069
34
+ PUI/PySide6/textfield.py,sha256=mjaQErUTqJ1VUeWXLfzoInTbCuKICX5o-tXAAQQS04s,2112
35
+ PUI/PySide6/toolbar.py,sha256=NPkn99D5xK4RLBA0vxLD7EqYu5eh9ucCL2y1vSJWQl4,1800
36
+ PUI/PySide6/tree.py,sha256=skMsCykh8kWXFTg4Yv--PevJ58fqEeZV566ICjBVO4E,9324
37
+ PUI/PySide6/window.py,sha256=zNPbAu9R-PTmdoI7tTH5_TNTcdBoOzvOFHofBhKxMeQ,2854
38
+ PUI/flet/__init__.py,sha256=9gIKHEEfBKBtSwstGKqmwc_bL4WNsVdxp5net0WAqcQ,461
39
+ PUI/flet/application.py,sha256=3ZGZrAngSEkVK-WseOV-n_6ljhd86ZKBgO6Jp2PmsJA,937
40
+ PUI/flet/base.py,sha256=PWfjJpWUsBPKM44T2j2euowrLmH0ZLoo-o64S_yy2xs,895
41
+ PUI/flet/button.py,sha256=r1tZEOk33LHRDS_ImUfa3piv6zWTXvVIMtjZ1ZI_15I,540
42
+ PUI/flet/canvas.py,sha256=HJjFSdomLkKDCeL7HCu8Mb6b4zidEwycv0EbQbd8Qks,2543
43
+ PUI/flet/checkbox.py,sha256=GOhE8aoT2kGCcs5XGNjkxlXgtC63nCCdETq-J-6WPsc,633
44
+ PUI/flet/divider.py,sha256=7eBPHjM7kJFb4BHdZUfmgPwAVUvh9YJnq_04aM8zdPQ,331
45
+ PUI/flet/label.py,sha256=igfYRe2as98G1NeICHyb1C2p5fzWIdbXFYCGFZqAfTs,679
46
+ PUI/flet/layout.py,sha256=th-KVCI5WrjrrpuLWCII5sMZphuAVVFreUl3yDON1pY,1201
47
+ PUI/flet/progressbar.py,sha256=3ox389RnlxuU_CP6cILAMOShfOLDt-KwqpjApLzXf0w,565
48
+ PUI/flet/radiobutton.py,sha256=IrgP_SvOImhZvFAZ6ZeAXv6KTUw3bEaGAIsxfODiO9I,830
49
+ PUI/flet/scroll.py,sha256=B2IKoE6yo5CB8BykH_wAh3hbEavTnboYtajdknpp3b4,2212
50
+ PUI/flet/tab.py,sha256=T26PZ-Ma_LPUx7u9qbxEnYqxuR1-qlytWiB9TDpu7G8,997
51
+ PUI/flet/text.py,sha256=HGnhOTDwG5pqceK8x_C6wCZj1AKuqZ9vEZB_NFwXZo4,1465
52
+ PUI/flet/textfield.py,sha256=1N3WwKrDkTkQGtA8pNAXeSL-CZhfpg1TDYhFFjbhnL0,1774
53
+ PUI/flet/window.py,sha256=NqUnGYvhk2Mpo_G2WthZOEvlU6VMx6AM-jWMKcUqGDM,650
54
+ PUI/textual/__init__.py,sha256=cPf0_BXd2Q-6w-0UHyxFQ6QLfTVDaoo7XmSCW_1kpyc,732
55
+ PUI/textual/application.py,sha256=ot7H0RRNf65PU9tF6EU6x2qLq7Yhv9tCA9Q4ZyZ7doo,2516
56
+ PUI/textual/base.py,sha256=W0tfxGlZErrsCoLb9IuFjgmNa93vZFCYNgZr1V6VEjE,4821
57
+ PUI/textual/button.py,sha256=VF7fmgi5mHeOzptZzy4oBfcuCeUURq5eFrLvN4Fgg30,436
58
+ PUI/textual/checkbox.py,sha256=pkBxZz0qXl2KUz2-Lqap-r2Y3DBI0CET3wQgEpYKb7U,518
59
+ PUI/textual/label.py,sha256=3kwUerDSbyUPPEkLsjs0qDcyyhgOvUws2wtjovyf0_k,1220
60
+ PUI/textual/layout.py,sha256=xS3xa7UHyfKT93zW2592lV7iu6POuRJKLGyvRvtHIlQ,1302
61
+ PUI/textual/progressbar.py,sha256=aeLiXzLOj3VWR-KUEBmmEOxJR0LACr1_-MDMOYDHx9c,501
62
+ PUI/textual/radiobutton.py,sha256=zFKG2LeUnPXnxpxeW3cYqPwd91DQZWFUctundau-4b0,621
63
+ PUI/textual/scroll.py,sha256=u6-tFygXZR_giVsCaePahKxTb0xTbdBHCNisQA9jpWc,1974
64
+ PUI/textual/tab.py,sha256=wcvyH1MZZNwwout8iJDifty_lqe6YuhfRpE3F0lUTBM,2158
65
+ PUI/textual/text.py,sha256=BHvgK3JqBU_LrnWbaaKBFxQ_50Z9lFhcdEJoVJqbcSc,782
66
+ PUI/textual/textfield.py,sha256=SVSOfVcdr0XtI9jyDwWgxDX5umSEbqL7_f7XC76A6Ak,1656
67
+ PUI/textual/window.py,sha256=ygb1txNlo2bjQkKVzSD4UgU2OTzJ-zeEjM0p8wcYZJA,181
68
+ PUI/tkinter/__init__.py,sha256=VQjdak9UO-zI7n9Kr4q_B-kgCXgag2DVoWWP_QdH2uk,982
69
+ PUI/tkinter/application.py,sha256=NxWfU9NHJuceKMdLiGeklUKU5WjYVUomGL_hJpRtrbs,1141
70
+ PUI/tkinter/base.py,sha256=jSOKxd2uMOhVvDjBOloxdiHeNvKwEoWJo0fyVH49ttI,2663
71
+ PUI/tkinter/button.py,sha256=zRGt_jVY6q74Jer5jm4q4H-_LznrXUzfEQwiMWtQboI,467
72
+ PUI/tkinter/canvas.py,sha256=nLi46ZhgEvpZz8_aUy1DwfKct4zdABjqL-9ObS1CCMM,1654
73
+ PUI/tkinter/checkbox.py,sha256=TOYOCKx9ux58YdYWXLkjguFG3NsgVaYlFOIrZ9ukcwI,741
74
+ PUI/tkinter/label.py,sha256=o6hj-8qX0ZwDDbYaNsTz5oUIXKJFr-HctTeZW2NfhHE,555
75
+ PUI/tkinter/layout.py,sha256=q1NgGlPd_dn1avIzJBeO_46NyBPCQyh3VcQ56YmUUKE,3576
76
+ PUI/tkinter/progressbar.py,sha256=OPtlujCv5tSGvRoqmW7URhdXzgHlVDbpTT_Rx143l1I,488
77
+ PUI/tkinter/radiobutton.py,sha256=RBcC9u9v1N5RDTn6GxEwbJr0kYh43j-r7zB6Ic1pIqI,750
78
+ PUI/tkinter/scroll.py,sha256=MhBuGcKRlqiMiNG1I5bI_wCJT4rwLQbB4ViOsXHcdi8,6685
79
+ PUI/tkinter/tab.py,sha256=-1r95U0q3hnSLokD1QU3hsQ2wiDteZ6KZwula7rwbVQ,1426
80
+ PUI/tkinter/text.py,sha256=5IJOD86iodYqUD-lFnLUnD4vYvUw-8wUPoLNq_RuBsA,501
81
+ PUI/tkinter/textfield.py,sha256=R4YNLfoxC7VSCuAFyVqaqKPTno7fUGO1u5YjkMrQ1Zk,1746
82
+ PUI/tkinter/window.py,sha256=IIieSxxanhGIvPy0krQuLrStsL_jTUdx6TKbEf64nyQ,1606
83
+ PUI/wx/__init__.py,sha256=j8L1kzL4CK_xeF0x5_NZekGETYP_1Dhq3-BuV1LtXoY,391
84
+ PUI/wx/application.py,sha256=Ku_mloCyiw-KTl8a09uTIhV7uupG_7urqw8jXIwQMLc,965
85
+ PUI/wx/base.py,sha256=geBeTK_iyBC_0Wj7rK4tX6FZY4i5_MYAU52wERxv3rg,7594
86
+ PUI/wx/button.py,sha256=ww3Iyn16zomP4zkQhvXTirmHBvlVMJxmiV1pfXtgrSo,447
87
+ PUI/wx/canvas.py,sha256=uL4z0ghM15IWNlvmDyV3lVw8Li4RNMJWXHvwd7jZSiw,8487
88
+ PUI/wx/checkbox.py,sha256=XgLxsi-tk2f9bnlEvhvEZV4boBGFB3u62ZE1cs8X9tU,674
89
+ PUI/wx/combobox.py,sha256=hsWb4L9zsfyc8CTmRPVfu28XnuIfKISfa575Z-J0DKw,2365
90
+ PUI/wx/dialog.py,sha256=HVLVdzRkZhRndkHTYl0RgNfzIQBdtik7DIDg93Dp9JA,2572
91
+ PUI/wx/divider.py,sha256=qnaUVpspAOND6YhZyQsZeos1LC02L-ljfdAtVp1vdzw,516
92
+ PUI/wx/label.py,sha256=qr3hGfHtjvYjeXJSB2cD5u30LYodEzix4Q0FYw8p6p0,509
93
+ PUI/wx/layout.py,sha256=nVO31_Xu4aDcTLxlz66DJ5PK2RPHk0yq6qdzyWuGVz8,1460
94
+ PUI/wx/progressbar.py,sha256=OXLZRiBy9oYzBiI-mhQhARcoeSoawEa1Ur8b0CjWr2U,495
95
+ PUI/wx/radiobutton.py,sha256=x7WnCGXuNPV98MqF-tRLzMOOExim22rayNL8jAYVZWk,769
96
+ PUI/wx/scroll.py,sha256=pvRmt04XEgObpIgwl9i52Kf1wI9ubUfZM77fPHGW9zU,1494
97
+ PUI/wx/text.py,sha256=YeIyDyHH0xBcD_iXbYSTtvL25YDtug1QJNVPvCSAqEk,544
98
+ PUI/wx/textfield.py,sha256=v3cSnmsyBix_G8xFXgZZrNLydlLTA6gQQPpkTdJ29hk,2086
99
+ PUI/wx/window.py,sha256=HBiWRpuhjSS89pjbdlbstjQmfR0mSECTsOPLu7ymLjo,2017
100
+ qpuiq-0.23.dist-info/LICENSE.txt,sha256=1Xwik2AmLNGoIYhAPzvNC28M08Q3EvkOe4TtlQuSd_E,1072
101
+ qpuiq-0.23.dist-info/METADATA,sha256=xFOBZQ1ErsHE-1eW1YZp6Cq7KOj9WW_Vmw17evyNZns,5671
102
+ qpuiq-0.23.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
103
+ qpuiq-0.23.dist-info/top_level.txt,sha256=zMudhifPite0CEVGYvdi-5W3P_dpum71xjU7_g-ZHS0,4
104
+ qpuiq-0.23.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (70.3.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ PUI