qpuiq 0.10__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.

Potentially problematic release.


This version of qpuiq might be problematic. Click here for more details.

Files changed (103) hide show
  1. PUI/PySide6/__init__.py +49 -0
  2. PUI/PySide6/application.py +58 -0
  3. PUI/PySide6/base.py +222 -0
  4. PUI/PySide6/button.py +21 -0
  5. PUI/PySide6/canvas.py +288 -0
  6. PUI/PySide6/checkbox.py +32 -0
  7. PUI/PySide6/combobox.py +75 -0
  8. PUI/PySide6/dialog.py +72 -0
  9. PUI/PySide6/divider.py +23 -0
  10. PUI/PySide6/image.py +30 -0
  11. PUI/PySide6/label.py +33 -0
  12. PUI/PySide6/layout.py +72 -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 +153 -0
  20. PUI/PySide6/splitter.py +25 -0
  21. PUI/PySide6/tab.py +39 -0
  22. PUI/PySide6/table.py +89 -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 +120 -0
  27. PUI/PySide6/window.py +81 -0
  28. PUI/__init__.py +46 -0
  29. PUI/common.py +20 -0
  30. PUI/decorator.py +20 -0
  31. PUI/dom.py +238 -0
  32. PUI/flet/__init__.py +21 -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/label.py +27 -0
  39. PUI/flet/layout.py +50 -0
  40. PUI/flet/progressbar.py +21 -0
  41. PUI/flet/radiobutton.py +27 -0
  42. PUI/flet/scroll.py +83 -0
  43. PUI/flet/tab.py +42 -0
  44. PUI/flet/text.py +55 -0
  45. PUI/flet/textfield.py +58 -0
  46. PUI/flet/window.py +25 -0
  47. PUI/interfaces.py +97 -0
  48. PUI/node.py +407 -0
  49. PUI/state.py +698 -0
  50. PUI/textual/__init__.py +34 -0
  51. PUI/textual/application.py +82 -0
  52. PUI/textual/base.py +113 -0
  53. PUI/textual/button.py +17 -0
  54. PUI/textual/checkbox.py +21 -0
  55. PUI/textual/label.py +36 -0
  56. PUI/textual/layout.py +48 -0
  57. PUI/textual/progressbar.py +17 -0
  58. PUI/textual/radiobutton.py +24 -0
  59. PUI/textual/scroll.py +72 -0
  60. PUI/textual/tab.py +75 -0
  61. PUI/textual/text.py +32 -0
  62. PUI/textual/textfield.py +49 -0
  63. PUI/textual/window.py +7 -0
  64. PUI/timeline.py +36 -0
  65. PUI/tkinter/__init__.py +43 -0
  66. PUI/tkinter/application.py +49 -0
  67. PUI/tkinter/base.py +68 -0
  68. PUI/tkinter/button.py +15 -0
  69. PUI/tkinter/canvas.py +49 -0
  70. PUI/tkinter/checkbox.py +27 -0
  71. PUI/tkinter/label.py +17 -0
  72. PUI/tkinter/layout.py +114 -0
  73. PUI/tkinter/progressbar.py +17 -0
  74. PUI/tkinter/radiobutton.py +26 -0
  75. PUI/tkinter/scroll.py +201 -0
  76. PUI/tkinter/tab.py +52 -0
  77. PUI/tkinter/text.py +20 -0
  78. PUI/tkinter/textfield.py +53 -0
  79. PUI/tkinter/window.py +51 -0
  80. PUI/utils.py +15 -0
  81. PUI/view.py +161 -0
  82. PUI/wx/__init__.py +19 -0
  83. PUI/wx/application.py +44 -0
  84. PUI/wx/base.py +202 -0
  85. PUI/wx/button.py +16 -0
  86. PUI/wx/canvas.py +255 -0
  87. PUI/wx/checkbox.py +25 -0
  88. PUI/wx/combobox.py +72 -0
  89. PUI/wx/dialog.py +66 -0
  90. PUI/wx/divider.py +19 -0
  91. PUI/wx/label.py +18 -0
  92. PUI/wx/layout.py +46 -0
  93. PUI/wx/progressbar.py +17 -0
  94. PUI/wx/radiobutton.py +27 -0
  95. PUI/wx/scroll.py +44 -0
  96. PUI/wx/text.py +23 -0
  97. PUI/wx/textfield.py +56 -0
  98. PUI/wx/window.py +58 -0
  99. qpuiq-0.10.dist-info/LICENSE.txt +21 -0
  100. qpuiq-0.10.dist-info/METADATA +227 -0
  101. qpuiq-0.10.dist-info/RECORD +103 -0
  102. qpuiq-0.10.dist-info/WHEEL +5 -0
  103. qpuiq-0.10.dist-info/top_level.txt +1 -0
PUI/wx/window.py ADDED
@@ -0,0 +1,58 @@
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
+ def update(self, prev=None):
20
+ if prev and prev.ui:
21
+ self.ui = prev.ui
22
+ self.curr_icon = prev.curr_icon
23
+ self.curr_size = prev.curr_size
24
+ self.curr_maximize = prev.curr_maximize
25
+ self.curr_fullscreen = prev.curr_fullscreen
26
+ else:
27
+ self.ui = wx.Frame(None)
28
+ self.curr_icon = Prop()
29
+ self.curr_size = Prop()
30
+ self.curr_maximize = Prop()
31
+ self.curr_fullscreen = Prop()
32
+
33
+ if self.curr_icon.set(self.icon):
34
+ self.ui.SetIcon(wx.Icon(self.icon))
35
+ if self.curr_size.set(self.size):
36
+ self.ui.SetSize(wx.Size(*self.size))
37
+ if self.curr_maximize.set(self.maximize):
38
+ self.ui.Maximize(True)
39
+ if self.curr_fullscreen.set(self.fullscreen):
40
+ self.ui.ShowFullScreen(True)
41
+ if not self.title is None:
42
+ self.ui.SetTitle(self.title)
43
+ super().update(prev)
44
+
45
+ def addChild(self, idx, child):
46
+ if isinstance(child, WxBaseLayout):
47
+ self.ui.SetSizer(child.outer)
48
+ elif isinstance(child, WxBaseWidget):
49
+ pass
50
+
51
+ def removeChild(self, idx, child):
52
+ if isinstance(child, WxBaseLayout):
53
+ pass
54
+ elif isinstance(child, WxBaseWidget):
55
+ pass
56
+
57
+ def postSync(self):
58
+ 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,227 @@
1
+ Metadata-Version: 2.1
2
+ Name: qpuiq
3
+ Version: 0.10
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
+ ```
21
+ pip install QPUIQ
22
+ ```
23
+
24
+ # Get Started
25
+ ## Hello World
26
+ ```python
27
+ # example/hello_world.py
28
+ from PUI.PySide6 import *
29
+
30
+ @PUIApp
31
+ def Example():
32
+ with Window(title="test", size=(320,240)):
33
+ Label("Hello world")
34
+
35
+ root = Example()
36
+ root.run()
37
+ ```
38
+ ![Hello World](screenshots/hello_world.png)
39
+
40
+ ## State & Data Binding
41
+ ```python
42
+ # example/generic_textfield.py
43
+ from PUI.PySide6 import *
44
+
45
+ data = State()
46
+ class Example(Application):
47
+ def __init__(self):
48
+ super().__init__()
49
+ data.var = 0
50
+
51
+ def content(self):
52
+ with Window(title="blah"):
53
+ with VBox():
54
+ with HBox():
55
+ Button("-").click(self.on_minus)
56
+ Label(f"{data.var}")
57
+ Button("+").click(self.on_plus)
58
+
59
+ TextField(data("var")) # binding
60
+
61
+ def on_minus(self):
62
+ data.var -= 1
63
+
64
+ def on_plus(self):
65
+ data.var += 1
66
+
67
+ root = Example()
68
+ root.run()
69
+ ```
70
+ ![State & Data Binding](screenshots/pyside6_textfield.png)
71
+
72
+ ## View Component
73
+ ```python
74
+ # example/bleak_list.py
75
+
76
+ ....
77
+
78
+ @PUI # View Component
79
+ def DeviceView(device, advertising_data):
80
+ Label(f"{device.address} {device.name} {advertising_data.rssi}")
81
+
82
+ class GUI(Application):
83
+ def __init__(self, state):
84
+ super().__init__()
85
+ self.state = state
86
+
87
+ def content(self):
88
+ with Window(title="BLE List"):
89
+ with VBox():
90
+ Label(f"Found {len(self.state.scanned_devices)} devices")
91
+ for device, advertising_data in self.state.scanned_devices:
92
+ DeviceView(device, advertising_data)
93
+
94
+ ....
95
+ ```
96
+ ![View Component](screenshots/bleak_list.png)
97
+
98
+ ## Layout & Styling
99
+ ```python
100
+ # example/pyside6_feedparser.py
101
+
102
+ ...
103
+ with VBox():
104
+ Label(title).qt(StyleSheet={"font-weight":"bold"}) # QT-specific
105
+
106
+ with HBox():
107
+ with Scroll():
108
+ with VBox():
109
+ for i,e in enumerate(entries):
110
+ Label(e.title).click(self.entry_selected, i)
111
+ Spacer()
112
+
113
+ with Scroll().layout(weight=1): # Generic Layout Parameter
114
+ if 0 <= selected and selected < len(entries):
115
+ (Text(entries[selected].description)
116
+ .layout(padding=10) # Generic Layout Parameter
117
+ .qt(StyleSheet={"background-color":"white", "color":"black"})) # QT-specific
118
+ ...
119
+ ```
120
+ ![Layout & Styling](screenshots/feed_parser_padding.png)
121
+
122
+
123
+ ## Canvas
124
+ ```python
125
+ # example/generic_canvas.py
126
+
127
+ from PUI.PySide6 import *
128
+
129
+ data = State()
130
+ class Example(Application):
131
+ def __init__(self):
132
+ super().__init__()
133
+ data.var = 50
134
+
135
+ def content(self):
136
+ with Window(title="blah", size=(640,480)):
137
+ with VBox():
138
+ Canvas(self.painter, data.var)
139
+ with HBox():
140
+ Button("-").click(self.on_minus)
141
+ Label(f"{data.var}").layout(weight=1)
142
+ Button("+").click(self.on_plus)
143
+
144
+ @staticmethod
145
+ def painter(canvas, var):
146
+ canvas.drawText(var, var/2, f"blah {var}")
147
+ canvas.drawLine(var, var, var*2, var*3, color=0xFFFF00)
148
+
149
+ def on_minus(self):
150
+ data.var -= 1
151
+
152
+ def on_plus(self):
153
+ data.var += 1
154
+
155
+ root = Example()
156
+ root.run()
157
+ ```
158
+ ![Canvas](screenshots/pyside6_canvas.gif)
159
+
160
+ ## Cookbook
161
+ `python -m cookbook PySide6` (requires pygments for syntax highlight)
162
+
163
+ ![Cookbook 1](screenshots/cookbook1.png)
164
+ ![Cookbook 2](screenshots/cookbook2.png)
165
+
166
+ `python -m cookbook textual`
167
+ ![Cookbook textual](screenshots/cookbook_textual.png)
168
+
169
+ `python -m cookbook flet`
170
+ ![Cookbook flet](screenshots/cookbook_flet.png)
171
+
172
+ `python -m cookbook tkinter`
173
+ ![Cookbook tkinter](screenshots/cookbook_tkinter.png)
174
+
175
+ # Hot Reload
176
+ ``` shell
177
+ pip install jurigged
178
+ ```
179
+ Then PUI will take care of view update [(code)](https://github.com/buganini/PUI/blob/main/PUI/__init__.py#L11)
180
+
181
+
182
+ # Backends
183
+ ## Tier-1
184
+ * PySide6
185
+ ## Lower Priority
186
+ * wx
187
+ * tkinter
188
+ * or https://github.com/rdbende/Sun-Valley-ttk-theme
189
+ * flet
190
+ * textual (Text Mode)
191
+ * no canvas
192
+
193
+ # Components
194
+ [Reference](REFERENCE.md)
195
+
196
+ # Used by
197
+ * https://github.com/buganini/kikit-ui
198
+ * https://github.com/solvcon/modmesh
199
+
200
+ # TODO
201
+ * Merge node and view
202
+ * Dump with layout parameters and add test cases
203
+ * [Toga](https://beeware.org/project/projects/libraries/toga/)
204
+ * [ISSUE] textual layout sizing (cookbook scroll example)
205
+ * [ISSUE] flet layout sizing (cookbook scroll example)
206
+ * nested state trigger
207
+ * set state in PUIView __init__
208
+ * set state in setup() ?
209
+ * Tabs(`tabposition`)
210
+ * Lazy List
211
+ * StateObject decorator
212
+ * UI Flow
213
+ * Navigation Stack
214
+ * View Router
215
+ * Model Window/Dialog
216
+ * Layout
217
+ * ZBox
218
+ * SwiftUI style overlay ??
219
+ * Canvas
220
+ * Rect
221
+ * Arc
222
+ * Image
223
+ * ...
224
+ * Table
225
+ * Tree
226
+ * Dialog
227
+ * State with Pydantic support?
@@ -0,0 +1,103 @@
1
+ PUI/__init__.py,sha256=YOtSIzMEOR_3LTkjVyJN_abEf3bX6MRpbeQ2HEy8I4U,966
2
+ PUI/common.py,sha256=iCMdJPgdKxnZObpjjYzxa_LN8eS4w0FOTfgaDwD_fGY,500
3
+ PUI/decorator.py,sha256=BN3POYv69QCDomoHENN-UA-d4wY_vfARIb5RJ2qEnS8,483
4
+ PUI/dom.py,sha256=RgdDyv6vSFgkCoj9G2cjzQQOiymG8DwmmSoAZfxYvJM,10141
5
+ PUI/interfaces.py,sha256=rGUciM3S6ICEVgVoahkva8yXUGpweqy1kAzhUQut40E,2182
6
+ PUI/node.py,sha256=Rz1SFv5vzjaIzu6wj4oRLM5Edfu_92iTRxBTaxs2FhI,12848
7
+ PUI/state.py,sha256=74PUUU7gewtuWB2-H51NyIUDtUGx_n3keWie_bkcIQk,20137
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=he1BrtsGGB8ycphYTHo91VRnHxU9rM8Yb749FxLrZb4,6546
14
+ PUI/PySide6/button.py,sha256=mHfcH98dABYgksuT58fK0amSwtCM9aaYwr7Y2EArEJA,561
15
+ PUI/PySide6/canvas.py,sha256=mkMjGXcQmUeV1a1HChv6KTWuh_5ao_qA-dYqCnsHo3s,9108
16
+ PUI/PySide6/checkbox.py,sha256=Rsns0BleE4g9yTDdlsD8IADU3qcQkVO2VsFVvYlNL88,900
17
+ PUI/PySide6/combobox.py,sha256=mn1u4SATJbL1YVlnIecyHklRjUoXumwiyHalF3qInA0,2235
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=0HpyNX-iMGy-yVyanAmnQj4q-bvxJc3k9MY5tNlpiXE,1159
21
+ PUI/PySide6/label.py,sha256=_G8bckRPPQdzZTS3j9JaOmfRAnLragBXnyJUG9_kblU,1038
22
+ PUI/PySide6/layout.py,sha256=hSnDmrir2ztgyj1gQchniwMfjcKM1GtKeXRU9YOM4QE,2617
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=T8eXTW5ABPWbyOV5ioKXbBNE1CdoPmQ9IRmb2x12tqI,5857
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=KyEZpgKOGgTOSHwnwkDwvcrDpQHUd4_eaotmupvlnLs,2907
33
+ PUI/PySide6/text.py,sha256=4kRRZiuH-bLLJMNZ6hK9zAWOorsG-l4uujHbG6I5S20,1069
34
+ PUI/PySide6/textfield.py,sha256=iae4PApplmSI262ux7PEXjYWz4wpeNJqPKmxt7oG65A,2084
35
+ PUI/PySide6/toolbar.py,sha256=NPkn99D5xK4RLBA0vxLD7EqYu5eh9ucCL2y1vSJWQl4,1800
36
+ PUI/PySide6/tree.py,sha256=svGlI7dIvVwizq_IfoZD0rT3nrPOMGp04hXKwGzCQUE,3807
37
+ PUI/PySide6/window.py,sha256=CpkIFpleVr3oXOM6vdukahWtX5SV6cWNc1TUW84JPM4,2694
38
+ PUI/flet/__init__.py,sha256=3YzGA0oPfu9eW8DtKQSoAsa8o6ZTGKWakYBTxGaaH8Y,438
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/label.py,sha256=igfYRe2as98G1NeICHyb1C2p5fzWIdbXFYCGFZqAfTs,679
45
+ PUI/flet/layout.py,sha256=th-KVCI5WrjrrpuLWCII5sMZphuAVVFreUl3yDON1pY,1201
46
+ PUI/flet/progressbar.py,sha256=3ox389RnlxuU_CP6cILAMOShfOLDt-KwqpjApLzXf0w,565
47
+ PUI/flet/radiobutton.py,sha256=IrgP_SvOImhZvFAZ6ZeAXv6KTUw3bEaGAIsxfODiO9I,830
48
+ PUI/flet/scroll.py,sha256=B2IKoE6yo5CB8BykH_wAh3hbEavTnboYtajdknpp3b4,2212
49
+ PUI/flet/tab.py,sha256=T26PZ-Ma_LPUx7u9qbxEnYqxuR1-qlytWiB9TDpu7G8,997
50
+ PUI/flet/text.py,sha256=HGnhOTDwG5pqceK8x_C6wCZj1AKuqZ9vEZB_NFwXZo4,1465
51
+ PUI/flet/textfield.py,sha256=Acn0dXIWPR5zcXV9lEfUY5cAP8qGjlzQjTeRdxsheGM,1747
52
+ PUI/flet/window.py,sha256=NqUnGYvhk2Mpo_G2WthZOEvlU6VMx6AM-jWMKcUqGDM,650
53
+ PUI/textual/__init__.py,sha256=uj_j3Z3Jvt-OLG5WSuD8mQW3rqRlv5oi7pwxKfoGFfk,709
54
+ PUI/textual/application.py,sha256=FNpZ1j05EbE3XNxqMBDfsU_IPQ1k2Y7xw-5KLtwuFnI,2514
55
+ PUI/textual/base.py,sha256=uZhtB7Ofajc--bCilWsOGP63AxBL59y744GZFa13eIA,3580
56
+ PUI/textual/button.py,sha256=VF7fmgi5mHeOzptZzy4oBfcuCeUURq5eFrLvN4Fgg30,436
57
+ PUI/textual/checkbox.py,sha256=pkBxZz0qXl2KUz2-Lqap-r2Y3DBI0CET3wQgEpYKb7U,518
58
+ PUI/textual/label.py,sha256=Ce5I-1sBeaKnLEIsQWK5nKMCEgwusED2fjHePIiGr90,1266
59
+ PUI/textual/layout.py,sha256=poeS1TrbqR4wBiP7jj31sSr2fRav2w59-MIWZwvtZUI,1214
60
+ PUI/textual/progressbar.py,sha256=aeLiXzLOj3VWR-KUEBmmEOxJR0LACr1_-MDMOYDHx9c,501
61
+ PUI/textual/radiobutton.py,sha256=zFKG2LeUnPXnxpxeW3cYqPwd91DQZWFUctundau-4b0,621
62
+ PUI/textual/scroll.py,sha256=QeMDXgIz-5fxcL4htM2pHJFD6RAsDiijgLO9PmhJOEA,2036
63
+ PUI/textual/tab.py,sha256=wcvyH1MZZNwwout8iJDifty_lqe6YuhfRpE3F0lUTBM,2158
64
+ PUI/textual/text.py,sha256=BHvgK3JqBU_LrnWbaaKBFxQ_50Z9lFhcdEJoVJqbcSc,782
65
+ PUI/textual/textfield.py,sha256=NsbHg-bybYK9y8S88bD_x-0L2ciRmnpi03HQ17JCBN4,1356
66
+ PUI/textual/window.py,sha256=ygb1txNlo2bjQkKVzSD4UgU2OTzJ-zeEjM0p8wcYZJA,181
67
+ PUI/tkinter/__init__.py,sha256=VQjdak9UO-zI7n9Kr4q_B-kgCXgag2DVoWWP_QdH2uk,982
68
+ PUI/tkinter/application.py,sha256=NxWfU9NHJuceKMdLiGeklUKU5WjYVUomGL_hJpRtrbs,1141
69
+ PUI/tkinter/base.py,sha256=jSOKxd2uMOhVvDjBOloxdiHeNvKwEoWJo0fyVH49ttI,2663
70
+ PUI/tkinter/button.py,sha256=zRGt_jVY6q74Jer5jm4q4H-_LznrXUzfEQwiMWtQboI,467
71
+ PUI/tkinter/canvas.py,sha256=AHltKAeKP629qfosJNy9jaLwLygwtHv88aPGGt6PSgE,1609
72
+ PUI/tkinter/checkbox.py,sha256=TOYOCKx9ux58YdYWXLkjguFG3NsgVaYlFOIrZ9ukcwI,741
73
+ PUI/tkinter/label.py,sha256=o6hj-8qX0ZwDDbYaNsTz5oUIXKJFr-HctTeZW2NfhHE,555
74
+ PUI/tkinter/layout.py,sha256=q1NgGlPd_dn1avIzJBeO_46NyBPCQyh3VcQ56YmUUKE,3576
75
+ PUI/tkinter/progressbar.py,sha256=OPtlujCv5tSGvRoqmW7URhdXzgHlVDbpTT_Rx143l1I,488
76
+ PUI/tkinter/radiobutton.py,sha256=RBcC9u9v1N5RDTn6GxEwbJr0kYh43j-r7zB6Ic1pIqI,750
77
+ PUI/tkinter/scroll.py,sha256=MhBuGcKRlqiMiNG1I5bI_wCJT4rwLQbB4ViOsXHcdi8,6685
78
+ PUI/tkinter/tab.py,sha256=-1r95U0q3hnSLokD1QU3hsQ2wiDteZ6KZwula7rwbVQ,1426
79
+ PUI/tkinter/text.py,sha256=5IJOD86iodYqUD-lFnLUnD4vYvUw-8wUPoLNq_RuBsA,501
80
+ PUI/tkinter/textfield.py,sha256=_M3UNaei1A_flh8wp4ct0RfRn9ZWGFZ6ikRDvOQmi34,1719
81
+ PUI/tkinter/window.py,sha256=IIieSxxanhGIvPy0krQuLrStsL_jTUdx6TKbEf64nyQ,1606
82
+ PUI/wx/__init__.py,sha256=j8L1kzL4CK_xeF0x5_NZekGETYP_1Dhq3-BuV1LtXoY,391
83
+ PUI/wx/application.py,sha256=Ku_mloCyiw-KTl8a09uTIhV7uupG_7urqw8jXIwQMLc,965
84
+ PUI/wx/base.py,sha256=kvpi2WVgDMW4LqaYiMhEIb0FlRG2pXvYUV04iJ_oSV4,6089
85
+ PUI/wx/button.py,sha256=ww3Iyn16zomP4zkQhvXTirmHBvlVMJxmiV1pfXtgrSo,447
86
+ PUI/wx/canvas.py,sha256=1mWdzlMfIIe--Lx4npzo0vX2BjvijZkQDep6-AmYcdM,8493
87
+ PUI/wx/checkbox.py,sha256=XgLxsi-tk2f9bnlEvhvEZV4boBGFB3u62ZE1cs8X9tU,674
88
+ PUI/wx/combobox.py,sha256=Q4KN8P3yO7KI5nKebSDYHu0noAyv-NtObkxmOsa_RrI,2052
89
+ PUI/wx/dialog.py,sha256=HVLVdzRkZhRndkHTYl0RgNfzIQBdtik7DIDg93Dp9JA,2572
90
+ PUI/wx/divider.py,sha256=qnaUVpspAOND6YhZyQsZeos1LC02L-ljfdAtVp1vdzw,516
91
+ PUI/wx/label.py,sha256=qr3hGfHtjvYjeXJSB2cD5u30LYodEzix4Q0FYw8p6p0,509
92
+ PUI/wx/layout.py,sha256=jzik7K_Vfjh7uVZbZn2erqwWvILzPCP0xurcGQb4kYI,1370
93
+ PUI/wx/progressbar.py,sha256=gj5j6f-zG78XW1mEIRqiOEYMoYjG16jzS44Vnh4i148,472
94
+ PUI/wx/radiobutton.py,sha256=x7WnCGXuNPV98MqF-tRLzMOOExim22rayNL8jAYVZWk,769
95
+ PUI/wx/scroll.py,sha256=LPwRL9KZuoKrTFEWo1_zW3l_Fbaznq_2jA9GuwTp8Dc,1199
96
+ PUI/wx/text.py,sha256=YeIyDyHH0xBcD_iXbYSTtvL25YDtug1QJNVPvCSAqEk,544
97
+ PUI/wx/textfield.py,sha256=ZVGqNJOggA24Xj3yELlPyZlhAYk0LI0cy3rBpwkenKM,1724
98
+ PUI/wx/window.py,sha256=juAsn3W4SzmH8f5LDGvjwppvPD8fDObRUJ_MkQFKCIE,1847
99
+ qpuiq-0.10.dist-info/LICENSE.txt,sha256=1Xwik2AmLNGoIYhAPzvNC28M08Q3EvkOe4TtlQuSd_E,1072
100
+ qpuiq-0.10.dist-info/METADATA,sha256=XroesTMJM6vLMKWaeqfkfwGV9dbq2TosQb08Z7X7J4o,5453
101
+ qpuiq-0.10.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
102
+ qpuiq-0.10.dist-info/top_level.txt,sha256=zMudhifPite0CEVGYvdi-5W3P_dpum71xjU7_g-ZHS0,4
103
+ qpuiq-0.10.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (74.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ PUI