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
wx/tools/pywxrc.py ADDED
@@ -0,0 +1,951 @@
1
+ #----------------------------------------------------------------------
2
+ # Name: wx.tools.pywxrc
3
+ # Purpose: XML resource compiler
4
+ #
5
+ # Author: Robin Dunn
6
+ # Based on wxrc.cpp by Vaclav Slavik, Eduardo Marques
7
+ # Ported to Python in order to not require yet another
8
+ # binary in wxPython distributions
9
+ #
10
+ # Massive rework by Eli Golovinsky
11
+ #
12
+ # Editable blocks by Roman Rolinsky
13
+ #
14
+ # Copyright: (c) 2004-2020 by Total Control Software, 2000 Vaclav Slavik
15
+ # Licence: wxWindows license
16
+ # Tags: phoenix-port
17
+ #----------------------------------------------------------------------
18
+
19
+ """
20
+ pywxrc -- Python XML resource compiler
21
+ (see http://wiki.wxpython.org/index.cgi/pywxrc for more info)
22
+
23
+ Usage: python pywxrc.py -h
24
+ python pywxrc.py [-p] [-g] [-e] [-v] [-o filename] xrc input files...
25
+
26
+ -h, --help show help message
27
+ -p, --python generate python module
28
+ -g, --gettext output list of translatable strings (may be combined with -p)
29
+ -e, --embed embed XRC resources in the output file
30
+ -v, --novar suppress default assignment of variables
31
+ -o, --output output filename, or - for stdout
32
+ """
33
+
34
+ import sys, os, getopt, glob, re
35
+ import xml.dom.minidom as minidom
36
+
37
+ import operator
38
+ byte2int = operator.itemgetter(0)
39
+
40
+ #----------------------------------------------------------------------
41
+
42
+ reBeginBlock = re.compile(r'^#!XRCED:begin-block:(\S+)')
43
+ reEndBlock = re.compile(r'^#!XRCED:end-block:(\S+)')
44
+
45
+ class PythonTemplates:
46
+ FILE_HEADER = """\
47
+ # This file was automatically generated by pywxrc.
48
+ # -*- coding: UTF-8 -*-
49
+
50
+ import wx
51
+ import wx.xrc as xrc
52
+
53
+ __res = None
54
+
55
+ def get_resources():
56
+ \"\"\" This function provides access to the XML resources in this module.\"\"\"
57
+ global __res
58
+ if __res is None:
59
+ __init_resources()
60
+ return __res
61
+
62
+ """
63
+
64
+ CLASS_HEADER = """\
65
+ class xrc%(windowName)s(wx.%(windowClass)s):
66
+ #!XRCED:begin-block:xrc%(windowName)s.PreCreate
67
+ def PreCreate(self):
68
+ \"\"\" This function is called during the class's initialization.
69
+
70
+ Override it for custom setup before the window is created usually to
71
+ set additional window styles using SetWindowStyle() and SetExtraStyle().
72
+ \"\"\"
73
+ pass
74
+
75
+ #!XRCED:end-block:xrc%(windowName)s.PreCreate
76
+
77
+ def __init__(self, parent):
78
+ wx.%(windowClass)s.__init__(self)
79
+ self.PreCreate()
80
+ get_resources().Load%(windowClass)s(self, parent, "%(windowName)s")
81
+
82
+ # Define variables for the controls, bind event handlers
83
+ """
84
+
85
+ SUBCLASS_HEADER = """\
86
+ class %(subclass)s(wx.%(windowClass)s):
87
+ def __init__(self):
88
+ wx.%(windowClass)s.__init__(self)
89
+ self.Bind(wx.EVT_WINDOW_CREATE, self.OnCreate)
90
+
91
+ #!XRCED:begin-block:%(subclass)s._PostInit
92
+ def _PostInit(self):
93
+ \"\"\" This function is called after the subclassed object is created.
94
+
95
+ Override it for custom setup before the window is created usually to
96
+ set additional window styles using SetWindowStyle() and SetExtraStyle().
97
+ \"\"\"
98
+ pass
99
+ #!XRCED:end-block:%(subclass)s._PostInit
100
+
101
+ def OnCreate(self, evt):
102
+ self.Unbind(wx.EVT_WINDOW_CREATE)
103
+ self._PostInit()
104
+ """
105
+
106
+ CREATE_WIDGET_VAR = """\
107
+ self.%(widgetName)s = xrc.XRCCTRL(self, \"%(widgetName)s\")
108
+ """
109
+
110
+ FRAME_MENUBAR_VAR = """\
111
+ self.%(widgetName)s = self.GetMenuBar()
112
+ """
113
+
114
+ FRAME_MENUBAR_MENUITEM_VAR = """\
115
+ self.%(widgetName)s = self.GetMenuBar().FindItemById(xrc.XRCID(\"%(widgetName)s\"))
116
+ """
117
+
118
+ FRAME_MENUBAR_MENU_VAR = """\
119
+ idx = self.GetMenuBar().FindMenu(\"%(label)s\")
120
+ if idx != wx.NOT_FOUND:
121
+ self.%(widgetName)s = self.GetMenuBar().GetMenu(idx)
122
+ else:
123
+ self.%(widgetName)s = self.GetMenuBar().FindItemById(xrc.XRCID(\"%(widgetName)s\")).GetSubMenu()
124
+ """
125
+
126
+
127
+ MENUBAR_MENUITEM_VAR = """\
128
+ self.%(widgetName)s = self.FindItemById(xrc.XRCID(\"%(widgetName)s\"))
129
+ """
130
+
131
+ MENUBAR_MENU_VAR = """\
132
+ idx = self.FindMenu(\"%(label)s\")
133
+ if idx != wx.NOT_FOUND:
134
+ self.%(widgetName)s = self.GetMenu(idx)
135
+ else:
136
+ self.%(widgetName)s = self.FindItemById(xrc.XRCID(\"%(widgetName)s\")).GetSubMenu()
137
+ """
138
+
139
+ MENU_MENUITEM_VAR = """\
140
+ self.%(widgetName)s = self.FindItemById(xrc.XRCID(\"%(widgetName)s\"))
141
+ """
142
+
143
+ MENU_MENU_VAR = """\
144
+ self.%(widgetName)s = self.FindItemById(xrc.XRCID(\"%(widgetName)s\")).GetSubMenu()
145
+ """
146
+
147
+ FRAME_TOOLBAR_VAR = """\
148
+ self.%(widgetName)s = self.GetToolBar()
149
+ """
150
+
151
+ FRAME_TOOLBAR_TOOL_VAR = """\
152
+ self.%(widgetName)s = self.GetToolBar().FindById(xrc.XRCID(\"%(widgetName)s\"))
153
+ """
154
+
155
+ TOOLBAR_TOOL_VAR = """\
156
+ self.%(widgetName)s = self.FindById(xrc.XRCID(\"%(widgetName)s\"))
157
+ """
158
+
159
+ BIND_WIDGET_EVENT = """\
160
+ self.Bind(wx.%(event)s, self.%(eventHandler)s, %(eventObject)s)
161
+ """
162
+
163
+ BIND_EVENT = """\
164
+ self.Bind(wx.%(event)s, self.%(eventHandler)s)
165
+ """
166
+
167
+ CREATE_EVENT_HANDLER = """\
168
+ #!XRCED:begin-block:xrc%(windowName)s.%(eventHandler)s
169
+ def %(eventHandler)s(self, evt):
170
+ # Replace with event handler code
171
+ print(\"%(eventHandler)s()\")
172
+ #!XRCED:end-block:xrc%(windowName)s.%(eventHandler)s
173
+ """
174
+
175
+ MENU_CLASS_HEADER = """\
176
+ class xrc%(windowName)s(wx.%(windowClass)s):
177
+ def __init__(self):
178
+ pre = get_resources().LoadMenu("%(windowName)s")
179
+
180
+ # This is a copy of Robin's PostCreate voodoo magic in wx.Window that
181
+ # relinks the self object with the menu object.
182
+ self.this = pre.this
183
+ self.thisown = pre.thisown
184
+ pre.thisown = 0
185
+ if hasattr(self, '_setOORInfo'):
186
+ self._setOORInfo(self)
187
+
188
+ # Define variables for the menu items
189
+ """
190
+
191
+ MENUBAR_CLASS_HEADER = """\
192
+ class xrc%(windowName)s(wx.%(windowClass)s):
193
+ def __init__(self):
194
+ pre = get_resources().LoadMenuBar("%(windowName)s")
195
+ self.PostCreate(pre)
196
+
197
+ # Define variables for the menu items
198
+ """
199
+
200
+ TOOLBAR_CLASS_HEADER = """\
201
+ class xrc%(windowName)s(wx.%(windowClass)s):
202
+ def __init__(self, parent):
203
+ pre = get_resources().LoadToolBar(parent, "%(windowName)s")
204
+ self.PostCreate(pre)
205
+
206
+ # Define variables for the toolbar items
207
+ """
208
+
209
+ INIT_RESOURE_HEADER = """\
210
+ # ------------------------ Resource data ----------------------
211
+
212
+ def __init_resources():
213
+ global __res
214
+ __res = xrc.XmlResource()
215
+ """
216
+
217
+ LOAD_RES_FILE = """\
218
+ __res.Load('%(resourceFilename)s')"""
219
+
220
+ FILE_AS_STRING = """\
221
+ %(filename)s = b'''\\
222
+ %(fileData)s'''
223
+
224
+ """
225
+
226
+ PREPARE_MEMFS = """\
227
+ wx.FileSystem.AddHandler(wx.MemoryFSHandler())
228
+ """
229
+
230
+ ADD_FILE_TO_MEMFS = """\
231
+ wx.MemoryFSHandler.AddFile('XRC/%(memoryPath)s/%(filename)s', memoryview(%(filename)s))
232
+ """
233
+
234
+ LOAD_RES_MEMFS = """\
235
+ __res.Load('memory:XRC/%(memoryPath)s/%(resourceFilename)s')
236
+ """
237
+
238
+ GETTEXT_DUMMY_FUNC = """
239
+ # ----------------------- Gettext strings ---------------------
240
+
241
+ def __gettext_strings():
242
+ # This is a dummy function that lists all the strings that are used in
243
+ # the XRC file in the _("a string") format to be recognized by GNU
244
+ # gettext utilities (specifically the xgettext utility) and the
245
+ # mki18n.py script. For more information see:
246
+ # http://wiki.wxpython.org/index.cgi/Internationalization
247
+
248
+ def _(str): pass
249
+
250
+ %s
251
+ """
252
+
253
+ #----------------------------------------------------------------------
254
+
255
+ class XmlResourceCompiler:
256
+
257
+ templates = PythonTemplates()
258
+
259
+ """This class generates Python code from XML resource files (XRC)."""
260
+
261
+ def MakePythonModule(self, inputFiles, outputFilename,
262
+ embedResources=False, generateGetText=False,
263
+ assignVariables=True):
264
+
265
+ self.blocks = {}
266
+ self.outputFilename = outputFilename
267
+ outputFile = self._OpenOutputFile(outputFilename)
268
+ self.assignVariables = assignVariables
269
+
270
+ classes = []
271
+ subclasses = []
272
+ resources = []
273
+ gettextStrings = []
274
+
275
+ # process all the inputFiles, collecting the output data
276
+ for inFile in inputFiles:
277
+ resourceDocument = minidom.parse(inFile)
278
+ subclasses.append(self.GenerateSubclasses(resourceDocument))
279
+ classes.append(self.GenerateClasses(resourceDocument))
280
+
281
+ if embedResources:
282
+ res = self.GenerateInitResourcesEmbedded(inFile, resourceDocument)
283
+ else:
284
+ res = self.GenerateInitResourcesFile(inFile, resourceDocument)
285
+ resources.append(res)
286
+
287
+ if generateGetText:
288
+ gettextStrings += self.FindStringsInNode(resourceDocument.firstChild)
289
+
290
+ # now write it all out
291
+ print(self.templates.FILE_HEADER, file=outputFile)
292
+
293
+ # Note: Technically it is not legal to have anything other
294
+ # than ascii for class and variable names, but since the user
295
+ # can create the XML with non-ascii names we'll go ahead and
296
+ # allow for it here, and then let Python complain about it
297
+ # later when they try to run the program.
298
+ if subclasses:
299
+ subclasses = self.ReplaceBlocks(u"\n".join(subclasses))
300
+ print(subclasses, file=outputFile)
301
+ if classes:
302
+ classes = self.ReplaceBlocks(u"\n".join(classes))
303
+ print(classes, file=outputFile)
304
+
305
+ print(self.templates.INIT_RESOURE_HEADER, file=outputFile)
306
+ if embedResources:
307
+ print(self.templates.PREPARE_MEMFS, file=outputFile)
308
+ resources = u"\n".join(resources)
309
+ print(resources, file=outputFile)
310
+
311
+ if generateGetText:
312
+ # gettextStrings is a list of unicode strings as returned by ConvertText
313
+ conversions = [u' _("%s")' % s for s in gettextStrings]
314
+ conversion_block = u"\n".join(conversions)
315
+ conversion_func = self.templates.GETTEXT_DUMMY_FUNC % conversion_block
316
+ print(conversion_func, file=outputFile)
317
+
318
+ #-------------------------------------------------------------------
319
+
320
+ def MakeGetTextOutput(self, inputFiles, outputFilename):
321
+ """
322
+ Just output the gettext strings by themselves, with no other
323
+ code generation.
324
+ """
325
+ outputFile = self._OpenOutputFile(outputFilename)
326
+ for inFile in inputFiles:
327
+ resourceDocument = minidom.parse(inFile)
328
+ resource = resourceDocument.firstChild
329
+ strings = self.FindStringsInNode(resource)
330
+ # strings is a list of unicode strings as returned by ConvertText
331
+ strings = ['_("%s");' % s for s in strings]
332
+ print("\n".join(strings), file=outputFile)
333
+
334
+ #-------------------------------------------------------------------
335
+
336
+ def GenerateClasses(self, resourceDocument):
337
+ outputList = []
338
+
339
+ resource = resourceDocument.firstChild
340
+ topWindows = [e for e in resource.childNodes
341
+ if e.nodeType == e.ELEMENT_NODE and e.tagName == "object" \
342
+ and not e.getAttribute('subclass')]
343
+
344
+ # Generate a class for each top-window object (Frame, Panel, Dialog, etc.)
345
+ for topWindow in topWindows:
346
+ windowClass = topWindow.getAttribute("class")
347
+ windowClass = re.sub("^wx", "", windowClass)
348
+ windowName = topWindow.getAttribute("name")
349
+ if not windowName: continue
350
+
351
+ if windowClass in ["MenuBar"]:
352
+ genfunc = self.GenerateMenuBarClass
353
+ elif windowClass in ["Menu"]:
354
+ genfunc = self.GenerateMenuClass
355
+ elif windowClass in ["ToolBar"]:
356
+ genfunc = self.GenerateToolBarClass
357
+ else:
358
+ genfunc = self.GenerateWidgetClass
359
+
360
+ vars = []
361
+ outputList += genfunc(windowClass, windowName, topWindow, vars)
362
+ outputList.append('\n')
363
+
364
+ outputList += self.GenerateEventHandlers(windowClass, windowName, topWindow, vars)
365
+
366
+ return "".join(outputList)
367
+
368
+ #-------------------------------------------------------------------
369
+
370
+ def CheckAssignVar(self, widget):
371
+ if self.assignVariables: return True # assign_var override mode
372
+ assign_var = False
373
+ for node in widget.getElementsByTagName("XRCED"):
374
+ if node.parentNode is widget:
375
+ try:
376
+ elem = node.getElementsByTagName("assign_var")[0]
377
+ except IndexError:
378
+ continue
379
+ if elem.childNodes:
380
+ ch = elem.childNodes[0]
381
+ if ch.nodeType == ch.TEXT_NODE and bool(ch.nodeValue):
382
+ assign_var = True
383
+ return assign_var
384
+
385
+
386
+ def GenerateMenuBarClass(self, windowClass, windowName, topWindow, vars):
387
+ outputList = []
388
+
389
+ # output the header
390
+ outputList.append(self.templates.MENUBAR_CLASS_HEADER % locals())
391
+
392
+ # create an attribute for menus and menu items that have names
393
+ for widget in topWindow.getElementsByTagName("object"):
394
+ if not self.CheckAssignVar(widget): continue
395
+ widgetClass = widget.getAttribute("class")
396
+ widgetClass = re.sub("^wx", "", widgetClass)
397
+ widgetName = widget.getAttribute("name")
398
+ if widgetName != "" and widgetClass != "":
399
+ vars.append(widgetName)
400
+ if widgetClass == "MenuItem":
401
+ outputList.append(self.templates.MENUBAR_MENUITEM_VAR % locals())
402
+ elif widgetClass == "Menu":
403
+ for e in widget.childNodes:
404
+ if e.nodeType == e.ELEMENT_NODE and e.tagName == "label":
405
+ label = e
406
+ break
407
+ label = label.childNodes[0].data
408
+ outputList.append(self.templates.MENUBAR_MENU_VAR % locals())
409
+ else:
410
+ raise RuntimeError("Unexpected widgetClass for MenuBar: %s" % widgetClass)
411
+
412
+ return outputList
413
+
414
+
415
+ def GenerateMenuClass(self, windowClass, windowName, topWindow, vars):
416
+ outputList = []
417
+
418
+ # output the header
419
+ outputList.append(self.templates.MENU_CLASS_HEADER % locals())
420
+ for widget in topWindow.getElementsByTagName("object"):
421
+ if not self.CheckAssignVar(widget): continue
422
+ widgetClass = widget.getAttribute("class")
423
+ widgetClass = re.sub("^wx", "", widgetClass)
424
+ widgetName = widget.getAttribute("name")
425
+ if widgetName != "" and widgetClass != "":
426
+ vars.append(widgetName)
427
+ if widgetClass == "MenuItem":
428
+ outputList.append(self.templates.MENU_MENUITEM_VAR % locals())
429
+ elif widgetClass == "Menu":
430
+ for e in widget.childNodes:
431
+ if e.nodeType == e.ELEMENT_NODE and e.tagName == "label":
432
+ label = e
433
+ break
434
+ label = label.childNodes[0].data
435
+ outputList.append(self.templates.MENU_MENU_VAR % locals())
436
+ else:
437
+ raise RuntimeError("Unexpected widgetClass for Menu: %s" % widgetClass)
438
+
439
+ return outputList
440
+
441
+
442
+ def GenerateToolBarClass(self, windowClass, windowName, topWindow, vars):
443
+ outputList = []
444
+
445
+ # output the header
446
+ outputList.append(self.templates.TOOLBAR_CLASS_HEADER % locals())
447
+
448
+ # create an attribute for menus and menu items that have names
449
+ for widget in topWindow.getElementsByTagName("object"):
450
+ if not self.CheckAssignVar(widget): continue
451
+ widgetClass = widget.getAttribute("class")
452
+ widgetClass = re.sub("^wx", "", widgetClass)
453
+ widgetName = widget.getAttribute("name")
454
+ if widgetName != "" and widgetClass != "":
455
+ vars.append(widgetName)
456
+ if widgetClass == "tool":
457
+ outputList.append(self.templates.TOOLBAR_TOOL_VAR % locals())
458
+ else:
459
+ raise RuntimeError("Unexpected widgetClass for ToolBar: %s" % widgetClass)
460
+
461
+ return outputList
462
+
463
+
464
+ def GenerateWidgetClass(self, windowClass, windowName, topWindow, vars):
465
+ outputList = []
466
+
467
+ # output the header
468
+ outputList.append(self.templates.CLASS_HEADER % locals())
469
+
470
+ # Generate an attribute for each named item in the container
471
+ for widget in topWindow.getElementsByTagName("object"):
472
+ if not self.CheckAssignVar(widget): continue
473
+ widgetClass = widget.getAttribute("class")
474
+ widgetClass = re.sub("^wx", "", widgetClass)
475
+ widgetName = widget.getAttribute("name")
476
+ if widgetName != "" and widgetClass != "":
477
+ vars.append(widgetName)
478
+ if widgetClass == "MenuBar":
479
+ outputList.append(self.templates.FRAME_MENUBAR_VAR % locals())
480
+ elif widgetClass == "MenuItem":
481
+ outputList.append(self.templates.FRAME_MENUBAR_MENUITEM_VAR % locals())
482
+ elif widgetClass == "Menu":
483
+ # Only look directly under for the "label"
484
+ for e in widget.childNodes:
485
+ if e.nodeType == e.ELEMENT_NODE and e.tagName == "label":
486
+ label = e
487
+ break
488
+ label = label.childNodes[0].data
489
+ outputList.append(self.templates.FRAME_MENUBAR_MENU_VAR % locals())
490
+ # elif widgetClass == "ToolBar":
491
+ # outputList.append(self.templates.FRAME_TOOLBAR_VAR % locals())
492
+ elif widgetClass == "tool":
493
+ outputList.append(self.templates.FRAME_TOOLBAR_TOOL_VAR % locals())
494
+ elif widgetClass in ('unknown', 'notebookpage', 'separator', 'sizeritem'):
495
+ pass
496
+ else:
497
+ outputList.append(self.templates.CREATE_WIDGET_VAR % locals())
498
+
499
+ return outputList
500
+
501
+ #-------------------------------------------------------------------
502
+
503
+ def GenerateSubclasses(self, resourceDocument):
504
+ outputList = []
505
+
506
+ objectNodes = resourceDocument.getElementsByTagName("object")
507
+ subclasses = set()
508
+ bases = {}
509
+ baseName = os.path.splitext(self.outputFilename)[0]
510
+ for node in objectNodes:
511
+ subclass = node.getAttribute('subclass')
512
+ if subclass:
513
+ module = subclass[:subclass.find('.')]
514
+ if module != baseName: continue
515
+ klass = node.getAttribute("class")
516
+ if subclass not in subclasses:
517
+ subclasses.add(subclass)
518
+ bases[subclass] = klass
519
+ else:
520
+ if klass != bases[subclass]:
521
+ print('pywxrc: error: conflicting base classes for subclass %(subclass)s' % subclass)
522
+
523
+ # Generate subclasses
524
+ for subclass in subclasses:
525
+ windowClass = bases[subclass]
526
+ subclass = re.sub(r"^\S+\.", "", subclass)
527
+ windowClass = re.sub("^wx", "", windowClass)
528
+ outputList.append(self.templates.SUBCLASS_HEADER % locals())
529
+ outputList.append('\n')
530
+
531
+ return "".join(outputList)
532
+
533
+ #-------------------------------------------------------------------
534
+
535
+ def GenerateEventHandlers(self, windowClass, windowName, topWindow, vars):
536
+ outputList = []
537
+
538
+ # Generate child event handlers
539
+ eventHandlers = []
540
+ for elem in topWindow.getElementsByTagName("XRCED"):
541
+ try:
542
+ eventNode = elem.getElementsByTagName("events")[0]
543
+ except IndexError:
544
+ continue
545
+ events = eventNode.childNodes[0].data.split('|')
546
+ for event in events:
547
+ if elem.parentNode is topWindow:
548
+ eventHandler = "On%s" % event[4:].capitalize()
549
+ outputList.append(self.templates.BIND_EVENT % locals())
550
+ eventHandlers.append(eventHandler)
551
+ else:
552
+ widget = elem.parentNode
553
+ widgetClass = widget.getAttribute("class")
554
+ widgetClass = re.sub("^wx", "", widgetClass)
555
+ widgetName = widget.getAttribute("name")
556
+ if not widgetName or not widgetClass: continue
557
+ eventObject = None
558
+ if widgetClass == "MenuItem" and windowClass != "MenuBar":
559
+ if widgetName[:2] == "wx":
560
+ eventObject = 'id=wx.%s' % re.sub("^wx", "", widgetName)
561
+ eventHandler = "On%s_%s" % (event[4:].capitalize(), widgetName)
562
+ if widgetName in vars: eventObject = "self.%s" % widgetName
563
+ else:
564
+ eventHandler = "On%s_%s" % (event[4:].capitalize(), widgetName)
565
+ if widgetName in vars: eventObject = "self.%s" % widgetName
566
+ if not eventObject:
567
+ eventObject = "id=xrc.XRCID('%s')" % widgetName
568
+ outputList.append(self.templates.BIND_WIDGET_EVENT % locals())
569
+ eventHandlers.append(eventHandler)
570
+ outputList.append("\n")
571
+
572
+ for eventHandler in eventHandlers:
573
+ block = "xrc%(windowName)s.%(eventHandler)s" % locals()
574
+ try:
575
+ outputList.append(self.blocks[block])
576
+ except KeyError:
577
+ outputList.append(self.templates.CREATE_EVENT_HANDLER % locals())
578
+ outputList.append("\n")
579
+
580
+ outputList.append("\n")
581
+ return "".join(outputList)
582
+
583
+ #-------------------------------------------------------------------
584
+
585
+ def GenerateInitResourcesEmbedded(self, resourceFilename, resourceDocument):
586
+ outputList = []
587
+ files = []
588
+
589
+ resourcePath = os.path.split(resourceFilename)[0]
590
+ memoryPath = self.GetMemoryFilename(os.path.splitext(os.path.split(resourceFilename)[1])[0])
591
+ resourceFilename = self.GetMemoryFilename(os.path.split(resourceFilename)[1])
592
+
593
+ self.ReplaceFilenamesInXRC(resourceDocument.firstChild, files, resourcePath)
594
+
595
+ filename = resourceFilename
596
+ fileData = resourceDocument.toxml() # what about this? encoding=resourceDocument.encoding)
597
+ outputList.append(self.templates.FILE_AS_STRING % locals())
598
+
599
+ for f in files:
600
+ filename = self.GetMemoryFilename(f)
601
+ fileData = self.FileToString(os.path.join(resourcePath, f))
602
+ outputList.append(self.templates.FILE_AS_STRING % locals())
603
+
604
+ for f in [resourceFilename] + files:
605
+ filename = self.GetMemoryFilename(f)
606
+ outputList.append(self.templates.ADD_FILE_TO_MEMFS % locals())
607
+
608
+ outputList.append(self.templates.LOAD_RES_MEMFS % locals())
609
+
610
+ return "".join(outputList)
611
+
612
+ #-------------------------------------------------------------------
613
+
614
+ def GenerateInitResourcesFile(self, resourceFilename, resourceDocument):
615
+ # take only the filename portion out of resourceFilename
616
+ resourceFilename = os.path.split(resourceFilename)[1]
617
+ outputList = []
618
+ outputList.append(self.templates.LOAD_RES_FILE % locals())
619
+ return "".join(outputList)
620
+
621
+ #-------------------------------------------------------------------
622
+
623
+ def GetMemoryFilename(self, filename):
624
+ # Remove special chars from the filename
625
+ return re.sub(r"[^A-Za-z0-9_]", "_", filename)
626
+
627
+ #-------------------------------------------------------------------
628
+
629
+ def FileToString(self, filename):
630
+ outputList = []
631
+ with open(filename, "rb") as fid:
632
+ buffer = fid.read()
633
+ fileLen = len(buffer)
634
+
635
+ linelng = 0
636
+ for i in range(fileLen):
637
+ s = buffer[i:i+1]
638
+ c = byte2int(s)
639
+ if s == b'\n':
640
+ tmp = s
641
+ linelng = 0
642
+ elif c < 32 or c > 127 or s == b"'":
643
+ tmp = b"\\x%02x" % c
644
+ elif s == b"\\":
645
+ tmp = b"\\\\"
646
+ else:
647
+ tmp = s
648
+
649
+ if linelng > 70:
650
+ linelng = 0
651
+ outputList.append(b"\\\n")
652
+
653
+ outputList.append(tmp)
654
+ linelng += len(tmp)
655
+
656
+ return (b"".join(outputList)).decode('utf-8')
657
+
658
+ #-------------------------------------------------------------------
659
+
660
+ def NodeContainsFilename(self, node):
661
+ """ Does 'node' contain filename information at all? """
662
+
663
+ # Any bitmaps:
664
+ if node.nodeName == "bitmap":
665
+ return True
666
+
667
+ if node.nodeName == "icon":
668
+ return True
669
+
670
+ # URLs in wxHtmlWindow:
671
+ if node.nodeName == "url":
672
+ return True
673
+
674
+ # wxBitmapButton:
675
+ parent = node.parentNode
676
+ if parent.__class__ != minidom.Document and \
677
+ parent.getAttribute("class") == "wxBitmapButton" and \
678
+ (node.nodeName == "focus" or node.nodeName == "disabled" or
679
+ node.nodeName == "selected"):
680
+ return True
681
+
682
+ # wxBitmap or wxIcon toplevel resources:
683
+ if node.nodeName == "object":
684
+ klass = node.getAttribute("class")
685
+ if klass == "wxBitmap" or klass == "wxIcon":
686
+ return True
687
+
688
+ return False
689
+
690
+ #-------------------------------------------------------------------
691
+
692
+ def ReplaceFilenamesInXRC(self, node, files, resourcePath):
693
+ """ Finds all files mentioned in resource file, e.g. <bitmap>filename</bitmap>
694
+ and replaces them with the memory filenames.
695
+
696
+ Fills a list of the filenames found."""
697
+
698
+ # Is 'node' XML node element?
699
+ if node is None: return
700
+ if node.nodeType != minidom.Document.ELEMENT_NODE: return
701
+
702
+ containsFilename = self.NodeContainsFilename(node);
703
+
704
+ for n in node.childNodes:
705
+
706
+ if (containsFilename and
707
+ (n.nodeType == minidom.Document.TEXT_NODE or
708
+ n.nodeType == minidom.Document.CDATA_SECTION_NODE)):
709
+
710
+ filename = n.nodeValue
711
+ memoryFilename = self.GetMemoryFilename(filename)
712
+ n.nodeValue = memoryFilename
713
+
714
+ if filename not in files:
715
+ files.append(filename)
716
+
717
+ # Recurse into children
718
+ if n.nodeType == minidom.Document.ELEMENT_NODE:
719
+ self.ReplaceFilenamesInXRC(n, files, resourcePath);
720
+
721
+ #-------------------------------------------------------------------
722
+
723
+ def FindStringsInNode(self, parent):
724
+ def is_number(st):
725
+ try:
726
+ i = int(st)
727
+ return True
728
+ except ValueError:
729
+ return False
730
+
731
+ strings = []
732
+ if parent is None:
733
+ return strings;
734
+
735
+ for child in parent.childNodes:
736
+ if ((parent.nodeType == parent.ELEMENT_NODE) and
737
+ # parent is an element, i.e. has subnodes...
738
+ (child.nodeType == child.TEXT_NODE or
739
+ child.nodeType == child.CDATA_SECTION_NODE) and
740
+ # ...it is textnode...
741
+ (
742
+ parent.tagName == "label" or
743
+ (parent.tagName == "value" and
744
+ not is_number(child.nodeValue)) or
745
+ parent.tagName == "help" or
746
+ parent.tagName == "longhelp" or
747
+ parent.tagName == "tooltip" or
748
+ parent.tagName == "htmlcode" or
749
+ parent.tagName == "title" or
750
+ parent.tagName == "item"
751
+ )):
752
+ # ...and known to contain translatable string
753
+ if (parent.getAttribute("translate") != "0"):
754
+ strings.append(self.ConvertText(child.nodeValue))
755
+
756
+ # subnodes:
757
+ if child.nodeType == child.ELEMENT_NODE:
758
+ strings += self.FindStringsInNode(child)
759
+
760
+ return strings
761
+
762
+ #-------------------------------------------------------------------
763
+
764
+ def ConvertText(self, st):
765
+ r"""
766
+ Encode special characters as escaped C/Python string characters.
767
+
768
+ \n => \\n
769
+ \r => \\r
770
+ \t => \\t
771
+ \ => \\
772
+ " => \"
773
+
774
+ Returns result as string, which is bytes in py2 or unicode in py3.
775
+ """
776
+ st2 = ""
777
+ dt = list(st)
778
+
779
+ skipNext = False
780
+ for i in range(len(dt)):
781
+ if skipNext:
782
+ skipNext = False
783
+ continue
784
+
785
+ if dt[i] == '_':
786
+ if dt[i+1] == '_':
787
+ st2 += '_'
788
+ skipNext = True
789
+ else:
790
+ st2 += '&'
791
+ elif dt[i] == '\n':
792
+ st2 += '\\n'
793
+ elif dt[i] == '\t':
794
+ st2 += '\\t'
795
+ elif dt[i] == '\r':
796
+ st2 += '\\r'
797
+ elif dt[i] == '\\':
798
+ if dt[i+1] not in ['n', 't', 'r']:
799
+ st2 += '\\\\'
800
+ else:
801
+ st2 += '\\'
802
+ elif dt[i] == '"':
803
+ st2 += '\\"'
804
+ else:
805
+ st2 += dt[i]
806
+
807
+ return st2
808
+
809
+ #-------------------------------------------------------------------
810
+
811
+ # Replace editable block contents with previous
812
+ def ReplaceBlocks(self, input):
813
+ output = []
814
+ block = None
815
+ blockLines = []
816
+ for l in input.split('\n'):
817
+ if not block:
818
+ mo = reBeginBlock.match(l)
819
+ if mo and mo.groups()[0] in self.blocks:
820
+ block = mo.groups()[0]
821
+ output.append(self.blocks[block])
822
+ else:
823
+ output.append(l + '\n')
824
+ else:
825
+ mo = reEndBlock.match(l)
826
+ if mo:
827
+ if mo.groups()[0] != block:
828
+ print("pywxrc: error: block mismatch: %s != %s" % (block, mo.groups()[0]))
829
+ block = None
830
+ return ''.join(output)
831
+
832
+ #-------------------------------------------------------------------
833
+
834
+ def _OpenOutputFile(self, outputFilename):
835
+ if outputFilename == "-":
836
+ outputFile = sys.stdout
837
+ else:
838
+ # Parse existing file to collect editable blocks
839
+ if os.path.isfile(outputFilename):
840
+ outputFile = open(outputFilename)
841
+ block = None
842
+ blockLines = []
843
+ for l in outputFile.readlines():
844
+ if not block:
845
+ mo = reBeginBlock.match(l)
846
+ if mo:
847
+ block = mo.groups()[0]
848
+ blockLines = [l]
849
+ else:
850
+ blockLines.append(l)
851
+ mo = reEndBlock.match(l)
852
+ if mo:
853
+ if mo.groups()[0] != block:
854
+ print("pywxrc: error: block mismatch: %s != %s" % (block, mo.groups()[0]))
855
+ self.blocks[block] = "".join(blockLines)
856
+ block = None
857
+
858
+ try:
859
+ outputFile = open(outputFilename, "wt")
860
+ except IOError:
861
+ raise IOError("Can't write output to '%s'" % outputFilename)
862
+ return outputFile
863
+
864
+
865
+
866
+
867
+
868
+ #---------------------------------------------------------------------------
869
+
870
+ def main(args=None):
871
+ if not args:
872
+ args = sys.argv[1:]
873
+
874
+ outputFilename = None
875
+ embedResources = False
876
+ generateGetText = False
877
+ assignVariables = True
878
+ generatePython = False
879
+
880
+ try:
881
+ opts, args = getopt.gnu_getopt(args,
882
+ "hpgevo:",
883
+ "help python gettext embed novar output=".split())
884
+ except getopt.GetoptError as exc:
885
+ print("\nError : %s\n" % str(exc))
886
+ print(__doc__)
887
+ sys.exit(1)
888
+
889
+ # If there is no input file argument, show help and exit
890
+ if not args:
891
+ print(__doc__)
892
+ print("No xrc input file was specified.")
893
+ sys.exit(1)
894
+
895
+ # Parse options and arguments
896
+ for opt, val in opts:
897
+ if opt in ["-h", "--help"]:
898
+ print(__doc__)
899
+ sys.exit(1)
900
+
901
+ if opt in ["-p", "--python"]:
902
+ generatePython = True
903
+
904
+ if opt in ["-o", "--output"]:
905
+ outputFilename = val
906
+
907
+ if opt in ["-e", "--embed"]:
908
+ embedResources = True
909
+
910
+ if opt in ["-v", "--novar"]:
911
+ assignVariables = False
912
+
913
+ if opt in ["-g", "--gettext"]:
914
+ generateGetText = True
915
+
916
+
917
+ # check for and expand any wildcards in the list of input files
918
+ inputFiles = []
919
+ for arg in args:
920
+ inputFiles += glob.glob(arg)
921
+
922
+
923
+ comp = XmlResourceCompiler()
924
+
925
+ try:
926
+ if generatePython:
927
+ if not outputFilename:
928
+ outputFilename = os.path.splitext(args[0])[0] + "_xrc.py"
929
+ comp.MakePythonModule(inputFiles, outputFilename,
930
+ embedResources, generateGetText,
931
+ assignVariables)
932
+
933
+ elif generateGetText:
934
+ if not outputFilename:
935
+ outputFilename = '-'
936
+ comp.MakeGetTextOutput(inputFiles, outputFilename)
937
+
938
+ else:
939
+ print(__doc__)
940
+ print("One or both of -p, -g must be specified.")
941
+ sys.exit(1)
942
+
943
+
944
+ except IOError as exc:
945
+ print("%s." % str(exc), file=sys.stderr)
946
+ else:
947
+ if outputFilename != "-":
948
+ print("Resources written to %s." % outputFilename, file=sys.stderr)
949
+
950
+ if __name__ == "__main__":
951
+ main(sys.argv[1:])