wxPython 4.3.2__cp315-cp315-win_amd64.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 (472) hide show
  1. wx/WebView2Loader.dll +0 -0
  2. wx/__init__.py +22 -0
  3. wx/__init__.pyi +10 -0
  4. wx/__version__.py +9 -0
  5. wx/__version__.pyi +15 -0
  6. wx/_adv.cp315-win_amd64.pyd +0 -0
  7. wx/_aui.cp315-win_amd64.pyd +0 -0
  8. wx/_core.cp315-win_amd64.pyd +0 -0
  9. wx/_dataview.cp315-win_amd64.pyd +0 -0
  10. wx/_glcanvas.cp315-win_amd64.pyd +0 -0
  11. wx/_grid.cp315-win_amd64.pyd +0 -0
  12. wx/_html.cp315-win_amd64.pyd +0 -0
  13. wx/_html2.cp315-win_amd64.pyd +0 -0
  14. wx/_media.cp315-win_amd64.pyd +0 -0
  15. wx/_msw.cp315-win_amd64.pyd +0 -0
  16. wx/_propgrid.cp315-win_amd64.pyd +0 -0
  17. wx/_ribbon.cp315-win_amd64.pyd +0 -0
  18. wx/_richtext.cp315-win_amd64.pyd +0 -0
  19. wx/_stc.cp315-win_amd64.pyd +0 -0
  20. wx/_xml.cp315-win_amd64.pyd +0 -0
  21. wx/_xrc.cp315-win_amd64.pyd +0 -0
  22. wx/adv.py +127 -0
  23. wx/adv.pyi +5931 -0
  24. wx/aui.py +70 -0
  25. wx/aui.pyi +4805 -0
  26. wx/core.py +3417 -0
  27. wx/core.pyi +62949 -0
  28. wx/dataview.py +176 -0
  29. wx/dataview.pyi +3828 -0
  30. wx/gizmos.py +18 -0
  31. wx/glcanvas.py +13 -0
  32. wx/glcanvas.pyi +544 -0
  33. wx/grid.py +237 -0
  34. wx/grid.pyi +5678 -0
  35. wx/html.py +38 -0
  36. wx/html.pyi +3283 -0
  37. wx/html2.py +46 -0
  38. wx/html2.pyi +1301 -0
  39. wx/include/wxPython/sip.h +1938 -0
  40. wx/include/wxPython/wxpy_api.h +418 -0
  41. wx/lib/CDate.py +201 -0
  42. wx/lib/ClickableHtmlWindow.py +57 -0
  43. wx/lib/__init__.py +0 -0
  44. wx/lib/activex.py +178 -0
  45. wx/lib/activexwrapper.py +153 -0
  46. wx/lib/agw/__init__.py +128 -0
  47. wx/lib/agw/advancedsplash.py +563 -0
  48. wx/lib/agw/aquabutton.py +1127 -0
  49. wx/lib/agw/artmanager.py +2110 -0
  50. wx/lib/agw/aui/__init__.py +295 -0
  51. wx/lib/agw/aui/aui_constants.py +2616 -0
  52. wx/lib/agw/aui/aui_switcherdialog.py +1232 -0
  53. wx/lib/agw/aui/aui_utilities.py +648 -0
  54. wx/lib/agw/aui/auibar.py +4045 -0
  55. wx/lib/agw/aui/auibook.py +6288 -0
  56. wx/lib/agw/aui/dockart.py +1198 -0
  57. wx/lib/agw/aui/framemanager.py +10485 -0
  58. wx/lib/agw/aui/tabart.py +2749 -0
  59. wx/lib/agw/aui/tabmdi.py +679 -0
  60. wx/lib/agw/balloontip.py +1157 -0
  61. wx/lib/agw/buttonpanel.py +2787 -0
  62. wx/lib/agw/cubecolourdialog.py +3529 -0
  63. wx/lib/agw/customtreectrl.py +9908 -0
  64. wx/lib/agw/data/ShortcutEditor_1.png +0 -0
  65. wx/lib/agw/data/ShortcutEditor_1_thumb.png +0 -0
  66. wx/lib/agw/data/ShortcutEditor_2.png +0 -0
  67. wx/lib/agw/data/ShortcutEditor_2_thumb.png +0 -0
  68. wx/lib/agw/data/ShortcutEditor_3.png +0 -0
  69. wx/lib/agw/data/ShortcutEditor_3_thumb.png +0 -0
  70. wx/lib/agw/data/ShortcutEditor_4.png +0 -0
  71. wx/lib/agw/data/ShortcutEditor_4_thumb.png +0 -0
  72. wx/lib/agw/data/default_help_text.html +105 -0
  73. wx/lib/agw/flatmenu.py +7392 -0
  74. wx/lib/agw/flatnotebook.py +6669 -0
  75. wx/lib/agw/floatspin.py +1820 -0
  76. wx/lib/agw/fmcustomizedlg.py +535 -0
  77. wx/lib/agw/fmresources.py +407 -0
  78. wx/lib/agw/foldpanelbar.py +2282 -0
  79. wx/lib/agw/fourwaysplitter.py +1130 -0
  80. wx/lib/agw/genericmessagedialog.py +1549 -0
  81. wx/lib/agw/gradientbutton.py +731 -0
  82. wx/lib/agw/hyperlink.py +664 -0
  83. wx/lib/agw/hypertreelist.py +5756 -0
  84. wx/lib/agw/infobar.py +885 -0
  85. wx/lib/agw/knobctrl.py +944 -0
  86. wx/lib/agw/labelbook.py +3028 -0
  87. wx/lib/agw/multidirdialog.py +581 -0
  88. wx/lib/agw/peakmeter.py +1028 -0
  89. wx/lib/agw/persist/__init__.py +188 -0
  90. wx/lib/agw/persist/persist_constants.py +283 -0
  91. wx/lib/agw/persist/persist_handlers.py +2614 -0
  92. wx/lib/agw/persist/persistencemanager.py +863 -0
  93. wx/lib/agw/piectrl.py +1082 -0
  94. wx/lib/agw/pybusyinfo.py +399 -0
  95. wx/lib/agw/pycollapsiblepane.py +940 -0
  96. wx/lib/agw/pygauge.py +570 -0
  97. wx/lib/agw/pyprogress.py +916 -0
  98. wx/lib/agw/ribbon/__init__.py +198 -0
  99. wx/lib/agw/ribbon/art.py +219 -0
  100. wx/lib/agw/ribbon/art_aui.py +1283 -0
  101. wx/lib/agw/ribbon/art_default.py +81 -0
  102. wx/lib/agw/ribbon/art_internal.py +248 -0
  103. wx/lib/agw/ribbon/art_msw.py +2735 -0
  104. wx/lib/agw/ribbon/art_osx.py +52 -0
  105. wx/lib/agw/ribbon/bar.py +1259 -0
  106. wx/lib/agw/ribbon/buttonbar.py +1317 -0
  107. wx/lib/agw/ribbon/control.py +205 -0
  108. wx/lib/agw/ribbon/gallery.py +973 -0
  109. wx/lib/agw/ribbon/page.py +946 -0
  110. wx/lib/agw/ribbon/panel.py +1170 -0
  111. wx/lib/agw/ribbon/toolbar.py +1441 -0
  112. wx/lib/agw/rulerctrl.py +1885 -0
  113. wx/lib/agw/scrolledthumbnail.py +2116 -0
  114. wx/lib/agw/shapedbutton.py +1809 -0
  115. wx/lib/agw/shortcuteditor.py +2642 -0
  116. wx/lib/agw/speedmeter.py +1800 -0
  117. wx/lib/agw/supertooltip.py +1443 -0
  118. wx/lib/agw/thumbnailctrl.py +529 -0
  119. wx/lib/agw/toasterbox.py +1327 -0
  120. wx/lib/agw/ultimatelistctrl.py +13671 -0
  121. wx/lib/agw/xlsgrid.py +2111 -0
  122. wx/lib/agw/zoombar.py +1336 -0
  123. wx/lib/analogclock/__init__.py +140 -0
  124. wx/lib/analogclock/analogclock.py +630 -0
  125. wx/lib/analogclock/helpers.py +986 -0
  126. wx/lib/analogclock/lib_setup/__init__.py +0 -0
  127. wx/lib/analogclock/lib_setup/buttontreectrlpanel.py +297 -0
  128. wx/lib/analogclock/lib_setup/fontselect.py +57 -0
  129. wx/lib/analogclock/setup.py +490 -0
  130. wx/lib/analogclock/styles.py +47 -0
  131. wx/lib/anchors.py +103 -0
  132. wx/lib/art/__init__.py +4 -0
  133. wx/lib/art/flagart.py +1583 -0
  134. wx/lib/art/img2pyartprov.py +56 -0
  135. wx/lib/busy.py +152 -0
  136. wx/lib/buttons.py +1140 -0
  137. wx/lib/calendar.py +1596 -0
  138. wx/lib/checkbox.py +837 -0
  139. wx/lib/colourchooser/__init__.py +36 -0
  140. wx/lib/colourchooser/canvas.py +145 -0
  141. wx/lib/colourchooser/intl.py +24 -0
  142. wx/lib/colourchooser/pycolourbox.py +89 -0
  143. wx/lib/colourchooser/pycolourchooser.py +626 -0
  144. wx/lib/colourchooser/pycolourslider.py +98 -0
  145. wx/lib/colourchooser/pypalette.py +208 -0
  146. wx/lib/colourdb.py +740 -0
  147. wx/lib/colourselect.py +385 -0
  148. wx/lib/colourutils.py +118 -0
  149. wx/lib/combotreebox.py +944 -0
  150. wx/lib/delayedresult.py +420 -0
  151. wx/lib/dialogs.py +510 -0
  152. wx/lib/docview.py +3210 -0
  153. wx/lib/dragscroller.py +79 -0
  154. wx/lib/editor/README.txt +77 -0
  155. wx/lib/editor/__init__.py +24 -0
  156. wx/lib/editor/editor.py +974 -0
  157. wx/lib/editor/images.py +15 -0
  158. wx/lib/editor/selection.py +44 -0
  159. wx/lib/embeddedimage.py +76 -0
  160. wx/lib/eventStack.py +136 -0
  161. wx/lib/eventwatcher.py +440 -0
  162. wx/lib/evtmgr.py +521 -0
  163. wx/lib/expando.py +393 -0
  164. wx/lib/fancytext.py +494 -0
  165. wx/lib/filebrowsebutton.py +461 -0
  166. wx/lib/flashwin.py +262 -0
  167. wx/lib/flashwin_old.py +651 -0
  168. wx/lib/floatcanvas/FCEvents.py +53 -0
  169. wx/lib/floatcanvas/FCObjects.py +2910 -0
  170. wx/lib/floatcanvas/FloatCanvas.py +1025 -0
  171. wx/lib/floatcanvas/GUIMode.py +396 -0
  172. wx/lib/floatcanvas/NavCanvas.py +162 -0
  173. wx/lib/floatcanvas/Resources.py +319 -0
  174. wx/lib/floatcanvas/ScreenShot.py +1788 -0
  175. wx/lib/floatcanvas/Utilities/BBox.py +313 -0
  176. wx/lib/floatcanvas/Utilities/Colors.py +137 -0
  177. wx/lib/floatcanvas/Utilities/GUI.py +91 -0
  178. wx/lib/floatcanvas/Utilities/__init__.py +7 -0
  179. wx/lib/floatcanvas/__init__.py +124 -0
  180. wx/lib/foldmenu.py +89 -0
  181. wx/lib/gestures.py +310 -0
  182. wx/lib/gizmos/__init__.py +18 -0
  183. wx/lib/gizmos/dynamicsash.py +1202 -0
  184. wx/lib/gizmos/ledctrl.py +299 -0
  185. wx/lib/gizmos/treelistctrl.py +87 -0
  186. wx/lib/graphics.py +1942 -0
  187. wx/lib/gridmovers.py +516 -0
  188. wx/lib/iewin.py +249 -0
  189. wx/lib/iewin_old.py +894 -0
  190. wx/lib/imagebrowser.py +853 -0
  191. wx/lib/imageutils.py +163 -0
  192. wx/lib/infoframe.py +490 -0
  193. wx/lib/inspection.py +1254 -0
  194. wx/lib/intctrl.py +990 -0
  195. wx/lib/itemspicker.py +256 -0
  196. wx/lib/langlistctrl.py +480 -0
  197. wx/lib/layoutf.py +271 -0
  198. wx/lib/masked/__init__.py +27 -0
  199. wx/lib/masked/combobox.py +839 -0
  200. wx/lib/masked/ctrl.py +108 -0
  201. wx/lib/masked/ipaddrctrl.py +241 -0
  202. wx/lib/masked/maskededit.py +7262 -0
  203. wx/lib/masked/numctrl.py +2000 -0
  204. wx/lib/masked/textctrl.py +465 -0
  205. wx/lib/masked/timectrl.py +1465 -0
  206. wx/lib/mixins/__init__.py +17 -0
  207. wx/lib/mixins/grid.py +47 -0
  208. wx/lib/mixins/gridlabelrenderer.py +277 -0
  209. wx/lib/mixins/imagelist.py +77 -0
  210. wx/lib/mixins/inspection.py +184 -0
  211. wx/lib/mixins/listctrl.py +893 -0
  212. wx/lib/mixins/rubberband.py +403 -0
  213. wx/lib/mixins/treemixin.py +678 -0
  214. wx/lib/msgpanel.py +95 -0
  215. wx/lib/multisash.py +746 -0
  216. wx/lib/myole4ax.idl +178 -0
  217. wx/lib/myole4ax.tlb +0 -0
  218. wx/lib/newevent.py +229 -0
  219. wx/lib/newevent.pyi +25 -0
  220. wx/lib/nvdlg.py +156 -0
  221. wx/lib/ogl/__init__.py +13 -0
  222. wx/lib/ogl/basic.py +3989 -0
  223. wx/lib/ogl/bmpshape.py +86 -0
  224. wx/lib/ogl/canvas.py +467 -0
  225. wx/lib/ogl/composit.py +1576 -0
  226. wx/lib/ogl/diagram.py +230 -0
  227. wx/lib/ogl/divided.py +482 -0
  228. wx/lib/ogl/drawn.py +898 -0
  229. wx/lib/ogl/lines.py +1809 -0
  230. wx/lib/ogl/oglmisc.py +607 -0
  231. wx/lib/pdfviewer/__init__.py +113 -0
  232. wx/lib/pdfviewer/bitmaps/ArrowLeft.png +0 -0
  233. wx/lib/pdfviewer/bitmaps/ArrowRight.png +0 -0
  234. wx/lib/pdfviewer/bitmaps/DirectionH.png +0 -0
  235. wx/lib/pdfviewer/bitmaps/DirectionV.png +0 -0
  236. wx/lib/pdfviewer/bitmaps/PlayerFirst.png +0 -0
  237. wx/lib/pdfviewer/bitmaps/PlayerLast.png +0 -0
  238. wx/lib/pdfviewer/bitmaps/PlayerNext.png +0 -0
  239. wx/lib/pdfviewer/bitmaps/PlayerPrev.png +0 -0
  240. wx/lib/pdfviewer/bitmaps/Printer.png +0 -0
  241. wx/lib/pdfviewer/bitmaps/ReadMe.txt +28 -0
  242. wx/lib/pdfviewer/bitmaps/Save.png +0 -0
  243. wx/lib/pdfviewer/bitmaps/ZoomIn.png +0 -0
  244. wx/lib/pdfviewer/bitmaps/ZoomOut.png +0 -0
  245. wx/lib/pdfviewer/bitmaps/encode_bitmaps.py +37 -0
  246. wx/lib/pdfviewer/buttonpanel.py +285 -0
  247. wx/lib/pdfviewer/images.py +240 -0
  248. wx/lib/pdfviewer/viewer.py +1118 -0
  249. wx/lib/pdfwin.py +295 -0
  250. wx/lib/pdfwin_old.py +789 -0
  251. wx/lib/platebtn.py +789 -0
  252. wx/lib/plot/CHANGELOG.md +150 -0
  253. wx/lib/plot/README.md +16 -0
  254. wx/lib/plot/__init__.py +46 -0
  255. wx/lib/plot/__main__.py +5 -0
  256. wx/lib/plot/examples/__init__.py +0 -0
  257. wx/lib/plot/examples/demo.py +1010 -0
  258. wx/lib/plot/examples/simple_example.py +56 -0
  259. wx/lib/plot/plotcanvas.py +2985 -0
  260. wx/lib/plot/polyobjects.py +1524 -0
  261. wx/lib/plot/utils.py +334 -0
  262. wx/lib/popupctl.py +251 -0
  263. wx/lib/printout.py +1155 -0
  264. wx/lib/progressindicator.py +151 -0
  265. wx/lib/pubsub/LICENSE_BSD_Simple.txt +23 -0
  266. wx/lib/pubsub/README_WxPython.txt +22 -0
  267. wx/lib/pubsub/RELEASE_NOTES.txt +71 -0
  268. wx/lib/pubsub/__init__.py +25 -0
  269. wx/lib/pubsub/core/__init__.py +92 -0
  270. wx/lib/pubsub/core/arg1/__init__.py +16 -0
  271. wx/lib/pubsub/core/arg1/listenerimpl.py +97 -0
  272. wx/lib/pubsub/core/arg1/publisher.py +40 -0
  273. wx/lib/pubsub/core/arg1/publishermixin.py +34 -0
  274. wx/lib/pubsub/core/arg1/topicargspecimpl.py +66 -0
  275. wx/lib/pubsub/core/arg1/topicmgrimpl.py +19 -0
  276. wx/lib/pubsub/core/callables.py +198 -0
  277. wx/lib/pubsub/core/imp2.py +62 -0
  278. wx/lib/pubsub/core/itopicdefnprovider.py +0 -0
  279. wx/lib/pubsub/core/kwargs/__init__.py +16 -0
  280. wx/lib/pubsub/core/kwargs/datamsg.py +27 -0
  281. wx/lib/pubsub/core/kwargs/listenerimpl.py +93 -0
  282. wx/lib/pubsub/core/kwargs/publisher.py +77 -0
  283. wx/lib/pubsub/core/kwargs/publishermixin.py +65 -0
  284. wx/lib/pubsub/core/kwargs/topicargspecimpl.py +216 -0
  285. wx/lib/pubsub/core/kwargs/topicmgrimpl.py +13 -0
  286. wx/lib/pubsub/core/listener.py +40 -0
  287. wx/lib/pubsub/core/listenerbase.py +185 -0
  288. wx/lib/pubsub/core/notificationmgr.py +185 -0
  289. wx/lib/pubsub/core/publisherbase.py +189 -0
  290. wx/lib/pubsub/core/topicargspec.py +77 -0
  291. wx/lib/pubsub/core/topicdefnprovider.py +631 -0
  292. wx/lib/pubsub/core/topicexc.py +72 -0
  293. wx/lib/pubsub/core/topicmgr.py +454 -0
  294. wx/lib/pubsub/core/topicobj.py +472 -0
  295. wx/lib/pubsub/core/topictreetraverser.py +143 -0
  296. wx/lib/pubsub/core/topicutils.py +119 -0
  297. wx/lib/pubsub/core/treeconfig.py +21 -0
  298. wx/lib/pubsub/core/validatedefnargs.py +29 -0
  299. wx/lib/pubsub/core/weakmethod.py +102 -0
  300. wx/lib/pubsub/policies.py +24 -0
  301. wx/lib/pubsub/pub.py +199 -0
  302. wx/lib/pubsub/setuparg1.py +47 -0
  303. wx/lib/pubsub/setupkwargs.py +29 -0
  304. wx/lib/pubsub/utils/__init__.py +27 -0
  305. wx/lib/pubsub/utils/exchandling.py +100 -0
  306. wx/lib/pubsub/utils/misc.py +99 -0
  307. wx/lib/pubsub/utils/notification.py +331 -0
  308. wx/lib/pubsub/utils/topictreeprinter.py +195 -0
  309. wx/lib/pubsub/utils/xmltopicdefnprovider.py +286 -0
  310. wx/lib/pydocview.py +3300 -0
  311. wx/lib/rcsizer.py +227 -0
  312. wx/lib/resizewidget.py +357 -0
  313. wx/lib/scrolledpanel.py +243 -0
  314. wx/lib/sheet.py +350 -0
  315. wx/lib/sized_controls.py +691 -0
  316. wx/lib/softwareupdate.py +355 -0
  317. wx/lib/splitter.py +925 -0
  318. wx/lib/statbmp.py +199 -0
  319. wx/lib/stattext.py +321 -0
  320. wx/lib/throbber.py +424 -0
  321. wx/lib/ticker.py +306 -0
  322. wx/lib/ticker_xrc.py +48 -0
  323. wx/lib/utils.py +89 -0
  324. wx/lib/wordwrap.py +97 -0
  325. wx/lib/wxcairo/__init__.py +139 -0
  326. wx/lib/wxcairo/wx_cairocffi.py +200 -0
  327. wx/lib/wxcairo/wx_pycairo.py +455 -0
  328. wx/lib/wxpTag.py +274 -0
  329. wx/libcairo-2.dll +0 -0
  330. wx/locale/af/LC_MESSAGES/wxstd.mo +0 -0
  331. wx/locale/an/LC_MESSAGES/wxstd.mo +0 -0
  332. wx/locale/ar/LC_MESSAGES/wxstd.mo +0 -0
  333. wx/locale/ca/LC_MESSAGES/wxstd.mo +0 -0
  334. wx/locale/ca@valencia/LC_MESSAGES/wxstd.mo +0 -0
  335. wx/locale/co/LC_MESSAGES/wxstd.mo +0 -0
  336. wx/locale/cs/LC_MESSAGES/wxstd.mo +0 -0
  337. wx/locale/da/LC_MESSAGES/wxstd.mo +0 -0
  338. wx/locale/de/LC_MESSAGES/wxstd.mo +0 -0
  339. wx/locale/el/LC_MESSAGES/wxstd.mo +0 -0
  340. wx/locale/es/LC_MESSAGES/wxstd.mo +0 -0
  341. wx/locale/eu/LC_MESSAGES/wxstd.mo +0 -0
  342. wx/locale/fa_IR/LC_MESSAGES/wxstd.mo +0 -0
  343. wx/locale/fi/LC_MESSAGES/wxstd.mo +0 -0
  344. wx/locale/fr/LC_MESSAGES/wxstd.mo +0 -0
  345. wx/locale/gl_ES/LC_MESSAGES/wxstd.mo +0 -0
  346. wx/locale/hi/LC_MESSAGES/wxstd.mo +0 -0
  347. wx/locale/hr/LC_MESSAGES/wxstd.mo +0 -0
  348. wx/locale/hu/LC_MESSAGES/wxstd.mo +0 -0
  349. wx/locale/id/LC_MESSAGES/wxstd.mo +0 -0
  350. wx/locale/it/LC_MESSAGES/wxstd.mo +0 -0
  351. wx/locale/ja/LC_MESSAGES/wxstd.mo +0 -0
  352. wx/locale/ka/LC_MESSAGES/wxstd.mo +0 -0
  353. wx/locale/ko_KR/LC_MESSAGES/wxstd.mo +0 -0
  354. wx/locale/lt/LC_MESSAGES/wxstd.mo +0 -0
  355. wx/locale/lv/LC_MESSAGES/wxstd.mo +0 -0
  356. wx/locale/ms/LC_MESSAGES/wxstd.mo +0 -0
  357. wx/locale/nb/LC_MESSAGES/wxstd.mo +0 -0
  358. wx/locale/ne/LC_MESSAGES/wxstd.mo +0 -0
  359. wx/locale/nl/LC_MESSAGES/wxstd.mo +0 -0
  360. wx/locale/pl/LC_MESSAGES/wxstd.mo +0 -0
  361. wx/locale/pt/LC_MESSAGES/wxstd.mo +0 -0
  362. wx/locale/pt_BR/LC_MESSAGES/wxstd.mo +0 -0
  363. wx/locale/ro/LC_MESSAGES/wxstd.mo +0 -0
  364. wx/locale/ru/LC_MESSAGES/wxstd.mo +0 -0
  365. wx/locale/sk/LC_MESSAGES/wxstd.mo +0 -0
  366. wx/locale/sl/LC_MESSAGES/wxstd.mo +0 -0
  367. wx/locale/sq/LC_MESSAGES/wxstd.mo +0 -0
  368. wx/locale/sr/LC_MESSAGES/wxstd.mo +0 -0
  369. wx/locale/sv/LC_MESSAGES/wxstd.mo +0 -0
  370. wx/locale/ta/LC_MESSAGES/wxstd.mo +0 -0
  371. wx/locale/tr/LC_MESSAGES/wxstd.mo +0 -0
  372. wx/locale/uk/LC_MESSAGES/wxstd.mo +0 -0
  373. wx/locale/vi/LC_MESSAGES/wxstd.mo +0 -0
  374. wx/locale/zh_CN/LC_MESSAGES/wxstd.mo +0 -0
  375. wx/locale/zh_TW/LC_MESSAGES/wxstd.mo +0 -0
  376. wx/media.py +30 -0
  377. wx/media.pyi +272 -0
  378. wx/msw.py +16 -0
  379. wx/msw.pyi +91 -0
  380. wx/propgrid.py +498 -0
  381. wx/propgrid.pyi +7427 -0
  382. wx/py/CHANGES.txt +796 -0
  383. wx/py/Py.ico +0 -0
  384. wx/py/PyAlaCarte.py +34 -0
  385. wx/py/PyAlaMode.py +34 -0
  386. wx/py/PyAlaModeTest.py +33 -0
  387. wx/py/PyCrust.ico +0 -0
  388. wx/py/PyCrust.py +78 -0
  389. wx/py/PyCrust_16.png +0 -0
  390. wx/py/PyCrust_32.png +0 -0
  391. wx/py/PyFilling.py +35 -0
  392. wx/py/PyShell.py +78 -0
  393. wx/py/PySlices.ico +0 -0
  394. wx/py/PySlices.py +98 -0
  395. wx/py/PySlicesShell.py +94 -0
  396. wx/py/PySlices_16.png +0 -0
  397. wx/py/PySlices_32.png +0 -0
  398. wx/py/PyWrap.py +52 -0
  399. wx/py/README.txt +77 -0
  400. wx/py/__init__.py +20 -0
  401. wx/py/buffer.py +136 -0
  402. wx/py/crust.py +403 -0
  403. wx/py/crustslices.py +403 -0
  404. wx/py/dispatcher.py +259 -0
  405. wx/py/document.py +37 -0
  406. wx/py/editor.py +844 -0
  407. wx/py/editwindow.py +316 -0
  408. wx/py/filling.py +358 -0
  409. wx/py/frame.py +976 -0
  410. wx/py/images.py +212 -0
  411. wx/py/interpreter.py +161 -0
  412. wx/py/introspect.py +402 -0
  413. wx/py/magic.py +98 -0
  414. wx/py/parse.py +134 -0
  415. wx/py/path.py +36 -0
  416. wx/py/pseudo.py +99 -0
  417. wx/py/shell.py +1579 -0
  418. wx/py/sliceshell.py +3805 -0
  419. wx/py/tests/test_interpreter.py +71 -0
  420. wx/py/tests/test_introspect.py +810 -0
  421. wx/py/tests/test_pseudo.py +70 -0
  422. wx/py/tests/test_version.py +36 -0
  423. wx/py/tests/testall.py +22 -0
  424. wx/py/version.py +7 -0
  425. wx/py.typed +0 -0
  426. wx/ribbon.py +48 -0
  427. wx/ribbon.pyi +3099 -0
  428. wx/richtext.py +141 -0
  429. wx/richtext.pyi +13581 -0
  430. wx/siplib.cp315-win_amd64.pyd +0 -0
  431. wx/siplib.pyi +19 -0
  432. wx/stc.py +59 -0
  433. wx/stc.pyi +9918 -0
  434. wx/svg/__init__.py +363 -0
  435. wx/svg/_nanosvg.cp315-win_amd64.pyd +0 -0
  436. wx/tools/__init__.py +18 -0
  437. wx/tools/dbg.py +268 -0
  438. wx/tools/genaxmodule.py +50 -0
  439. wx/tools/helpviewer.py +92 -0
  440. wx/tools/img2img.py +85 -0
  441. wx/tools/img2png.py +54 -0
  442. wx/tools/img2py.py +306 -0
  443. wx/tools/img2xpm.py +54 -0
  444. wx/tools/pywxrc.py +951 -0
  445. wx/tools/wxget.py +254 -0
  446. wx/tools/wxget_docs_demo.py +183 -0
  447. wx/wxbase334u_net_vc140_x64.dll +0 -0
  448. wx/wxbase334u_vc140_x64.dll +0 -0
  449. wx/wxbase334u_xml_vc140_x64.dll +0 -0
  450. wx/wxmsw334u_adv_vc140_x64.dll +0 -0
  451. wx/wxmsw334u_aui_vc140_x64.dll +0 -0
  452. wx/wxmsw334u_core_vc140_x64.dll +0 -0
  453. wx/wxmsw334u_gl_vc140_x64.dll +0 -0
  454. wx/wxmsw334u_html_vc140_x64.dll +0 -0
  455. wx/wxmsw334u_media_vc140_x64.dll +0 -0
  456. wx/wxmsw334u_propgrid_vc140_x64.dll +0 -0
  457. wx/wxmsw334u_qa_vc140_x64.dll +0 -0
  458. wx/wxmsw334u_ribbon_vc140_x64.dll +0 -0
  459. wx/wxmsw334u_richtext_vc140_x64.dll +0 -0
  460. wx/wxmsw334u_stc_vc140_x64.dll +0 -0
  461. wx/wxmsw334u_webview_vc140_x64.dll +0 -0
  462. wx/wxmsw334u_xrc_vc140_x64.dll +0 -0
  463. wx/xml.py +18 -0
  464. wx/xml.pyi +728 -0
  465. wx/xrc.py +68 -0
  466. wx/xrc.pyi +896 -0
  467. wxpython-4.3.2.dist-info/METADATA +71 -0
  468. wxpython-4.3.2.dist-info/RECORD +472 -0
  469. wxpython-4.3.2.dist-info/WHEEL +5 -0
  470. wxpython-4.3.2.dist-info/entry_points.txt +13 -0
  471. wxpython-4.3.2.dist-info/licenses/LICENSE.txt +610 -0
  472. wxpython-4.3.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,454 @@
1
+ """
2
+ Code related to the concept of topic tree and its management: creating
3
+ and removing topics, getting info about a particular topic, etc.
4
+
5
+ :copyright: Copyright since 2006 by Oliver Schoenborn, all rights reserved.
6
+ :license: BSD, see LICENSE_BSD_Simple.txt for details.
7
+ """
8
+
9
+ __all__ = [
10
+ 'TopicManager',
11
+ 'TopicNameError',
12
+ 'TopicDefnError',
13
+ ]
14
+
15
+
16
+ from .callables import getID
17
+
18
+ from .topicutils import (
19
+ ALL_TOPICS,
20
+ tupleize,
21
+ stringize,
22
+ )
23
+
24
+ from .topicexc import (
25
+ TopicNameError,
26
+ TopicDefnError,
27
+ )
28
+
29
+ from .topicargspec import (
30
+ ArgSpecGiven,
31
+ ArgsInfo,
32
+ topicArgsFromCallable,
33
+ )
34
+
35
+ from .topicobj import (
36
+ Topic,
37
+ )
38
+
39
+ from .treeconfig import TreeConfig
40
+ from .topicdefnprovider import ITopicDefnProvider
41
+ from .topicmgrimpl import getRootTopicSpec
42
+
43
+
44
+ # ---------------------------------------------------------
45
+
46
+ ARGS_SPEC_ALL = ArgSpecGiven.SPEC_GIVEN_ALL
47
+ ARGS_SPEC_NONE = ArgSpecGiven.SPEC_GIVEN_NONE
48
+
49
+
50
+ # ---------------------------------------------------------
51
+
52
+ class TopicManager:
53
+ """
54
+ Manages the registry of all topics and creation/deletion
55
+ of topics.
56
+
57
+ Note that any method that accepts a topic name can accept it in the
58
+ 'dotted' format such as ``'a.b.c.'`` or in tuple format such as
59
+ ``('a', 'b', 'c')``. Any such method will raise a ValueError
60
+ if name not valid (empty, invalid characters, etc).
61
+ """
62
+
63
+ # Allowed return values for isTopicSpecified()
64
+ TOPIC_SPEC_NOT_SPECIFIED = 0 # false
65
+ TOPIC_SPEC_ALREADY_CREATED = 1 # all other values equate to "true" but different reason
66
+ TOPIC_SPEC_ALREADY_DEFINED = 2
67
+
68
+
69
+ def __init__(self, treeConfig=None):
70
+ """The optional treeConfig is an instance of TreeConfig, used to
71
+ configure the topic tree such as notification settings, etc. A
72
+ default config is created if not given. This method should only be
73
+ called by an instance of Publisher (see Publisher.getTopicManager())."""
74
+ self.__allTopics = None # root of topic tree
75
+ self._topicsMap = {} # registry of all topics
76
+ self.__treeConfig = treeConfig or TreeConfig()
77
+ self.__defnProvider = _MasterTopicDefnProvider(self.__treeConfig)
78
+
79
+ # define root of all topics
80
+ assert self.__allTopics is None
81
+ argsDocs, reqdArgs = getRootTopicSpec()
82
+ desc = 'Root of all topics'
83
+ specGiven = ArgSpecGiven(argsDocs, reqdArgs)
84
+ self.__allTopics = self.__createTopic((ALL_TOPICS,), desc, specGiven=specGiven)
85
+
86
+ def getRootAllTopics(self):
87
+ """Get the topic that is parent of all root (ie top-level) topics,
88
+ for default TopicManager instance created when this module is imported.
89
+ Some notes:
90
+
91
+ - "root of all topics" topic satisfies isAll()==True, isRoot()==False,
92
+ getParent() is None;
93
+ - all root-level topics satisfy isAll()==False, isRoot()==True, and
94
+ getParent() is getDefaultTopicTreeRoot();
95
+ - all other topics satisfy neither. """
96
+ return self.__allTopics
97
+
98
+ def addDefnProvider(self, providerOrSource, format=None):
99
+ """Register a topic definition provider. After this method is called, whenever a topic must be created,
100
+ the first definition provider that has a definition
101
+ for the required topic is used to instantiate the topic.
102
+
103
+ If providerOrSource is an instance of ITopicDefnProvider, register
104
+ it as a provider of topic definitions. Otherwise, register a new
105
+ instance of TopicDefnProvider(providerOrSource, format). In that case,
106
+ if format is not given, it defaults to TOPIC_TREE_FROM_MODULE. Either
107
+ way, returns the instance of ITopicDefnProvider registered.
108
+ """
109
+ if isinstance(providerOrSource, ITopicDefnProvider):
110
+ provider = providerOrSource
111
+ else:
112
+ from .topicdefnprovider import (TopicDefnProvider, TOPIC_TREE_FROM_MODULE)
113
+ source = providerOrSource
114
+ provider = TopicDefnProvider(source, format or TOPIC_TREE_FROM_MODULE)
115
+ self.__defnProvider.addProvider(provider)
116
+ return provider
117
+
118
+ def clearDefnProviders(self):
119
+ """Remove all registered topic definition providers"""
120
+ self.__defnProvider.clear()
121
+
122
+ def getNumDefnProviders(self):
123
+ """Get how many topic definitions providers are registered."""
124
+ return self.__defnProvider.getNumProviders()
125
+
126
+ def getTopic(self, name, okIfNone=False):
127
+ """Get the Topic instance for the given topic name. By default, raises
128
+ an TopicNameError exception if a topic with given name doesn't exist. If
129
+ okIfNone=True, returns None instead of raising an exception."""
130
+ topicNameDotted = stringize(name)
131
+ #if not name:
132
+ # raise TopicNameError(name, 'Empty topic name not allowed')
133
+ obj = self._topicsMap.get(topicNameDotted, None)
134
+ if obj is not None:
135
+ return obj
136
+
137
+ if okIfNone:
138
+ return None
139
+
140
+ # NOT FOUND! Determine what problem is and raise accordingly:
141
+ # find the closest parent up chain that does exists:
142
+ parentObj, subtopicNames = self.__getClosestParent(topicNameDotted)
143
+ assert subtopicNames
144
+
145
+ subtopicName = subtopicNames[0]
146
+ if parentObj is self.__allTopics:
147
+ raise TopicNameError(name, 'Root topic "%s" doesn\'t exist' % subtopicName)
148
+
149
+ msg = 'Topic "%s" doesn\'t have "%s" as subtopic' % (parentObj.getName(), subtopicName)
150
+ raise TopicNameError(name, msg)
151
+
152
+ def newTopic(self, _name, _desc, _required=(), **_argDocs):
153
+ """Deprecated legacy method.
154
+ If topic _name already exists, just returns it and does nothing else.
155
+ Otherwise, uses getOrCreateTopic() to create it, then sets its
156
+ description (_desc) and its message data specification (_argDocs
157
+ and _required). Replaced by getOrCreateTopic()."""
158
+ topic = self.getTopic(_name, True)
159
+ if topic is None:
160
+ topic = self.getOrCreateTopic(_name)
161
+ topic.setDescription(_desc)
162
+ topic.setMsgArgSpec(_argDocs, _required)
163
+ return topic
164
+
165
+ def getOrCreateTopic(self, name, protoListener=None):
166
+ """Get the Topic instance for topic of given name, creating it
167
+ (and any of its missing parent topics) as necessary. Pubsub
168
+ functions such as subscribe() use this to obtain the Topic object
169
+ corresponding to a topic name.
170
+
171
+ The name can be in dotted or string format (``'a.b.'`` or ``('a','b')``).
172
+
173
+ This method always attempts to return a "complete" topic, i.e. one
174
+ with a Message Data Specification (MDS). So if the topic does not have
175
+ an MDS, it attempts to add it. It first tries to find an MDS
176
+ from a TopicDefnProvider (see addDefnProvider()). If none is available,
177
+ it attempts to set it from protoListener, if it has been given. If not,
178
+ the topic has no MDS.
179
+
180
+ Once a topic's MDS has been set, it is never again changed or accessed
181
+ by this method.
182
+
183
+ Examples::
184
+
185
+ # assume no topics exist
186
+ # but a topic definition provider has been added via
187
+ # pub.addTopicDefnProvider() and has definition for topics 'a' and 'a.b'
188
+
189
+ # creates topic a and a.b; both will have MDS from the defn provider:
190
+ t1 = topicMgr.getOrCreateTopic('a.b')
191
+ t2 = topicMgr.getOrCreateTopic('a.b')
192
+ assert(t1 is t2)
193
+ assert(t1.getParent().getName() == 'a')
194
+
195
+ def proto(req1, optarg1=None): pass
196
+ # creates topic c.d with MDS based on proto; creates c without an MDS
197
+ # since no proto for it, nor defn provider:
198
+ t1 = topicMgr.getOrCreateTopic('c.d', proto)
199
+
200
+ The MDS can also be defined via a call to subscribe(listener, topicName),
201
+ which indirectly calls getOrCreateTopic(topicName, listener).
202
+ """
203
+ obj = self.getTopic(name, okIfNone=True)
204
+ if obj:
205
+ # if object is not sendable but a proto listener was given,
206
+ # update its specification so that it is sendable
207
+ if (protoListener is not None) and not obj.hasMDS():
208
+ allArgsDocs, required = topicArgsFromCallable(protoListener)
209
+ obj.setMsgArgSpec(allArgsDocs, required)
210
+ return obj
211
+
212
+ # create missing parents
213
+ nameTuple = tupleize(name)
214
+ parentObj = self.__createParentTopics(nameTuple)
215
+
216
+ # now the final topic object, args from listener if provided
217
+ desc, specGiven = self.__defnProvider.getDefn(nameTuple)
218
+ # POLICY: protoListener is used only if no definition available
219
+ if specGiven is None:
220
+ if protoListener is None:
221
+ desc = 'UNDOCUMENTED: created without spec'
222
+ else:
223
+ allArgsDocs, required = topicArgsFromCallable(protoListener)
224
+ specGiven = ArgSpecGiven(allArgsDocs, required)
225
+ desc = 'UNDOCUMENTED: created from protoListener "%s" in module %s' % getID(protoListener)
226
+
227
+ return self.__createTopic(nameTuple, desc, parent = parentObj, specGiven = specGiven)
228
+
229
+ def isTopicInUse(self, name):
230
+ """Determine if topic 'name' is in use. True if a Topic object exists
231
+ for topic name (i.e. message has already been sent for that topic, or a
232
+ least one listener subscribed), false otherwise. Note: a topic may be in use
233
+ but not have a definition (MDS and docstring); or a topic may have a
234
+ definition, but not be in use."""
235
+ return self.getTopic(name, okIfNone=True) is not None
236
+
237
+ def hasTopicDefinition(self, name):
238
+ """Determine if there is a definition available for topic 'name'. Return
239
+ true if there is, false otherwise. Note: a topic may have a
240
+ definition without being in use, and vice versa."""
241
+ # in already existing Topic object:
242
+ alreadyCreated = self.getTopic(name, okIfNone=True)
243
+ if alreadyCreated is not None and alreadyCreated.hasMDS():
244
+ return True
245
+
246
+ # from provider?
247
+ nameTuple = tupleize(name)
248
+ if self.__defnProvider.isDefined(nameTuple):
249
+ return True
250
+
251
+ return False
252
+
253
+ def checkAllTopicsHaveMDS(self):
254
+ """Check that all topics that have been created for their MDS.
255
+ Raise a TopicDefnError if one is found that does not have one."""
256
+ for topic in self._topicsMap.values():
257
+ if not topic.hasMDS():
258
+ raise TopicDefnError(topic.getNameTuple())
259
+
260
+ def delTopic(self, name):
261
+ """Delete the named topic, including all sub-topics. Returns False
262
+ if topic does not exist; True otherwise. Also unsubscribe any listeners
263
+ of topic and all subtopics. """
264
+ # find from which parent the topic object should be removed
265
+ dottedName = stringize(name)
266
+ try:
267
+ #obj = weakref( self._topicsMap[dottedName] )
268
+ obj = self._topicsMap[dottedName]
269
+ except KeyError:
270
+ return False
271
+
272
+ #assert obj().getName() == dottedName
273
+ assert obj.getName() == dottedName
274
+ # notification must be before deletion in case
275
+ self.__treeConfig.notificationMgr.notifyDelTopic(dottedName)
276
+
277
+ #obj()._undefineSelf_(self._topicsMap)
278
+ obj._undefineSelf_(self._topicsMap)
279
+ #assert obj() is None
280
+
281
+ return True
282
+
283
+ def getTopicsSubscribed(self, listener):
284
+ """Get the list of Topic objects that have given listener
285
+ subscribed. Note: the listener can also get messages from any
286
+ sub-topic of returned list."""
287
+ assocTopics = []
288
+ for topicObj in self._topicsMap.values():
289
+ if topicObj.hasListener(listener):
290
+ assocTopics.append(topicObj)
291
+ return assocTopics
292
+
293
+ def __getClosestParent(self, topicNameDotted):
294
+ """Returns a pair, (closest parent, tuple path from parent). The
295
+ first item is the closest parent Topic that exists.
296
+ The second one is the list of topic name elements that have to be
297
+ created to create the given topic.
298
+
299
+ So if topicNameDotted = A.B.C.D, but only A.B exists (A.B.C and
300
+ A.B.C.D not created yet), then return is (A.B, ['C','D']).
301
+ Note that if none of the branch exists (not even A), then return
302
+ will be [root topic, ['A',B','C','D']). Note also that if A.B.C
303
+ exists, the return will be (A.B.C, ['D']) regardless of whether
304
+ A.B.C.D exists. """
305
+ subtopicNames = []
306
+ headTail = topicNameDotted.rsplit('.', 1)
307
+ while len(headTail) > 1:
308
+ parentName = headTail[0]
309
+ subtopicNames.insert( 0, headTail[1] )
310
+ obj = self._topicsMap.get( parentName, None )
311
+ if obj is not None:
312
+ return obj, subtopicNames
313
+
314
+ headTail = parentName.rsplit('.', 1)
315
+
316
+ subtopicNames.insert( 0, headTail[0] )
317
+ return self.__allTopics, subtopicNames
318
+
319
+ def __createParentTopics(self, topicName):
320
+ """This will find which parents need to be created such that
321
+ topicName can be created (but doesn't create given topic),
322
+ and creates them. Returns the parent object."""
323
+ assert self.getTopic(topicName, okIfNone=True) is None
324
+ parentObj, subtopicNames = self.__getClosestParent(stringize(topicName))
325
+
326
+ # will create subtopics of parentObj one by one from subtopicNames
327
+ if parentObj is self.__allTopics:
328
+ nextTopicNameList = []
329
+ else:
330
+ nextTopicNameList = list(parentObj.getNameTuple())
331
+ for name in subtopicNames[:-1]:
332
+ nextTopicNameList.append(name)
333
+ desc, specGiven = self.__defnProvider.getDefn( tuple(nextTopicNameList) )
334
+ if desc is None:
335
+ desc = 'UNDOCUMENTED: created as parent without specification'
336
+ parentObj = self.__createTopic( tuple(nextTopicNameList),
337
+ desc, specGiven = specGiven, parent = parentObj)
338
+
339
+ return parentObj
340
+
341
+ def __createTopic(self, nameTuple, desc, specGiven, parent=None):
342
+ """Actual topic creation step. Adds new Topic instance to topic map,
343
+ and sends notification message (see ``Publisher.addNotificationMgr()``)
344
+ regarding topic creation."""
345
+ if specGiven is None:
346
+ specGiven = ArgSpecGiven()
347
+ parentAI = None
348
+ if parent:
349
+ parentAI = parent._getListenerSpec()
350
+ argsInfo = ArgsInfo(nameTuple, specGiven, parentAI)
351
+ if (self.__treeConfig.raiseOnTopicUnspecified
352
+ and not argsInfo.isComplete()):
353
+ raise TopicDefnError(nameTuple)
354
+
355
+ newTopicObj = Topic(self.__treeConfig, nameTuple, desc,
356
+ argsInfo, parent = parent)
357
+ # sanity checks:
358
+ assert newTopicObj.getName() not in self._topicsMap
359
+ if parent is self.__allTopics:
360
+ assert len( newTopicObj.getNameTuple() ) == 1
361
+ else:
362
+ assert parent.getNameTuple() == newTopicObj.getNameTuple()[:-1]
363
+ assert nameTuple == newTopicObj.getNameTuple()
364
+
365
+ # store new object and notify of creation
366
+ self._topicsMap[ newTopicObj.getName() ] = newTopicObj
367
+ self.__treeConfig.notificationMgr.notifyNewTopic(
368
+ newTopicObj, desc, specGiven.reqdArgs, specGiven.argsDocs)
369
+
370
+ return newTopicObj
371
+
372
+
373
+ def validateNameHierarchy(topicTuple):
374
+ """Check that names in topicTuple are valid: no spaces, not empty.
375
+ Raise ValueError if fails check. E.g. ('',) and ('a',' ') would
376
+ both fail, but ('a','b') would be ok. """
377
+ if not topicTuple:
378
+ topicName = stringize(topicTuple)
379
+ errMsg = 'empty topic name'
380
+ raise TopicNameError(topicName, errMsg)
381
+
382
+ for indx, topic in enumerate(topicTuple):
383
+ errMsg = None
384
+ if topic is None:
385
+ topicName = list(topicTuple)
386
+ topicName[indx] = 'None'
387
+ errMsg = 'None at level #%s'
388
+
389
+ elif not topic:
390
+ topicName = stringize(topicTuple)
391
+ errMsg = 'empty element at level #%s'
392
+
393
+ elif topic.isspace():
394
+ topicName = stringize(topicTuple)
395
+ errMsg = 'blank element at level #%s'
396
+
397
+ if errMsg:
398
+ raise TopicNameError(topicName, errMsg % indx)
399
+
400
+
401
+ class _MasterTopicDefnProvider:
402
+ """
403
+ Stores a list of topic definition providers. When queried for a topic
404
+ definition, queries each provider (registered via addProvider()) and
405
+ returns the first complete definition provided, or (None,None).
406
+
407
+ The providers must follow the ITopicDefnProvider protocol.
408
+ """
409
+
410
+ def __init__(self, treeConfig):
411
+ self.__providers = []
412
+ self.__treeConfig = treeConfig
413
+
414
+ def addProvider(self, provider):
415
+ """Add given provider IF not already added. """
416
+ assert(isinstance(provider, ITopicDefnProvider))
417
+ if provider not in self.__providers:
418
+ self.__providers.append(provider)
419
+
420
+ def clear(self):
421
+ """Remove all providers added."""
422
+ self.__providers = []
423
+
424
+ def getNumProviders(self):
425
+ """Return how many providers added."""
426
+ return len(self.__providers)
427
+
428
+ def getDefn(self, topicNameTuple):
429
+ """Returns a pair (docstring, MDS) for the topic. The first item is
430
+ a string containing the topic's "docstring", i.e. a description string
431
+ for the topic, or None if no docstring available for the topic. The
432
+ second item is None or an instance of ArgSpecGiven specifying the
433
+ required and optional message data for listeners of this topic. """
434
+ desc, defn = None, None
435
+ for provider in self.__providers:
436
+ tmpDesc, tmpDefn = provider.getDefn(topicNameTuple)
437
+ if (tmpDesc is not None) and (tmpDefn is not None):
438
+ assert tmpDefn.isComplete()
439
+ desc, defn = tmpDesc, tmpDefn
440
+ break
441
+
442
+ return desc, defn
443
+
444
+ def isDefined(self, topicNameTuple):
445
+ """Returns True only if a complete definition exists, ie topic
446
+ has a description and a complete message data specification (MDS)."""
447
+ desc, defn = self.getDefn(topicNameTuple)
448
+ if desc is None or defn is None:
449
+ return False
450
+ if defn.isComplete():
451
+ return True
452
+ return False
453
+
454
+