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/lib/imagebrowser.py ADDED
@@ -0,0 +1,853 @@
1
+ #----------------------------------------------------------------------------
2
+ # Name: BrowseImage.py
3
+ # Purpose: Display and Select Image Files
4
+ #
5
+ # Original Author: Lorne White
6
+ #
7
+ # Version: 2.0
8
+ # Date: June 16, 2007
9
+ # Licence: wxWindows license
10
+ # Tags: phoenix-port
11
+ #----------------------------------------------------------------------------
12
+ # 2.0 Release - Bill Baxter (wbaxter@gmail.com)
13
+ # Date: June 16, 2007
14
+ # o Changed to use sizers instead of fixed placement.
15
+ # o Made dialog resizeable
16
+ # o Added a splitter between file list and view pane
17
+ # o Made directory path editable
18
+ # o Added an "up" button" to go to the parent dir
19
+ # o Changed to show directories in file list
20
+ # o Don't select images on double click any more
21
+ # o Added a 'broken image' display for files that wx fails to identify
22
+ # o Redesigned appearance -- using bitmap buttons now, and rearranged things
23
+ # o Fixed display of masked gifs
24
+ # o Fixed zooming logic to show shrunken images at correct aspect ratio
25
+ # o Added different background modes for preview (white/grey/dark/checkered)
26
+ # o Added framing modes for preview (no frame/box frame/tinted border)
27
+ #
28
+ #----------------------------------------------------------------------------
29
+ #
30
+ # 12/08/2003 - Jeff Grimmett (grimmtooth@softhome.net)
31
+ #
32
+ # o Updated for wx namespace
33
+ # o Corrected a nasty bug or two - see comments below.
34
+ # o There was a duplicate ImageView.DrawImage() method. Que?
35
+ #
36
+ #----------------------------------------------------------------------------
37
+ # 1.0 Release - Lorne White
38
+ # Date: January 29, 2002
39
+ # Create list of all available image file types
40
+ # View "All Image" File Types as default filter
41
+ # Sort the file list
42
+ # Use newer "re" function for patterns
43
+ #
44
+ # Tags: phoenix-port, documented, unittest
45
+ #---------------------------------------------------------------------------
46
+ """
47
+ This module provides the :class:`~lib.imagebrowser.ImageDialog` which allows to view and select
48
+ an image.
49
+
50
+
51
+ Description
52
+ ===========
53
+
54
+ The :class:`wx.ImageDialog` allows the user to view images and select one.
55
+
56
+ Usage
57
+ =====
58
+
59
+ A simple usage would be::
60
+
61
+ import wx
62
+ import wx.lib.mixins.inspection as wit
63
+ import wx.lib.imagebrowser as ib
64
+
65
+ app = wit.InspectableApp()
66
+
67
+ with ib.ImageDialog(None) as dlg:
68
+ if dlg.ShowModal() == wx.ID_OK:
69
+ # show the selected file
70
+ print("You Selected File: " + dlg.GetFile())
71
+ else:
72
+ print("You pressed Cancel")
73
+
74
+ app.MainLoop()
75
+
76
+ """
77
+
78
+ import os
79
+ import wx
80
+
81
+ if 'wxOSX' in wx.PlatformInfo:
82
+ # The wx.BitmapButton doesn't do so well on OSX with very small bitmaps,
83
+ # so use a custom class there.
84
+ import wx.lib.buttons
85
+ class BitmapButton(wx.lib.buttons.GenBitmapButton):
86
+ def __init__(self, *args, **kw):
87
+ super(BitmapButton, self).__init__(*args, **kw)
88
+ self.SetBezelWidth(1)
89
+ self.SetInitialSize()
90
+ print(self.GetSize(), self.GetBestSize())
91
+
92
+ else:
93
+ BitmapButton = wx.BitmapButton
94
+
95
+
96
+ _ = wx.GetTranslation
97
+
98
+ #---------------------------------------------------------------------------
99
+
100
+ BAD_IMAGE = -1
101
+ ID_WHITE_BG = wx.NewIdRef()
102
+ ID_BLACK_BG = wx.NewIdRef()
103
+ ID_GREY_BG = wx.NewIdRef()
104
+ ID_CHECK_BG = wx.NewIdRef()
105
+ ID_NO_FRAME = wx.NewIdRef()
106
+ ID_BOX_FRAME = wx.NewIdRef()
107
+ ID_CROP_FRAME = wx.NewIdRef()
108
+
109
+ def ConvertBMP(file_nm):
110
+ """
111
+ Convert file
112
+
113
+ :param string `file_nm`: path to file
114
+
115
+ :return: :class:`wx.Image` or BAD_IMAGE
116
+ """
117
+ if file_nm is None:
118
+ return None
119
+
120
+ fl_fld = os.path.splitext(file_nm)
121
+ ext = fl_fld[1]
122
+ ext = ext[1:].lower()
123
+
124
+ # Don't try to create it directly because wx throws up
125
+ # an annoying messasge dialog if the type isn't supported.
126
+ if wx.Image.CanRead(file_nm):
127
+ image = wx.Image(file_nm, wx.BITMAP_TYPE_ANY)
128
+ return image
129
+
130
+ # BAD_IMAGE means a bad image, None just means no image (i.e. directory)
131
+ return BAD_IMAGE
132
+
133
+
134
+ def GetCheckeredBitmap(blocksize=8, ntiles=4, rgb0=b'\xFF', rgb1=b'\xCC'):
135
+ """
136
+ Creates a square RGB checkered bitmap using the two specified colors.
137
+
138
+ The bitmap returned will have width = height = blocksize*ntiles*2
139
+
140
+ :param int `blocksize`: the number of pixels in each solid color square
141
+ :param int `ntiles1`: the number of tiles along width and height. Each
142
+ tile is 2x2 blocks.
143
+ :param `rbg0`: the first color, as 3-character bytes object.
144
+ :param `rgb1`: the second color, as 3-character bytes object. If only 1
145
+ character is provided, it is treated as a grey value.
146
+
147
+ :return: :class:`wx.Bitmap`
148
+
149
+ """
150
+ assert isinstance(rgb0, bytes)
151
+ assert isinstance(rgb1, bytes)
152
+
153
+ size = blocksize*ntiles*2
154
+
155
+ if len(rgb0)==1:
156
+ rgb0 = rgb0 * 3
157
+ if len(rgb1)==1:
158
+ rgb1 = rgb1 * 3
159
+
160
+ strip0 = (rgb0*blocksize + rgb1*blocksize)*(ntiles*blocksize)
161
+ strip1 = (rgb1*blocksize + rgb0*blocksize)*(ntiles*blocksize)
162
+ band = strip0 + strip1
163
+ data = band * ntiles
164
+ return wx.Bitmap.FromBuffer(size, size, data)
165
+
166
+ def GetNamedBitmap(name):
167
+ return IMG_CATALOG[name].GetBitmap()
168
+
169
+
170
+ class ImageView(wx.Window):
171
+ def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize,
172
+ style=wx.BORDER_SUNKEN
173
+ ):
174
+ wx.Window.__init__(self, parent, id, pos, size, style=style)
175
+
176
+ self.image = None
177
+
178
+ self.check_bmp = None
179
+ self.check_dim_bmp = None
180
+
181
+ # dark_bg is the brush/bitmap to use for painting in the whole background
182
+ # lite_bg is the brush/bitmap/pen to use for painting the image rectangle
183
+ self.dark_bg = None
184
+ self.lite_bg = None
185
+
186
+ self.border_mode = ID_CROP_FRAME
187
+ self.SetBackgroundMode( ID_WHITE_BG )
188
+ self.SetBorderMode( ID_NO_FRAME )
189
+
190
+ # Changed API of wx uses tuples for size and pos now.
191
+ self.Bind(wx.EVT_PAINT, self.OnPaint)
192
+ self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
193
+ self.Bind(wx.EVT_SIZE, self.OnSize)
194
+
195
+
196
+ def SetValue(self, file_nm): # display the selected file in the panel
197
+ image = ConvertBMP(file_nm)
198
+ self.image = image
199
+ self.Refresh()
200
+
201
+ def SetBackgroundMode(self, mode):
202
+ self.bg_mode = mode
203
+ self._updateBGInfo()
204
+
205
+ def _updateBGInfo(self):
206
+ bg = self.bg_mode
207
+ border = self.border_mode
208
+
209
+ self.dark_bg = None
210
+ self.lite_bg = None
211
+
212
+ if border == ID_BOX_FRAME:
213
+ self.lite_bg = wx.BLACK_PEN
214
+
215
+ if bg == ID_WHITE_BG:
216
+ if border == ID_CROP_FRAME:
217
+ self.SetBackgroundColour('LIGHT GREY')
218
+ self.lite_bg = wx.WHITE_BRUSH
219
+ else:
220
+ self.SetBackgroundColour('WHITE')
221
+
222
+ elif bg == ID_GREY_BG:
223
+ if border == ID_CROP_FRAME:
224
+ self.SetBackgroundColour('GREY')
225
+ self.lite_bg = wx.LIGHT_GREY_BRUSH
226
+ else:
227
+ self.SetBackgroundColour('LIGHT GREY')
228
+
229
+ elif bg == ID_BLACK_BG:
230
+ if border == ID_BOX_FRAME:
231
+ self.lite_bg = wx.WHITE_PEN
232
+ if border == ID_CROP_FRAME:
233
+ self.SetBackgroundColour('GREY')
234
+ self.lite_bg = wx.BLACK_BRUSH
235
+ else:
236
+ self.SetBackgroundColour('BLACK')
237
+
238
+ else:
239
+ if self.check_bmp is None:
240
+ self.check_bmp = GetCheckeredBitmap()
241
+ self.check_dim_bmp = GetCheckeredBitmap(rgb0=b'\x7F', rgb1=b'\x66')
242
+ if border == ID_CROP_FRAME:
243
+ self.dark_bg = self.check_dim_bmp
244
+ self.lite_bg = self.check_bmp
245
+ else:
246
+ self.dark_bg = self.check_bmp
247
+
248
+ self.Refresh()
249
+
250
+ def SetBorderMode(self, mode):
251
+ self.border_mode = mode
252
+ self._updateBGInfo()
253
+
254
+ def OnSize(self, event):
255
+ event.Skip()
256
+ self.Refresh()
257
+
258
+ def OnPaint(self, event):
259
+ dc = wx.PaintDC(self)
260
+ self.DrawImage(dc)
261
+
262
+ def OnEraseBackground(self, evt):
263
+ if self.bg_mode != ID_CHECK_BG:
264
+ evt.Skip()
265
+ return
266
+ dc = evt.GetDC()
267
+ if dc:
268
+ self.PaintBackground(dc, self.dark_bg)
269
+
270
+ def PaintBackground(self, dc, painter, rect=None):
271
+ if painter is None:
272
+ return
273
+ if rect is None:
274
+ pos = self.GetPosition()
275
+ sz = self.GetSize()
276
+ else:
277
+ pos = rect.Position
278
+ sz = rect.Size
279
+
280
+ if type(painter)==wx.Brush:
281
+ dc.SetPen(wx.TRANSPARENT_PEN)
282
+ dc.SetBrush(painter)
283
+ dc.DrawRectangle(pos.x,pos.y,sz.width,sz.height)
284
+ elif type(painter)==wx.Pen:
285
+ dc.SetPen(painter)
286
+ dc.SetBrush(wx.TRANSPARENT_BRUSH)
287
+ dc.DrawRectangle(pos.x-1,pos.y-1,sz.width+2,sz.height+2)
288
+ else:
289
+ self.TileBackground(dc, painter, pos.x,pos.y,sz.width,sz.height)
290
+
291
+
292
+ def TileBackground(self, dc, bmp, x,y,w,h):
293
+ """Tile bmp into the specified rectangle"""
294
+ bw = bmp.GetWidth()
295
+ bh = bmp.GetHeight()
296
+
297
+ dc.SetClippingRegion(x,y,w,h)
298
+
299
+ # adjust so 0,0 so we always match with a tiling starting at 0,0
300
+ dx = x % bw
301
+ x = x - dx
302
+ w = w + dx
303
+
304
+ dy = y % bh
305
+ y = y - dy
306
+ h = h + dy
307
+
308
+ tx = x
309
+ x2 = x+w
310
+ y2 = y+h
311
+
312
+ while tx < x2:
313
+ ty = y
314
+ while ty < y2:
315
+ dc.DrawBitmap(bmp, tx, ty)
316
+ ty += bh
317
+ tx += bw
318
+
319
+ def DrawImage(self, dc):
320
+
321
+ if not hasattr(self,'image') or self.image is None:
322
+ return
323
+
324
+ wwidth,wheight = self.GetSize()
325
+ image = self.image
326
+ bmp = None
327
+ if image != BAD_IMAGE and image.IsOk():
328
+ iwidth = image.GetWidth() # dimensions of image file
329
+ iheight = image.GetHeight()
330
+ else:
331
+ bmp = wx.ArtProvider.GetBitmap(wx.ART_MISSING_IMAGE, wx.ART_MESSAGE_BOX, (64,64))
332
+ iwidth = bmp.GetWidth()
333
+ iheight = bmp.GetHeight()
334
+
335
+ # squeeze iwidth x iheight image into window, preserving aspect ratio
336
+
337
+ xfactor = float(wwidth) / iwidth
338
+ yfactor = float(wheight) / iheight
339
+
340
+ if xfactor < 1.0 and xfactor < yfactor:
341
+ scale = xfactor
342
+ elif yfactor < 1.0 and yfactor < xfactor:
343
+ scale = yfactor
344
+ else:
345
+ scale = 1.0
346
+
347
+ owidth = int(scale*iwidth)
348
+ oheight = int(scale*iheight)
349
+
350
+ diffx = (wwidth - owidth)//2 # center calc
351
+ diffy = (wheight - oheight)//2 # center calc
352
+
353
+ if not bmp:
354
+ if owidth!=iwidth or oheight!=iheight:
355
+ sc_image = sc_image = image.Scale(owidth,oheight)
356
+ else:
357
+ sc_image = image
358
+ bmp = sc_image.ConvertToBitmap()
359
+
360
+ if image != BAD_IMAGE and image.IsOk():
361
+ self.PaintBackground(dc, self.lite_bg, wx.Rect(diffx,diffy,owidth,oheight))
362
+
363
+ dc.DrawBitmap(bmp, diffx, diffy, useMask=True) # draw the image to window
364
+
365
+
366
+ class ImagePanel(wx.Panel):
367
+ def __init__(self, parent, id=-1, pos=wx.DefaultPosition, size=wx.DefaultSize,
368
+ style=wx.NO_BORDER
369
+ ):
370
+ wx.Panel.__init__(self, parent, id, pos, size, style=style)
371
+
372
+ vbox = wx.BoxSizer(wx.VERTICAL)
373
+ self.SetSizer(vbox)
374
+
375
+ self.view = ImageView(self)
376
+ vbox.Add(self.view, 1, wx.GROW|wx.ALL, 0)
377
+
378
+ hbox_ctrls = wx.BoxSizer(wx.HORIZONTAL)
379
+ vbox.Add(hbox_ctrls, 0, wx.ALIGN_RIGHT|wx.TOP, 4)
380
+
381
+ bmp = GetNamedBitmap('White')
382
+ btn = BitmapButton(self, ID_WHITE_BG, bmp, style=wx.BU_EXACTFIT)
383
+ self.Bind(wx.EVT_BUTTON, self.OnSetImgBackground, btn)
384
+ btn.SetToolTip(_("Set background to white"))
385
+ hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
386
+
387
+ bmp = GetNamedBitmap('Grey')
388
+ btn = BitmapButton(self, ID_GREY_BG, bmp, style=wx.BU_EXACTFIT)
389
+ self.Bind(wx.EVT_BUTTON, self.OnSetImgBackground, btn)
390
+ btn.SetToolTip(_("Set background to grey"))
391
+ hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
392
+
393
+ bmp = GetNamedBitmap('Black')
394
+ btn = BitmapButton(self, ID_BLACK_BG, bmp, style=wx.BU_EXACTFIT)
395
+ self.Bind(wx.EVT_BUTTON, self.OnSetImgBackground, btn)
396
+ btn.SetToolTip(_("Set background to black"))
397
+ hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
398
+
399
+ bmp = GetNamedBitmap('Checked')
400
+ btn = BitmapButton(self, ID_CHECK_BG, bmp, style=wx.BU_EXACTFIT)
401
+ self.Bind(wx.EVT_BUTTON, self.OnSetImgBackground, btn)
402
+ btn.SetToolTip(_("Set background to checkered pattern"))
403
+ hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
404
+
405
+
406
+ hbox_ctrls.AddSpacer(7)
407
+
408
+ bmp = GetNamedBitmap('NoFrame')
409
+ btn = BitmapButton(self, ID_NO_FRAME, bmp, style=wx.BU_EXACTFIT)
410
+ self.Bind(wx.EVT_BUTTON, self.OnSetBorderMode, btn)
411
+ btn.SetToolTip(_("No framing around image"))
412
+ hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
413
+
414
+ bmp = GetNamedBitmap('BoxFrame')
415
+ btn = BitmapButton(self, ID_BOX_FRAME, bmp, style=wx.BU_EXACTFIT)
416
+ self.Bind(wx.EVT_BUTTON, self.OnSetBorderMode, btn)
417
+ btn.SetToolTip(_("Frame image with a box"))
418
+ hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
419
+
420
+ bmp = GetNamedBitmap('CropFrame')
421
+ btn = BitmapButton(self, ID_CROP_FRAME, bmp, style=wx.BU_EXACTFIT)
422
+ self.Bind(wx.EVT_BUTTON, self.OnSetBorderMode, btn)
423
+ btn.SetToolTip(_("Frame image with a dimmed background"))
424
+ hbox_ctrls.Add(btn, 0, wx.ALIGN_LEFT|wx.LEFT, 4)
425
+
426
+
427
+ def SetValue(self, file_nm): # display the selected file in the panel
428
+ self.view.SetValue(file_nm)
429
+
430
+ def SetBackgroundMode(self, mode):
431
+ self.view.SetBackgroundMode(mode)
432
+
433
+ def SetBorderMode(self, mode):
434
+ self.view.SetBorderMode(mode)
435
+
436
+ def OnSetImgBackground(self, event):
437
+ mode = event.GetId()
438
+ self.SetBackgroundMode(mode)
439
+
440
+ def OnSetBorderMode(self, event):
441
+ mode = event.GetId()
442
+ self.SetBorderMode(mode)
443
+
444
+
445
+
446
+ class ImageDialog(wx.Dialog):
447
+ """
448
+ :class:`wx.ImageDialog` derived from :class:`Dialog` allows the user
449
+ to display images and to select an image.
450
+ """
451
+ def __init__(self, parent, set_dir = None):
452
+ """
453
+ Default class constructor.
454
+
455
+ :param wx.Window `parent`: parent window.
456
+ :param string `set_dir`: path to set as working directory
457
+
458
+ """
459
+ wx.Dialog.__init__(self, parent, -1, _("Image Browser"),
460
+ wx.DefaultPosition, (400, 400),
461
+ style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
462
+
463
+ self.set_dir = os.getcwd()
464
+ self.set_file = None
465
+
466
+ if set_dir is not None:
467
+ if os.path.exists(set_dir): # set to working directory if nothing set
468
+ self.set_dir = set_dir
469
+
470
+ vbox_top = wx.BoxSizer(wx.VERTICAL)
471
+ self.SetSizer(vbox_top)
472
+
473
+ hbox_loc = wx.BoxSizer(wx.HORIZONTAL)
474
+ vbox_top.Add(hbox_loc, 0, wx.GROW|wx.ALIGN_LEFT|wx.ALL, 0)
475
+
476
+ loc_label = wx.StaticText( self, -1, "Folder:")
477
+ hbox_loc.Add(loc_label, 0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL|wx.ALL|wx.ADJUST_MINSIZE, 5)
478
+
479
+ self.dir = wx.TextCtrl( self, -1, self.set_dir, style=wx.TE_RICH|wx.TE_PROCESS_ENTER)
480
+ self.Bind(wx.EVT_TEXT_ENTER, self.OnDirectoryTextSet, self.dir)
481
+ hbox_loc.Add(self.dir, 1, wx.GROW|wx.ALIGN_LEFT|wx.ALL, 5)
482
+
483
+ up_bmp = wx.ArtProvider.GetBitmap(wx.ART_GO_DIR_UP, wx.ART_BUTTON, (16,16))
484
+ btn = BitmapButton(self, -1, up_bmp, style=wx.BU_EXACTFIT)
485
+ btn.SetHelpText(_("Up one level"))
486
+ btn.SetToolTip(_("Up one level"))
487
+ self.Bind(wx.EVT_BUTTON, self.OnUpDirectory, btn)
488
+ hbox_loc.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 2)
489
+
490
+ folder_bmp = wx.ArtProvider.GetBitmap(wx.ART_FOLDER_OPEN, wx.ART_BUTTON, (16,16))
491
+ btn = BitmapButton(self, -1, folder_bmp, style=wx.BU_EXACTFIT)
492
+ btn.SetHelpText(_("Browse for a &folder..."))
493
+ btn.SetToolTip(_("Browse for a folder..."))
494
+ self.Bind(wx.EVT_BUTTON, self.OnChooseDirectory, btn)
495
+ hbox_loc.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, 5)
496
+
497
+ hbox_nav = wx.BoxSizer(wx.HORIZONTAL)
498
+ vbox_top.Add(hbox_nav, 0, wx.ALIGN_LEFT|wx.ALL, 0)
499
+
500
+
501
+ label = wx.StaticText( self, -1, "Files of type:")
502
+ hbox_nav.Add(label, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT, 5)
503
+
504
+ self.fl_ext = '*.bmp' # initial setting for file filtering
505
+ self.GetFiles() # get the file list
506
+
507
+ self.fl_ext_types = (
508
+ # display, filter
509
+ ("All supported formats", "All"),
510
+ ("BMP (*.bmp)", "*.bmp"),
511
+ ("GIF (*.gif)", "*.gif"),
512
+ ("PNG (*.png)", "*.png"),
513
+ ("JPEG (*.jpg)", "*.jpg"),
514
+ ("ICO (*.ico)", "*.ico"),
515
+ ("PNM (*.pnm)", "*.pnm"),
516
+ ("PCX (*.pcx)", "*.pcx"),
517
+ ("TIFF (*.tif)", "*.tif"),
518
+ ("All Files", "*.*"),
519
+ )
520
+ self.set_type,self.fl_ext = self.fl_ext_types[0] # initial file filter setting
521
+ self.fl_types = [ x[0] for x in self.fl_ext_types ]
522
+ self.sel_type = wx.ComboBox( self, -1, self.set_type,
523
+ wx.DefaultPosition, wx.DefaultSize, self.fl_types,
524
+ wx.CB_DROPDOWN )
525
+ # after this we don't care about the order any more
526
+ self.fl_ext_types = dict(self.fl_ext_types)
527
+
528
+ self.Bind(wx.EVT_COMBOBOX, self.OnSetType, self.sel_type)
529
+ hbox_nav.Add(self.sel_type, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
530
+
531
+ splitter = wx.SplitterWindow( self, -1, wx.DefaultPosition, wx.Size(100, 100), 0 )
532
+ splitter.SetMinimumPaneSize(100)
533
+
534
+ split_left = wx.Panel( splitter, -1, wx.DefaultPosition, wx.DefaultSize,
535
+ wx.NO_BORDER|wx.TAB_TRAVERSAL )
536
+ vbox_left = wx.BoxSizer(wx.VERTICAL)
537
+ split_left.SetSizer(vbox_left)
538
+
539
+
540
+ self.tb = tb = wx.ListBox( split_left, -1, wx.DefaultPosition, wx.DefaultSize,
541
+ self.fl_list, wx.LB_SINGLE )
542
+ self.Bind(wx.EVT_LISTBOX, self.OnListClick, tb)
543
+ self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnListDClick, tb)
544
+ vbox_left.Add(self.tb, 1, wx.GROW|wx.ALL, 0)
545
+
546
+ width, height = self.tb.GetSize()
547
+
548
+ split_right = wx.Panel( splitter, -1, wx.DefaultPosition, wx.DefaultSize,
549
+ wx.NO_BORDER|wx.TAB_TRAVERSAL )
550
+ vbox_right = wx.BoxSizer(wx.VERTICAL)
551
+ split_right.SetSizer(vbox_right)
552
+
553
+ self.image_view = ImagePanel( split_right )
554
+ vbox_right.Add(self.image_view, 1, wx.GROW|wx.ALL, 0)
555
+
556
+ splitter.SplitVertically(split_left, split_right, 150)
557
+ vbox_top.Add(splitter, 1, wx.GROW|wx.ALL, 5)
558
+
559
+ hbox_btns = wx.BoxSizer(wx.HORIZONTAL)
560
+ vbox_top.Add(hbox_btns, 0, wx.ALIGN_RIGHT|wx.ALL, 5)
561
+
562
+ ok_btn = wx.Button( self, wx.ID_OPEN, "", wx.DefaultPosition, wx.DefaultSize, 0 )
563
+ self.Bind(wx.EVT_BUTTON, self.OnOk, ok_btn)
564
+ #ok_btn.SetDefault()
565
+ hbox_btns.Add(ok_btn, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
566
+
567
+ cancel_btn = wx.Button( self, wx.ID_CANCEL, "",
568
+ wx.DefaultPosition, wx.DefaultSize, 0 )
569
+ hbox_btns.Add(cancel_btn, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
570
+
571
+ self.ResetFiles()
572
+
573
+ def ChangeFileTypes(self, ft_tuple):
574
+ """
575
+ Change list of file types to be supported
576
+
577
+ :param tuple `ft_tuple`: tuple of files types, e.g. to support just
578
+ .gif and .png you would use:
579
+
580
+ (("GIF (*.gif)", "*.gif"),
581
+ ("PNG (*.png)", "*.png"))
582
+
583
+ """
584
+
585
+ self.fl_ext_types = ft_tuple
586
+ self.set_type, self.fl_ext = self.fl_ext_types[0] # initial file filter setting
587
+ self.fl_types = [ x[0] for x in self.fl_ext_types ]
588
+ self.sel_type.Clear()
589
+ self.sel_type.AppendItems(self.fl_types)
590
+ self.sel_type.SetSelection(0)
591
+ self.fl_ext_types = dict(self.fl_ext_types)
592
+
593
+ def GetFiles(self):
594
+ # get the file list using directory and extension values
595
+ if self.fl_ext == "All":
596
+ all_files = []
597
+
598
+ if self.fl_types[-1] == 'All Files':
599
+ allTypes = self.fl_types[-1:]
600
+ else:
601
+ allTypes = self.fl_types[1:]
602
+ for ftypes in allTypes: # get list of all
603
+ filter = self.fl_ext_types[ftypes]
604
+ #print("filter = ", filter)
605
+ self.fl_val = FindFiles(self, self.set_dir, filter)
606
+ all_files = all_files + self.fl_val.files # add to list of files
607
+
608
+ self.fl_list = all_files
609
+ else:
610
+ self.fl_val = FindFiles(self, self.set_dir, self.fl_ext)
611
+ self.fl_list = self.fl_val.files
612
+
613
+
614
+ self.fl_list.sort() # sort the file list
615
+ # prepend the directories
616
+ self.fl_ndirs = len(self.fl_val.dirs)
617
+ self.fl_list = sorted(self.fl_val.dirs) + self.fl_list
618
+
619
+ def DisplayDir(self):
620
+ # display the working directory
621
+ if self.dir:
622
+ ipt = self.dir.GetInsertionPoint()
623
+ self.dir.SetValue(self.set_dir)
624
+ self.dir.SetInsertionPoint(ipt)
625
+
626
+ def OnSetType(self, event):
627
+ val = event.GetString() # get file type value
628
+ self.fl_ext = self.fl_ext_types[val]
629
+ self.ResetFiles()
630
+
631
+ def OnListDClick(self, event):
632
+ self.OnOk('dclick')
633
+
634
+ def OnListClick(self, event):
635
+ val = event.GetSelection()
636
+ self.SetListValue(val)
637
+
638
+ def SetListValue(self, val):
639
+ file_nm = self.fl_list[val]
640
+ self.set_file = file_val = os.path.join(self.set_dir, file_nm)
641
+ if val>=self.fl_ndirs:
642
+ self.image_view.SetValue(file_val)
643
+ else:
644
+ self.image_view.SetValue(None)
645
+
646
+ def OnDirectoryTextSet(self,event):
647
+ event.Skip()
648
+ path = event.GetString()
649
+ if os.path.isdir(path):
650
+ self.set_dir = path
651
+ self.ResetFiles()
652
+ return
653
+
654
+ if os.path.isfile(path):
655
+ dname,fname = os.path.split(path)
656
+ if os.path.isdir(dname):
657
+ self.ResetFiles()
658
+ # try to select fname in list
659
+ try:
660
+ idx = self.fl_list.index(fname)
661
+ self.tb.SetSelection(idx)
662
+ self.SetListValue(idx)
663
+ return
664
+ except ValueError:
665
+ pass
666
+
667
+ wx.Bell()
668
+
669
+ def OnUpDirectory(self, event):
670
+ sdir = os.path.split(self.set_dir)[0]
671
+ self.set_dir = sdir
672
+ self.ResetFiles()
673
+
674
+ def OnChooseDirectory(self, event):
675
+ # set the new directory
676
+ dlg = wx.DirDialog(self)
677
+ dlg.SetPath(self.set_dir)
678
+
679
+ if dlg.ShowModal() == wx.ID_OK:
680
+ self.set_dir = dlg.GetPath()
681
+ self.ResetFiles()
682
+
683
+ dlg.Destroy()
684
+
685
+ def ResetFiles(self):
686
+ # refresh the display with files and initial image
687
+ self.DisplayDir()
688
+ self.GetFiles()
689
+
690
+ # Changed 12/8/03 jmg
691
+ #
692
+ # o Clear listbox first
693
+ # o THEN check to see if there are any valid files of the selected
694
+ # type,
695
+ # o THEN if we have any files to display, set the listbox up,
696
+ #
697
+ # OTHERWISE
698
+ #
699
+ # o Leave it cleared
700
+ # o Clear the image viewer.
701
+ #
702
+ # This avoids a nasty assert error.
703
+ #
704
+ self.tb.Clear()
705
+
706
+ if len(self.fl_list):
707
+ self.tb.Set(self.fl_list)
708
+
709
+ for idir in range(self.fl_ndirs):
710
+ d = self.fl_list[idir]
711
+ # mark directories as 'True' with client data
712
+ self.tb.SetClientData(idir, True)
713
+ self.tb.SetString(idir,'['+d+']')
714
+
715
+ try:
716
+ self.tb.SetSelection(0)
717
+ self.SetListValue(0)
718
+ except Exception:
719
+ self.image_view.SetValue(None)
720
+ else:
721
+ self.image_view.SetValue(None)
722
+
723
+ def GetFile(self):
724
+ """
725
+ Get selected file
726
+
727
+ :return: File selected or None
728
+ """
729
+ return self.set_file
730
+
731
+ def GetDirectory(self):
732
+ """
733
+ Get directory
734
+
735
+ :return: get the current directory
736
+
737
+ """
738
+ return self.set_dir
739
+
740
+ def OnCancel(self, event):
741
+ self.result = None
742
+ self.EndModal(wx.ID_CANCEL)
743
+
744
+ def OnOk(self, event):
745
+ if os.path.isdir(self.set_file):
746
+ sdir = os.path.split(self.set_file)
747
+
748
+ #os.path.normapth?
749
+ if sdir and sdir[-1]=='..':
750
+ sdir = os.path.split(sdir[0])[0]
751
+ sdir = os.path.split(sdir)
752
+ self.set_dir = os.path.join(*sdir)
753
+ self.set_file = None
754
+ self.ResetFiles()
755
+ elif event != 'dclick':
756
+ self.result = self.set_file
757
+ self.EndModal(wx.ID_OK)
758
+
759
+
760
+
761
+ class FindFiles:
762
+ def __init__(self, parent, dir, mask, with_dirs=True):
763
+ filelist = []
764
+ dirlist = [".."]
765
+ self.dir = dir
766
+ self.file = ""
767
+ mask = mask.upper()
768
+ pattern = self.MakeRegex(mask)
769
+
770
+ for i in os.listdir(dir):
771
+ if i == "." or i == "..":
772
+ continue
773
+
774
+ path = os.path.join(dir, i)
775
+
776
+ if os.path.isdir(path):
777
+ dirlist.append(i)
778
+ continue
779
+
780
+ path = path.upper()
781
+ value = i.upper()
782
+
783
+ if pattern.match(value) is not None:
784
+ filelist.append(i)
785
+
786
+
787
+ self.files = filelist
788
+ if with_dirs:
789
+ self.dirs = dirlist
790
+
791
+ def MakeRegex(self, pattern):
792
+ import re
793
+ f = "" # Set up a regex for file names
794
+
795
+ for ch in pattern:
796
+ if ch == "*":
797
+ f = f + ".*"
798
+ elif ch == ".":
799
+ f = f + r"\."
800
+ elif ch == "?":
801
+ f = f + "."
802
+ else:
803
+ f = f + ch
804
+
805
+ return re.compile(f+'$')
806
+
807
+ def StripExt(self, file_nm):
808
+ fl_fld = os.path.splitext(file_nm)
809
+ fl_name = fl_fld[0]
810
+ ext = fl_fld[1]
811
+ return ext[1:]
812
+
813
+
814
+ #----------------------------------------------------------------------
815
+ # This part of the file was generated by C:\Python25\Scripts\img2py
816
+ # then edited slightly.
817
+
818
+ from wx.lib.embeddedimage import PyEmbeddedImage
819
+
820
+ IMG_CATALOG = {}
821
+
822
+ IMG_CATALOG['White'] = PyEmbeddedImage(
823
+ "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAAIUlE"
824
+ "QVQYlWNgIAIwMjAw/P//H58KRkYmYkwaVUScIqIAAMjRAxRV8+5MAAAAAElFTkSuQmCC")
825
+
826
+ IMG_CATALOG['Grey'] = PyEmbeddedImage(
827
+ "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAAIklE"
828
+ "QVQYlWNgIAIwMjAwnDlzBo8KExMTJmJMGlVEnCKiAAC24wMULFLZGAAAAABJRU5ErkJggg==")
829
+
830
+ IMG_CATALOG['Black'] = PyEmbeddedImage(
831
+ "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAADklE"
832
+ "QVQYlWNgGAVDFQAAAbwAATN8mzYAAAAASUVORK5CYII=")
833
+
834
+ IMG_CATALOG['Checked'] = PyEmbeddedImage(
835
+ "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAAMUlE"
836
+ "QVQYlWNgIAIwMjAwnDlzBlnI2NgYRQUjIxMxJtFZEQsDhkvPnj07sG4iShFRAAAougYW+urT"
837
+ "ZwAAAABJRU5ErkJggg==")
838
+
839
+ IMG_CATALOG['NoFrame'] = PyEmbeddedImage(
840
+ "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAANklE"
841
+ "QVQYla2PQQoAIBACnej/X7ZbUEQtkudhVKkQJNm+EdAqpggCgB+m44kFml1bY39q0k15Bsuc"
842
+ "CR/z8ajiAAAAAElFTkSuQmCC")
843
+
844
+ IMG_CATALOG['BoxFrame'] = PyEmbeddedImage(
845
+ "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAAQ0lE"
846
+ "QVQYlZ2O0QoAIAgDd9L//7I9CFEhJu1psmNOaghJ7l4RYJ0m1U0R2X4vevcHVOiG0tcHBABh"
847
+ "8nWpIhpPLtn0rwm4WyD966x3sgAAAABJRU5ErkJggg==")
848
+
849
+ IMG_CATALOG['CropFrame'] = PyEmbeddedImage(
850
+ "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAA3NCSVQICAjb4U/gAAAASUlE"
851
+ "QVQYlb2QMQrAQAgEZ0P+q0/RF5tCuIMUh2myhcgyjCAMIiAiDoS7XxPTCLrXZmaAJKCqgMz8"
852
+ "YHpD7ThBkvpcz93z6wtGeQD/sQ8bfXs8NAAAAABJRU5ErkJggg==")
853
+