wxPython-zombie 3.1.5.8__cp313-cp313-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 (1175) hide show
  1. wx/__init__.py +22 -0
  2. wx/__version__.py +9 -0
  3. wx/_adv.cp313-win_amd64.pyd +0 -0
  4. wx/_aui.cp313-win_amd64.pyd +0 -0
  5. wx/_core.cp313-win_amd64.pyd +0 -0
  6. wx/_dataview.cp313-win_amd64.pyd +0 -0
  7. wx/_glcanvas.cp313-win_amd64.pyd +0 -0
  8. wx/_grid.cp313-win_amd64.pyd +0 -0
  9. wx/_html.cp313-win_amd64.pyd +0 -0
  10. wx/_html2.cp313-win_amd64.pyd +0 -0
  11. wx/_media.cp313-win_amd64.pyd +0 -0
  12. wx/_msw.cp313-win_amd64.pyd +0 -0
  13. wx/_propgrid.cp313-win_amd64.pyd +0 -0
  14. wx/_ribbon.cp313-win_amd64.pyd +0 -0
  15. wx/_richtext.cp313-win_amd64.pyd +0 -0
  16. wx/_stc.cp313-win_amd64.pyd +0 -0
  17. wx/_xml.cp313-win_amd64.pyd +0 -0
  18. wx/_xrc.cp313-win_amd64.pyd +0 -0
  19. wx/adv.py +124 -0
  20. wx/adv.pyi +5182 -0
  21. wx/aui.py +77 -0
  22. wx/aui.pyi +3655 -0
  23. wx/core.py +3540 -0
  24. wx/core.pyi +50592 -0
  25. wx/dataview.py +173 -0
  26. wx/dataview.pyi +3491 -0
  27. wx/demo/AUI_DockingWindowMgr.py +1154 -0
  28. wx/demo/AUI_MDI.py +117 -0
  29. wx/demo/AUI_Notebook.py +58 -0
  30. wx/demo/About.py +75 -0
  31. wx/demo/AboutBox.py +75 -0
  32. wx/demo/ActiveXWrapper_Acrobat.py +132 -0
  33. wx/demo/ActiveXWrapper_IE.py +187 -0
  34. wx/demo/ActiveX_FlashWindow.py +107 -0
  35. wx/demo/ActiveX_IEHtmlWindow.py +242 -0
  36. wx/demo/ActiveX_PDFWindow.py +204 -0
  37. wx/demo/ActivityIndicator.py +80 -0
  38. wx/demo/AddPrivateFont.py +116 -0
  39. wx/demo/AdjustChannels.py +178 -0
  40. wx/demo/AlphaDrawing.py +77 -0
  41. wx/demo/AnalogClock.py +144 -0
  42. wx/demo/AnimationCtrl.py +104 -0
  43. wx/demo/ArtProvider.py +893 -0
  44. wx/demo/BannerWindow.py +1 -0
  45. wx/demo/BitmapButton.py +87 -0
  46. wx/demo/BitmapComboBox.py +63 -0
  47. wx/demo/BitmapFromBuffer.py +140 -0
  48. wx/demo/Button.py +77 -0
  49. wx/demo/Cairo.py +197 -0
  50. wx/demo/Cairo_Snippets.py +135 -0
  51. wx/demo/Calendar.py +660 -0
  52. wx/demo/CalendarCtrl.py +122 -0
  53. wx/demo/CheckBox.py +74 -0
  54. wx/demo/CheckListBox.py +79 -0
  55. wx/demo/CheckListCtrl.py +99 -0
  56. wx/demo/Choice.py +55 -0
  57. wx/demo/Choicebook.py +80 -0
  58. wx/demo/CollapsibleHeaderCtrl.py +85 -0
  59. wx/demo/CollapsiblePane.py +126 -0
  60. wx/demo/ColorPanel.py +19 -0
  61. wx/demo/ColourDB.py +203 -0
  62. wx/demo/ColourDialog.py +76 -0
  63. wx/demo/ColourSelect.py +119 -0
  64. wx/demo/ComboBox.py +111 -0
  65. wx/demo/ComboCtrl.py +153 -0
  66. wx/demo/ComboTreeBox.py +71 -0
  67. wx/demo/CommandLinkButton.py +50 -0
  68. wx/demo/ContextHelp.py +112 -0
  69. wx/demo/Cursor.py +336 -0
  70. wx/demo/CustomDragAndDrop.py +353 -0
  71. wx/demo/DVC_CustomRenderer.py +204 -0
  72. wx/demo/DVC_DataViewModel.py +365 -0
  73. wx/demo/DVC_IndexListModel.py +257 -0
  74. wx/demo/DVC_ListCtrl.py +69 -0
  75. wx/demo/DVC_TreeCtrl.py +76 -0
  76. wx/demo/DatePickerCtrl.py +68 -0
  77. wx/demo/DelayedResult.py +239 -0
  78. wx/demo/Dialog.py +169 -0
  79. wx/demo/DialogUnits.py +128 -0
  80. wx/demo/DirDialog.py +58 -0
  81. wx/demo/DragAndDrop.py +265 -0
  82. wx/demo/DragImage.py +316 -0
  83. wx/demo/DragScroller.py +59 -0
  84. wx/demo/DrawXXXList.py +436 -0
  85. wx/demo/DynamicSashWindow.py +177 -0
  86. wx/demo/EditableListBox.py +101 -0
  87. wx/demo/Editor.py +70 -0
  88. wx/demo/EventManager.py +291 -0
  89. wx/demo/ExpandoTextCtrl.py +164 -0
  90. wx/demo/FancyText.py +83 -0
  91. wx/demo/FileBrowseButton.py +100 -0
  92. wx/demo/FileCtrl.py +97 -0
  93. wx/demo/FileDialog.py +144 -0
  94. wx/demo/FileHistory.py +140 -0
  95. wx/demo/FindReplaceDialog.py +123 -0
  96. wx/demo/FloatCanvas.py +1959 -0
  97. wx/demo/FontDialog.py +142 -0
  98. wx/demo/FontEnumerator.py +82 -0
  99. wx/demo/Frame.py +85 -0
  100. wx/demo/GLCanvas.py +371 -0
  101. wx/demo/Gauge.py +66 -0
  102. wx/demo/GenericButtons.py +185 -0
  103. wx/demo/GenericCheckBox.py +65 -0
  104. wx/demo/GenericDirCtrl.py +74 -0
  105. wx/demo/GetMouseState.py +159 -0
  106. wx/demo/GraphicsContext.py +236 -0
  107. wx/demo/GraphicsGradient.py +281 -0
  108. wx/demo/Grid.py +95 -0
  109. wx/demo/GridBagSizer.py +170 -0
  110. wx/demo/GridCustEditor.py +247 -0
  111. wx/demo/GridCustTable.py +170 -0
  112. wx/demo/GridDragAndDrop.py +102 -0
  113. wx/demo/GridDragable.py +206 -0
  114. wx/demo/GridEnterHandler.py +66 -0
  115. wx/demo/GridHugeTable.py +89 -0
  116. wx/demo/GridLabelRenderer.py +114 -0
  117. wx/demo/GridSimple.py +270 -0
  118. wx/demo/GridStdEdRend.py +186 -0
  119. wx/demo/Grid_MegaExample.py +490 -0
  120. wx/demo/HTML2_WebView.py +183 -0
  121. wx/demo/HtmlWindow.py +232 -0
  122. wx/demo/I18N.py +237 -0
  123. wx/demo/Image.py +338 -0
  124. wx/demo/ImageAlpha.py +87 -0
  125. wx/demo/ImageBrowser.py +70 -0
  126. wx/demo/ImageFromStream.py +49 -0
  127. wx/demo/Img2PyArtProvider.py +99 -0
  128. wx/demo/InfoBar.py +127 -0
  129. wx/demo/IntCtrl.py +343 -0
  130. wx/demo/ItemsPicker.py +108 -0
  131. wx/demo/Joystick.py +1083 -0
  132. wx/demo/KeyEvents.py +428 -0
  133. wx/demo/LEDNumberCtrl.py +121 -0
  134. wx/demo/LayoutAnchors.py +258 -0
  135. wx/demo/LayoutConstraints.py +149 -0
  136. wx/demo/Layoutf.py +69 -0
  137. wx/demo/ListBox.py +164 -0
  138. wx/demo/ListCtrl.py +538 -0
  139. wx/demo/ListCtrl_edit.py +155 -0
  140. wx/demo/ListCtrl_virtual.py +145 -0
  141. wx/demo/Listbook.py +104 -0
  142. wx/demo/MDIDemo.py +86 -0
  143. wx/demo/MDISashDemo.py +152 -0
  144. wx/demo/MDIWindows.py +66 -0
  145. wx/demo/Main.py +2768 -0
  146. wx/demo/Mask.py +137 -0
  147. wx/demo/MaskedEditControls.py +648 -0
  148. wx/demo/MaskedNumCtrl.py +359 -0
  149. wx/demo/MediaCtrl.py +190 -0
  150. wx/demo/Menu.py +322 -0
  151. wx/demo/MessageDialog.py +54 -0
  152. wx/demo/MimeTypesManager.py +354 -0
  153. wx/demo/MiniFrame.py +67 -0
  154. wx/demo/MouseGestures.py +198 -0
  155. wx/demo/MultiChoiceDialog.py +59 -0
  156. wx/demo/MultiSash.py +95 -0
  157. wx/demo/MultiSplitterWindow.py +168 -0
  158. wx/demo/MultipleChoiceDialog.py +101 -0
  159. wx/demo/Notebook.py +134 -0
  160. wx/demo/NotificationMessage.py +61 -0
  161. wx/demo/OGL.py +433 -0
  162. wx/demo/Overlay.py +209 -0
  163. wx/demo/OwnerDrawnComboBox.py +152 -0
  164. wx/demo/PDFViewer.py +109 -0
  165. wx/demo/PageSetupDialog.py +70 -0
  166. wx/demo/PenAndBrushStyles.py +208 -0
  167. wx/demo/Pickers.py +120 -0
  168. wx/demo/PlateButton.py +430 -0
  169. wx/demo/PopupControl.py +99 -0
  170. wx/demo/PopupMenu.py +156 -0
  171. wx/demo/PopupWindow.py +227 -0
  172. wx/demo/PrintDialog.py +60 -0
  173. wx/demo/PrintFramework.py +227 -0
  174. wx/demo/Process.py +168 -0
  175. wx/demo/ProgressDialog.py +87 -0
  176. wx/demo/PropertyGrid.py +1045 -0
  177. wx/demo/PropertySheetDialog.py +231 -0
  178. wx/demo/PseudoDC.py +350 -0
  179. wx/demo/PyColourChooser.py +60 -0
  180. wx/demo/PyCrust.py +21 -0
  181. wx/demo/PyPlot.py +83 -0
  182. wx/demo/PyShell.py +22 -0
  183. wx/demo/PythonEvents.py +109 -0
  184. wx/demo/README.txt +7 -0
  185. wx/demo/RadioBox.py +67 -0
  186. wx/demo/RadioButton.py +127 -0
  187. wx/demo/RawBitmapAccess.py +208 -0
  188. wx/demo/RearrangeDialog.py +160 -0
  189. wx/demo/RendererNative.py +170 -0
  190. wx/demo/ResizeWidget.py +76 -0
  191. wx/demo/RichMessageDialog.py +85 -0
  192. wx/demo/RichTextCtrl.py +732 -0
  193. wx/demo/RichToolTip.py +145 -0
  194. wx/demo/SVGImage_Bitmap.py +130 -0
  195. wx/demo/SVGImage_Render.py +138 -0
  196. wx/demo/SashWindow.py +151 -0
  197. wx/demo/ScrolledMessageDialog.py +52 -0
  198. wx/demo/ScrolledPanel.py +124 -0
  199. wx/demo/ScrolledWindow.py +260 -0
  200. wx/demo/SearchCtrl.py +115 -0
  201. wx/demo/ShapedWindow.py +145 -0
  202. wx/demo/Simplebook.py +202 -0
  203. wx/demo/SingleChoiceDialog.py +56 -0
  204. wx/demo/SizedControls.py +433 -0
  205. wx/demo/Sizers.py +609 -0
  206. wx/demo/Slider.py +52 -0
  207. wx/demo/Sound.py +95 -0
  208. wx/demo/SpinButton.py +63 -0
  209. wx/demo/SpinCtrl.py +56 -0
  210. wx/demo/SpinCtrlDouble.py +42 -0
  211. wx/demo/SplitTree.py +146 -0
  212. wx/demo/SplitterWindow.py +62 -0
  213. wx/demo/StandardPaths.py +113 -0
  214. wx/demo/StaticBitmap.py +55 -0
  215. wx/demo/StaticBox.py +62 -0
  216. wx/demo/StaticText.py +69 -0
  217. wx/demo/StatusBar.py +144 -0
  218. wx/demo/StockButtons.py +113 -0
  219. wx/demo/StyledTextCtrl_1.py +303 -0
  220. wx/demo/StyledTextCtrl_2.py +410 -0
  221. wx/demo/SystemSettings.py +333 -0
  222. wx/demo/TablePrint.py +215 -0
  223. wx/demo/TestTable.txt +38 -0
  224. wx/demo/TextCtrl.py +187 -0
  225. wx/demo/TextEntryDialog.py +57 -0
  226. wx/demo/Threads.py +258 -0
  227. wx/demo/Throbber.py +250 -0
  228. wx/demo/Ticker.py +147 -0
  229. wx/demo/TimeCtrl.py +240 -0
  230. wx/demo/TimePickerCtrl.py +60 -0
  231. wx/demo/Timer.py +275 -0
  232. wx/demo/ToggleButton.py +54 -0
  233. wx/demo/ToolBar.py +249 -0
  234. wx/demo/ToolTip.py +71 -0
  235. wx/demo/Toolbook.py +111 -0
  236. wx/demo/TreeCtrl.py +199 -0
  237. wx/demo/TreeListCtrl.py +121 -0
  238. wx/demo/TreeMixin.py +269 -0
  239. wx/demo/Treebook.py +117 -0
  240. wx/demo/UIActionSimulator.py +151 -0
  241. wx/demo/URLDragAndDrop.py +130 -0
  242. wx/demo/Unicode.py +146 -0
  243. wx/demo/VListBox.py +176 -0
  244. wx/demo/Validator.py +237 -0
  245. wx/demo/Wizard.py +248 -0
  246. wx/demo/WrapSizer.py +115 -0
  247. wx/demo/XmlResource.py +80 -0
  248. wx/demo/XmlResourceHandler.py +199 -0
  249. wx/demo/XmlResourceSubclass.py +119 -0
  250. wx/demo/__init__.py +9 -0
  251. wx/demo/agw/AGWInfoBar.py +175 -0
  252. wx/demo/agw/AUI.py +3058 -0
  253. wx/demo/agw/AdvancedSplash.py +59 -0
  254. wx/demo/agw/AquaButton.py +146 -0
  255. wx/demo/agw/BalloonTip.py +378 -0
  256. wx/demo/agw/ButtonPanel.py +890 -0
  257. wx/demo/agw/CubeColourDialog.py +83 -0
  258. wx/demo/agw/CustomTreeCtrl.py +2167 -0
  259. wx/demo/agw/Example1 +67 -0
  260. wx/demo/agw/Example2 +49 -0
  261. wx/demo/agw/FlatMenu.py +876 -0
  262. wx/demo/agw/FlatNotebook.py +994 -0
  263. wx/demo/agw/FloatSpin.py +475 -0
  264. wx/demo/agw/FoldPanelBar.py +953 -0
  265. wx/demo/agw/FourWaySplitter.py +300 -0
  266. wx/demo/agw/GenericMessageDialog.py +207 -0
  267. wx/demo/agw/GradientButton.py +156 -0
  268. wx/demo/agw/HyperLinkCtrl.py +144 -0
  269. wx/demo/agw/HyperTreeList.py +2660 -0
  270. wx/demo/agw/KnobCtrl.py +186 -0
  271. wx/demo/agw/LabelBook.py +567 -0
  272. wx/demo/agw/MacLargeDemo.py +360 -0
  273. wx/demo/agw/MultiDirDialog.py +117 -0
  274. wx/demo/agw/PeakMeter.py +194 -0
  275. wx/demo/agw/PersistentControls.py +589 -0
  276. wx/demo/agw/PieCtrl.py +206 -0
  277. wx/demo/agw/PyBusyInfo.py +64 -0
  278. wx/demo/agw/PyCollapsiblePane.py +308 -0
  279. wx/demo/agw/PyGauge.py +162 -0
  280. wx/demo/agw/PyProgress.py +155 -0
  281. wx/demo/agw/RibbonBar.py +925 -0
  282. wx/demo/agw/RulerCtrl.py +454 -0
  283. wx/demo/agw/ScrolledThumbnail.py +128 -0
  284. wx/demo/agw/ShapedButton.py +603 -0
  285. wx/demo/agw/ShortcutEditor.py +397 -0
  286. wx/demo/agw/SpeedMeter.py +668 -0
  287. wx/demo/agw/SuperToolTip.py +396 -0
  288. wx/demo/agw/ThumbDemoConfig.py +603 -0
  289. wx/demo/agw/ThumbnailCtrl.py +149 -0
  290. wx/demo/agw/ToasterBox.py +410 -0
  291. wx/demo/agw/UltimateListCtrl.py +80 -0
  292. wx/demo/agw/UltimateListIconDemo.py +908 -0
  293. wx/demo/agw/UltimateListListDemo.py +124 -0
  294. wx/demo/agw/UltimateReportDemo.py +1146 -0
  295. wx/demo/agw/UltimateVirtualDemo.py +207 -0
  296. wx/demo/agw/Windows7Explorer_Contents.py +368 -0
  297. wx/demo/agw/XLSGrid.py +238 -0
  298. wx/demo/agw/ZoomBar.py +230 -0
  299. wx/demo/agw/__demo__.py +183 -0
  300. wx/demo/agw/bitmaps/Explorer96.png +0 -0
  301. wx/demo/agw/bitmaps/Explorer96Flip40.png +0 -0
  302. wx/demo/agw/bitmaps/Folder96.png +0 -0
  303. wx/demo/agw/bitmaps/Folder96Flip40.png +0 -0
  304. wx/demo/agw/bitmaps/Monitor96.png +0 -0
  305. wx/demo/agw/bitmaps/Monitor96Flip40.png +0 -0
  306. wx/demo/agw/bitmaps/Music96.png +0 -0
  307. wx/demo/agw/bitmaps/Music96Flip40.png +0 -0
  308. wx/demo/agw/bitmaps/Photo96.png +0 -0
  309. wx/demo/agw/bitmaps/Photo96Flip40.png +0 -0
  310. wx/demo/agw/bitmaps/Search96.png +0 -0
  311. wx/demo/agw/bitmaps/Search96Flip40.png +0 -0
  312. wx/demo/agw/bitmaps/Wizard96.png +0 -0
  313. wx/demo/agw/bitmaps/Wizard96Flip40.png +0 -0
  314. wx/demo/agw/bitmaps/advancedsplash.png +0 -0
  315. wx/demo/agw/bitmaps/aquabutton.png +0 -0
  316. wx/demo/agw/bitmaps/aquachecked.ico +0 -0
  317. wx/demo/agw/bitmaps/aquaflagged.ico +0 -0
  318. wx/demo/agw/bitmaps/aquanotchecked.ico +0 -0
  319. wx/demo/agw/bitmaps/aquanotflagged.ico +0 -0
  320. wx/demo/agw/bitmaps/canada.gif +0 -0
  321. wx/demo/agw/bitmaps/checked.ico +0 -0
  322. wx/demo/agw/bitmaps/columns.png +0 -0
  323. wx/demo/agw/bitmaps/contexthelp-16.png +0 -0
  324. wx/demo/agw/bitmaps/contexthelp.png +0 -0
  325. wx/demo/agw/bitmaps/copy.png +0 -0
  326. wx/demo/agw/bitmaps/cut.png +0 -0
  327. wx/demo/agw/bitmaps/editcopy.png +0 -0
  328. wx/demo/agw/bitmaps/editcut.png +0 -0
  329. wx/demo/agw/bitmaps/editpaste.png +0 -0
  330. wx/demo/agw/bitmaps/empty_icon.png +0 -0
  331. wx/demo/agw/bitmaps/exit-16.png +0 -0
  332. wx/demo/agw/bitmaps/exit.ico +0 -0
  333. wx/demo/agw/bitmaps/ffwd.png +0 -0
  334. wx/demo/agw/bitmaps/ffwddisabled.png +0 -0
  335. wx/demo/agw/bitmaps/field-16.png +0 -0
  336. wx/demo/agw/bitmaps/filenew.png +0 -0
  337. wx/demo/agw/bitmaps/fileopen.png +0 -0
  338. wx/demo/agw/bitmaps/filesave.png +0 -0
  339. wx/demo/agw/bitmaps/flagged.ico +0 -0
  340. wx/demo/agw/bitmaps/folder.png +0 -0
  341. wx/demo/agw/bitmaps/folder_new.png +0 -0
  342. wx/demo/agw/bitmaps/ghost.png +0 -0
  343. wx/demo/agw/bitmaps/gradientbutton.png +0 -0
  344. wx/demo/agw/bitmaps/help-16.png +0 -0
  345. wx/demo/agw/bitmaps/help.ico +0 -0
  346. wx/demo/agw/bitmaps/italy.gif +0 -0
  347. wx/demo/agw/bitmaps/lbadd.png +0 -0
  348. wx/demo/agw/bitmaps/lbcharge.png +0 -0
  349. wx/demo/agw/bitmaps/lbdecrypted.png +0 -0
  350. wx/demo/agw/bitmaps/lbnews.png +0 -0
  351. wx/demo/agw/bitmaps/lbroll.png +0 -0
  352. wx/demo/agw/bitmaps/minus1.ico +0 -0
  353. wx/demo/agw/bitmaps/minus2.ico +0 -0
  354. wx/demo/agw/bitmaps/minus3.ico +0 -0
  355. wx/demo/agw/bitmaps/minus4.ico +0 -0
  356. wx/demo/agw/bitmaps/minus5.ico +0 -0
  357. wx/demo/agw/bitmaps/month-16.png +0 -0
  358. wx/demo/agw/bitmaps/new_file.png +0 -0
  359. wx/demo/agw/bitmaps/new_folder.png +0 -0
  360. wx/demo/agw/bitmaps/notchecked.ico +0 -0
  361. wx/demo/agw/bitmaps/notflagged.ico +0 -0
  362. wx/demo/agw/bitmaps/ok-16.png +0 -0
  363. wx/demo/agw/bitmaps/open_folder.png +0 -0
  364. wx/demo/agw/bitmaps/paste.png +0 -0
  365. wx/demo/agw/bitmaps/pause.png +0 -0
  366. wx/demo/agw/bitmaps/pausedisabled.png +0 -0
  367. wx/demo/agw/bitmaps/play.png +0 -0
  368. wx/demo/agw/bitmaps/playdisabled.png +0 -0
  369. wx/demo/agw/bitmaps/plus1.ico +0 -0
  370. wx/demo/agw/bitmaps/plus2.ico +0 -0
  371. wx/demo/agw/bitmaps/plus3.ico +0 -0
  372. wx/demo/agw/bitmaps/plus4.ico +0 -0
  373. wx/demo/agw/bitmaps/plus5.ico +0 -0
  374. wx/demo/agw/bitmaps/record.png +0 -0
  375. wx/demo/agw/bitmaps/recorddisabled.png +0 -0
  376. wx/demo/agw/bitmaps/recording.gif +0 -0
  377. wx/demo/agw/bitmaps/rewind.png +0 -0
  378. wx/demo/agw/bitmaps/rewinddisabled.png +0 -0
  379. wx/demo/agw/bitmaps/round.png +0 -0
  380. wx/demo/agw/bitmaps/save.png +0 -0
  381. wx/demo/agw/bitmaps/separator.gif +0 -0
  382. wx/demo/agw/bitmaps/separatorflip.png +0 -0
  383. wx/demo/agw/bitmaps/smfuel.ico +0 -0
  384. wx/demo/agw/bitmaps/smpi.ico +0 -0
  385. wx/demo/agw/bitmaps/smtemp.ico +0 -0
  386. wx/demo/agw/bitmaps/stop.png +0 -0
  387. wx/demo/agw/bitmaps/stopdisabled.png +0 -0
  388. wx/demo/agw/bitmaps/sttbutton.png +0 -0
  389. wx/demo/agw/bitmaps/sttfont.png +0 -0
  390. wx/demo/agw/bitmaps/sttheader.png +0 -0
  391. wx/demo/agw/bitmaps/stthelp.png +0 -0
  392. wx/demo/agw/bitmaps/view1.png +0 -0
  393. wx/demo/agw/bitmaps/view2.png +0 -0
  394. wx/demo/agw/bitmaps/view_choose.png +0 -0
  395. wx/demo/agw/bitmaps/view_detailed.png +0 -0
  396. wx/demo/agw/bitmaps/view_icon.png +0 -0
  397. wx/demo/agw/bitmaps/view_multicolumn.png +0 -0
  398. wx/demo/agw/bitmaps/viewmag-16.png +0 -0
  399. wx/demo/agw/bitmaps/viewmag-m-16.png +0 -0
  400. wx/demo/agw/bitmaps/viewmag-p-16.png +0 -0
  401. wx/demo/agw/bitmaps/viewmagfit-16.png +0 -0
  402. wx/demo/agw/data/Example_1.xls +0 -0
  403. wx/demo/agw/images.py +6714 -0
  404. wx/demo/bitmaps/AG00028_.gif +0 -0
  405. wx/demo/bitmaps/AG00039_.gif +0 -0
  406. wx/demo/bitmaps/AG00178_.gif +0 -0
  407. wx/demo/bitmaps/AG00183_.gif +0 -0
  408. wx/demo/bitmaps/AG00185_.gif +0 -0
  409. wx/demo/bitmaps/BD13656_.gif +0 -0
  410. wx/demo/bitmaps/advancedsplash.png +0 -0
  411. wx/demo/bitmaps/aquabutton.png +0 -0
  412. wx/demo/bitmaps/aquachecked.ico +0 -0
  413. wx/demo/bitmaps/aquaflagged.ico +0 -0
  414. wx/demo/bitmaps/aquanotchecked.ico +0 -0
  415. wx/demo/bitmaps/aquanotflagged.ico +0 -0
  416. wx/demo/bitmaps/canada.gif +0 -0
  417. wx/demo/bitmaps/checked.ico +0 -0
  418. wx/demo/bitmaps/columns.png +0 -0
  419. wx/demo/bitmaps/contexthelp-16.png +0 -0
  420. wx/demo/bitmaps/contexthelp.png +0 -0
  421. wx/demo/bitmaps/copy.png +0 -0
  422. wx/demo/bitmaps/cropshot24x20.png +0 -0
  423. wx/demo/bitmaps/cut.png +0 -0
  424. wx/demo/bitmaps/editcopy.png +0 -0
  425. wx/demo/bitmaps/editcut.png +0 -0
  426. wx/demo/bitmaps/editpaste.png +0 -0
  427. wx/demo/bitmaps/exit-16.png +0 -0
  428. wx/demo/bitmaps/exit.ico +0 -0
  429. wx/demo/bitmaps/ffwd.png +0 -0
  430. wx/demo/bitmaps/ffwddisabled.png +0 -0
  431. wx/demo/bitmaps/field-16.png +0 -0
  432. wx/demo/bitmaps/filenew.png +0 -0
  433. wx/demo/bitmaps/fileopen.png +0 -0
  434. wx/demo/bitmaps/filesave.png +0 -0
  435. wx/demo/bitmaps/flagged.ico +0 -0
  436. wx/demo/bitmaps/folder_new.png +0 -0
  437. wx/demo/bitmaps/ghost.png +0 -0
  438. wx/demo/bitmaps/gradientbutton.png +0 -0
  439. wx/demo/bitmaps/help-16.png +0 -0
  440. wx/demo/bitmaps/help.ico +0 -0
  441. wx/demo/bitmaps/honeycomb300.png +0 -0
  442. wx/demo/bitmaps/image.bmp +0 -0
  443. wx/demo/bitmaps/image.gif +0 -0
  444. wx/demo/bitmaps/image.ico +0 -0
  445. wx/demo/bitmaps/image.jpg +0 -0
  446. wx/demo/bitmaps/image.png +0 -0
  447. wx/demo/bitmaps/image.tif +0 -0
  448. wx/demo/bitmaps/italy.gif +0 -0
  449. wx/demo/bitmaps/lbadd.png +0 -0
  450. wx/demo/bitmaps/lbcharge.png +0 -0
  451. wx/demo/bitmaps/lbdecrypted.png +0 -0
  452. wx/demo/bitmaps/lbnews.png +0 -0
  453. wx/demo/bitmaps/lbroll.png +0 -0
  454. wx/demo/bitmaps/minus1.ico +0 -0
  455. wx/demo/bitmaps/minus2.ico +0 -0
  456. wx/demo/bitmaps/minus3.ico +0 -0
  457. wx/demo/bitmaps/minus4.ico +0 -0
  458. wx/demo/bitmaps/minus5.ico +0 -0
  459. wx/demo/bitmaps/month-16.png +0 -0
  460. wx/demo/bitmaps/new_file.png +0 -0
  461. wx/demo/bitmaps/new_folder.png +0 -0
  462. wx/demo/bitmaps/notchecked.ico +0 -0
  463. wx/demo/bitmaps/notflagged.ico +0 -0
  464. wx/demo/bitmaps/ok-16.png +0 -0
  465. wx/demo/bitmaps/open_folder.png +0 -0
  466. wx/demo/bitmaps/paste.png +0 -0
  467. wx/demo/bitmaps/pause.png +0 -0
  468. wx/demo/bitmaps/pausedisabled.png +0 -0
  469. wx/demo/bitmaps/phoenix_title.png +0 -0
  470. wx/demo/bitmaps/phoenix_top.png +0 -0
  471. wx/demo/bitmaps/play.png +0 -0
  472. wx/demo/bitmaps/playdisabled.png +0 -0
  473. wx/demo/bitmaps/plus1.ico +0 -0
  474. wx/demo/bitmaps/plus2.ico +0 -0
  475. wx/demo/bitmaps/plus3.ico +0 -0
  476. wx/demo/bitmaps/plus4.ico +0 -0
  477. wx/demo/bitmaps/plus5.ico +0 -0
  478. wx/demo/bitmaps/record.png +0 -0
  479. wx/demo/bitmaps/recorddisabled.png +0 -0
  480. wx/demo/bitmaps/rewind.png +0 -0
  481. wx/demo/bitmaps/rewinddisabled.png +0 -0
  482. wx/demo/bitmaps/round.png +0 -0
  483. wx/demo/bitmaps/save.png +0 -0
  484. wx/demo/bitmaps/smfuel.ico +0 -0
  485. wx/demo/bitmaps/smpi.ico +0 -0
  486. wx/demo/bitmaps/smtemp.ico +0 -0
  487. wx/demo/bitmaps/snakey_render.png +0 -0
  488. wx/demo/bitmaps/splash.png +0 -0
  489. wx/demo/bitmaps/stop.png +0 -0
  490. wx/demo/bitmaps/stopdisabled.png +0 -0
  491. wx/demo/bitmaps/sttbutton.png +0 -0
  492. wx/demo/bitmaps/sttfont.png +0 -0
  493. wx/demo/bitmaps/sttheader.png +0 -0
  494. wx/demo/bitmaps/stthelp.png +0 -0
  495. wx/demo/bitmaps/toucan.png +0 -0
  496. wx/demo/bitmaps/view1.png +0 -0
  497. wx/demo/bitmaps/view2.png +0 -0
  498. wx/demo/bitmaps/view_choose.png +0 -0
  499. wx/demo/bitmaps/view_detailed.png +0 -0
  500. wx/demo/bitmaps/view_icon.png +0 -0
  501. wx/demo/bitmaps/view_multicolumn.png +0 -0
  502. wx/demo/bitmaps/viewmag-16.png +0 -0
  503. wx/demo/bitmaps/viewmag-m-16.png +0 -0
  504. wx/demo/bitmaps/viewmag-p-16.png +0 -0
  505. wx/demo/bitmaps/viewmagfit-16.png +0 -0
  506. wx/demo/bmp_source/001.png +0 -0
  507. wx/demo/bmp_source/002.png +0 -0
  508. wx/demo/bmp_source/003.png +0 -0
  509. wx/demo/bmp_source/004.png +0 -0
  510. wx/demo/bmp_source/005.png +0 -0
  511. wx/demo/bmp_source/006.png +0 -0
  512. wx/demo/bmp_source/007.png +0 -0
  513. wx/demo/bmp_source/008.png +0 -0
  514. wx/demo/bmp_source/009.png +0 -0
  515. wx/demo/bmp_source/010.png +0 -0
  516. wx/demo/bmp_source/011.png +0 -0
  517. wx/demo/bmp_source/012.png +0 -0
  518. wx/demo/bmp_source/013.png +0 -0
  519. wx/demo/bmp_source/014.png +0 -0
  520. wx/demo/bmp_source/015.png +0 -0
  521. wx/demo/bmp_source/016.png +0 -0
  522. wx/demo/bmp_source/017.png +0 -0
  523. wx/demo/bmp_source/018.png +0 -0
  524. wx/demo/bmp_source/019.png +0 -0
  525. wx/demo/bmp_source/020.png +0 -0
  526. wx/demo/bmp_source/021.png +0 -0
  527. wx/demo/bmp_source/022.png +0 -0
  528. wx/demo/bmp_source/023.png +0 -0
  529. wx/demo/bmp_source/024.png +0 -0
  530. wx/demo/bmp_source/025.png +0 -0
  531. wx/demo/bmp_source/026.png +0 -0
  532. wx/demo/bmp_source/027.png +0 -0
  533. wx/demo/bmp_source/028.png +0 -0
  534. wx/demo/bmp_source/029.png +0 -0
  535. wx/demo/bmp_source/030.png +0 -0
  536. wx/demo/bmp_source/DbDec.bmp +0 -0
  537. wx/demo/bmp_source/DbInc.bmp +0 -0
  538. wx/demo/bmp_source/Dec.bmp +0 -0
  539. wx/demo/bmp_source/FRM_0.png +0 -0
  540. wx/demo/bmp_source/FRM_1.png +0 -0
  541. wx/demo/bmp_source/FRM_2.png +0 -0
  542. wx/demo/bmp_source/FRM_3.png +0 -0
  543. wx/demo/bmp_source/FRM_4.png +0 -0
  544. wx/demo/bmp_source/FRM_5.png +0 -0
  545. wx/demo/bmp_source/FRM_6.png +0 -0
  546. wx/demo/bmp_source/FRM_7.png +0 -0
  547. wx/demo/bmp_source/FRM_8.png +0 -0
  548. wx/demo/bmp_source/GridBG.gif +0 -0
  549. wx/demo/bmp_source/Inc.bmp +0 -0
  550. wx/demo/bmp_source/LB01.png +0 -0
  551. wx/demo/bmp_source/LB02.png +0 -0
  552. wx/demo/bmp_source/LB03.png +0 -0
  553. wx/demo/bmp_source/LB04.png +0 -0
  554. wx/demo/bmp_source/LB05.png +0 -0
  555. wx/demo/bmp_source/LB06.png +0 -0
  556. wx/demo/bmp_source/LB07.png +0 -0
  557. wx/demo/bmp_source/LB08.png +0 -0
  558. wx/demo/bmp_source/LB09.png +0 -0
  559. wx/demo/bmp_source/LB10.png +0 -0
  560. wx/demo/bmp_source/LB11.png +0 -0
  561. wx/demo/bmp_source/LB12.png +0 -0
  562. wx/demo/bmp_source/Pt.bmp +0 -0
  563. wx/demo/bmp_source/Vippi.png +0 -0
  564. wx/demo/bmp_source/backgrnd.png +0 -0
  565. wx/demo/bmp_source/book.png +0 -0
  566. wx/demo/bmp_source/book_blue.png +0 -0
  567. wx/demo/bmp_source/book_green.png +0 -0
  568. wx/demo/bmp_source/book_red.png +0 -0
  569. wx/demo/bmp_source/bp_btn1.png +0 -0
  570. wx/demo/bmp_source/bp_btn2.png +0 -0
  571. wx/demo/bmp_source/bp_btn3.png +0 -0
  572. wx/demo/bmp_source/bp_btn4.png +0 -0
  573. wx/demo/bmp_source/bulb1.bmp +0 -0
  574. wx/demo/bmp_source/bulb2.bmp +0 -0
  575. wx/demo/bmp_source/carrot.png +0 -0
  576. wx/demo/bmp_source/clipboard.png +0 -0
  577. wx/demo/bmp_source/code.png +0 -0
  578. wx/demo/bmp_source/core.png +0 -0
  579. wx/demo/bmp_source/custom.png +0 -0
  580. wx/demo/bmp_source/customcontrol.png +0 -0
  581. wx/demo/bmp_source/deletedocs.png +0 -0
  582. wx/demo/bmp_source/deleteperspective.png +0 -0
  583. wx/demo/bmp_source/demo.png +0 -0
  584. wx/demo/bmp_source/dialog.png +0 -0
  585. wx/demo/bmp_source/exit.png +0 -0
  586. wx/demo/bmp_source/expansion.png +0 -0
  587. wx/demo/bmp_source/find.png +0 -0
  588. wx/demo/bmp_source/findnext.png +0 -0
  589. wx/demo/bmp_source/floatcanvas.png +0 -0
  590. wx/demo/bmp_source/frame.png +0 -0
  591. wx/demo/bmp_source/images.png +0 -0
  592. wx/demo/bmp_source/inspect.png +0 -0
  593. wx/demo/bmp_source/layout.png +0 -0
  594. wx/demo/bmp_source/logo.png +0 -0
  595. wx/demo/bmp_source/miscellaneous.png +0 -0
  596. wx/demo/bmp_source/modifiedexists.png +0 -0
  597. wx/demo/bmp_source/mondrian.ico +0 -0
  598. wx/demo/bmp_source/morecontrols.png +0 -0
  599. wx/demo/bmp_source/moredialog.png +0 -0
  600. wx/demo/bmp_source/noicon.png +0 -0
  601. wx/demo/bmp_source/overview.png +0 -0
  602. wx/demo/bmp_source/pencil.png +0 -0
  603. wx/demo/bmp_source/pointy.png +0 -0
  604. wx/demo/bmp_source/process.png +0 -0
  605. wx/demo/bmp_source/pyshell.png +0 -0
  606. wx/demo/bmp_source/recent.png +0 -0
  607. wx/demo/bmp_source/rest.png +0 -0
  608. wx/demo/bmp_source/robin.jpg +0 -0
  609. wx/demo/bmp_source/rt_alignleft.xpm +24 -0
  610. wx/demo/bmp_source/rt_alignright.xpm +24 -0
  611. wx/demo/bmp_source/rt_bold.xpm +24 -0
  612. wx/demo/bmp_source/rt_centre.xpm +24 -0
  613. wx/demo/bmp_source/rt_colour.xpm +59 -0
  614. wx/demo/bmp_source/rt_copy.xpm +44 -0
  615. wx/demo/bmp_source/rt_cut.xpm +46 -0
  616. wx/demo/bmp_source/rt_font.xpm +25 -0
  617. wx/demo/bmp_source/rt_idea.xpm +47 -0
  618. wx/demo/bmp_source/rt_indentless.xpm +25 -0
  619. wx/demo/bmp_source/rt_indentmore.xpm +25 -0
  620. wx/demo/bmp_source/rt_italic.xpm +25 -0
  621. wx/demo/bmp_source/rt_open.xpm +57 -0
  622. wx/demo/bmp_source/rt_paste.xpm +46 -0
  623. wx/demo/bmp_source/rt_redo.xpm +58 -0
  624. wx/demo/bmp_source/rt_sample.xpm +44 -0
  625. wx/demo/bmp_source/rt_save.xpm +42 -0
  626. wx/demo/bmp_source/rt_smiley.xpm +42 -0
  627. wx/demo/bmp_source/rt_underline.xpm +25 -0
  628. wx/demo/bmp_source/rt_undo.xpm +58 -0
  629. wx/demo/bmp_source/rt_zebra.xpm +409 -0
  630. wx/demo/bmp_source/saveperspective.png +0 -0
  631. wx/demo/bmp_source/sm_down.bmp +0 -0
  632. wx/demo/bmp_source/sm_up.bmp +0 -0
  633. wx/demo/bmp_source/smiles2.bmp +0 -0
  634. wx/demo/bmp_source/test2.bmp +0 -0
  635. wx/demo/bmp_source/testmask.bmp +0 -0
  636. wx/demo/bmp_source/teststar.png +0 -0
  637. wx/demo/bmp_source/thekid.png +0 -0
  638. wx/demo/bmp_source/tog1.bmp +0 -0
  639. wx/demo/bmp_source/tog2.bmp +0 -0
  640. wx/demo/bmp_source/wiztest1.bmp +0 -0
  641. wx/demo/bmp_source/wiztest2.bmp +0 -0
  642. wx/demo/bmp_source/wxpdemo.ico +0 -0
  643. wx/demo/cursors/paperairplane_arrow_blue.cur +0 -0
  644. wx/demo/cursors/paperairplane_arrow_blue_fadeout80.cur +0 -0
  645. wx/demo/cursors/paperairplane_arrow_colorshift.ani +0 -0
  646. wx/demo/cursors/paperairplane_arrow_dark.cur +0 -0
  647. wx/demo/cursors/paperairplane_arrow_grey.cur +0 -0
  648. wx/demo/cursors/paperairplane_arrow_red.cur +0 -0
  649. wx/demo/cursors/paperairplane_arrow_white.cur +0 -0
  650. wx/demo/cursors/paperairplane_arrow_white24.png +0 -0
  651. wx/demo/data/0-tiger.svg +725 -0
  652. wx/demo/data/Asteroid_blaster.swf +0 -0
  653. wx/demo/data/SIL_OPEN_FONT_LICENSE.txt +97 -0
  654. wx/demo/data/SourceCodePro-Regular.ttf +0 -0
  655. wx/demo/data/accessories-calculator.svg +636 -0
  656. wx/demo/data/accessories-text-editor.svg +554 -0
  657. wx/demo/data/anykey.wav +0 -0
  658. wx/demo/data/applications-internet.svg +623 -0
  659. wx/demo/data/desktop-accessibility.svg +245 -0
  660. wx/demo/data/desktop-keyboard-shortcuts.svg +839 -0
  661. wx/demo/data/desktop-locale.svg +878 -0
  662. wx/demo/data/desktop-remote-desktop.svg +1479 -0
  663. wx/demo/data/desktop-theme.svg +882 -0
  664. wx/demo/data/desktop-wallpaper.svg +747 -0
  665. wx/demo/data/echo.py +25 -0
  666. wx/demo/data/imagemap.htm +20 -0
  667. wx/demo/data/imagemap.png +0 -0
  668. wx/demo/data/internet-group-chat.svg +312 -0
  669. wx/demo/data/internet-mail.svg +440 -0
  670. wx/demo/data/locale/af/LC_MESSAGES/wxpydemo.mo +0 -0
  671. wx/demo/data/locale/de/LC_MESSAGES/wxpydemo.mo +0 -0
  672. wx/demo/data/locale/es/LC_MESSAGES/wxpydemo.mo +0 -0
  673. wx/demo/data/locale/fr/LC_MESSAGES/wxpydemo.mo +0 -0
  674. wx/demo/data/locale/it/LC_MESSAGES/wxpydemo.mo +0 -0
  675. wx/demo/data/locale-src/af.po +23 -0
  676. wx/demo/data/locale-src/de.po +23 -0
  677. wx/demo/data/locale-src/es.po +22 -0
  678. wx/demo/data/locale-src/fr.po +22 -0
  679. wx/demo/data/locale-src/install +15 -0
  680. wx/demo/data/locale-src/it.po +23 -0
  681. wx/demo/data/locale-src/wxpydemo.po +21 -0
  682. wx/demo/data/office-calendar.svg +316 -0
  683. wx/demo/data/pic.png +0 -0
  684. wx/demo/data/pic2.bmp +0 -0
  685. wx/demo/data/plan.wav +0 -0
  686. wx/demo/data/proclamation.txt +115 -0
  687. wx/demo/data/resource.wdr +0 -0
  688. wx/demo/data/resource_wdr.xrc +146 -0
  689. wx/demo/data/romedalen.png +0 -0
  690. wx/demo/data/stc.h.html +3544 -0
  691. wx/demo/data/system-session.svg +510 -0
  692. wx/demo/data/system-users.svg +539 -0
  693. wx/demo/data/tables.htm +116 -0
  694. wx/demo/data/test-gradient-pen.svg +14 -0
  695. wx/demo/data/test-opacity.svg +7 -0
  696. wx/demo/data/test.htm +253 -0
  697. wx/demo/data/testmovie.mpg +0 -0
  698. wx/demo/data/testtable.txt +38 -0
  699. wx/demo/data/tips.txt +73 -0
  700. wx/demo/data/utilities-system-monitor.svg +435 -0
  701. wx/demo/data/utilities-terminal.svg +500 -0
  702. wx/demo/data/widgetTest.htm +70 -0
  703. wx/demo/data/world.dat +24055 -0
  704. wx/demo/demo.py +4 -0
  705. wx/demo/demo.pyw +4 -0
  706. wx/demo/demodata.py +310 -0
  707. wx/demo/encode_bitmaps.py +181 -0
  708. wx/demo/images.py +6812 -0
  709. wx/demo/infoframe.py +149 -0
  710. wx/demo/run.py +171 -0
  711. wx/demo/snippets/__init__.py +13 -0
  712. wx/demo/snippets/arc.py +21 -0
  713. wx/demo/snippets/arc_negative.py +21 -0
  714. wx/demo/snippets/clip.py +13 -0
  715. wx/demo/snippets/clip_image.py +13 -0
  716. wx/demo/snippets/curve_rectangle.py +53 -0
  717. wx/demo/snippets/curve_to.py +17 -0
  718. wx/demo/snippets/dash.py +18 -0
  719. wx/demo/snippets/ellipse.py +33 -0
  720. wx/demo/snippets/fill_and_stroke.py +12 -0
  721. wx/demo/snippets/fill_and_stroke2.py +18 -0
  722. wx/demo/snippets/fill_style.py +31 -0
  723. wx/demo/snippets/glyph_path.py +21 -0
  724. wx/demo/snippets/gradient.py +16 -0
  725. wx/demo/snippets/gradient_mask.py +12 -0
  726. wx/demo/snippets/group.py +16 -0
  727. wx/demo/snippets/image.py +14 -0
  728. wx/demo/snippets/imagepattern.py +23 -0
  729. wx/demo/snippets/path.py +7 -0
  730. wx/demo/snippets/set_line_cap.py +19 -0
  731. wx/demo/snippets/set_line_join.py +21 -0
  732. wx/demo/snippets/show_glyphs.py +15 -0
  733. wx/demo/snippets/text.py +22 -0
  734. wx/demo/snippets/text_align_center.py +26 -0
  735. wx/demo/snippets/text_extents.py +27 -0
  736. wx/demo/template.py +36 -0
  737. wx/demo/throbImages.py +1277 -0
  738. wx/demo/version.py +3 -0
  739. wx/demo/widgetTest.py +72 -0
  740. wx/demo/wxpdemo.ico +0 -0
  741. wx/glcanvas.py +10 -0
  742. wx/glcanvas.pyi +458 -0
  743. wx/grid.py +229 -0
  744. wx/grid.pyi +4959 -0
  745. wx/html.py +35 -0
  746. wx/html.pyi +2965 -0
  747. wx/html2.py +40 -0
  748. wx/html2.pyi +772 -0
  749. wx/lib/CDate.py +202 -0
  750. wx/lib/ClickableHtmlWindow.py +57 -0
  751. wx/lib/__init__.py +0 -0
  752. wx/lib/activex.py +178 -0
  753. wx/lib/activexwrapper.py +153 -0
  754. wx/lib/agw/__init__.py +128 -0
  755. wx/lib/agw/advancedsplash.py +564 -0
  756. wx/lib/agw/aquabutton.py +1127 -0
  757. wx/lib/agw/artmanager.py +2110 -0
  758. wx/lib/agw/aui/__init__.py +295 -0
  759. wx/lib/agw/aui/aui_constants.py +2628 -0
  760. wx/lib/agw/aui/aui_switcherdialog.py +1227 -0
  761. wx/lib/agw/aui/aui_utilities.py +672 -0
  762. wx/lib/agw/aui/auibar.py +4031 -0
  763. wx/lib/agw/aui/auibook.py +6289 -0
  764. wx/lib/agw/aui/dockart.py +1198 -0
  765. wx/lib/agw/aui/framemanager.py +10409 -0
  766. wx/lib/agw/aui/tabart.py +2771 -0
  767. wx/lib/agw/aui/tabmdi.py +679 -0
  768. wx/lib/agw/balloontip.py +1158 -0
  769. wx/lib/agw/buttonpanel.py +2823 -0
  770. wx/lib/agw/cubecolourdialog.py +3529 -0
  771. wx/lib/agw/customtreectrl.py +8963 -0
  772. wx/lib/agw/data/ShortcutEditor_1.png +0 -0
  773. wx/lib/agw/data/ShortcutEditor_1_thumb.png +0 -0
  774. wx/lib/agw/data/ShortcutEditor_2.png +0 -0
  775. wx/lib/agw/data/ShortcutEditor_2_thumb.png +0 -0
  776. wx/lib/agw/data/ShortcutEditor_3.png +0 -0
  777. wx/lib/agw/data/ShortcutEditor_3_thumb.png +0 -0
  778. wx/lib/agw/data/ShortcutEditor_4.png +0 -0
  779. wx/lib/agw/data/ShortcutEditor_4_thumb.png +0 -0
  780. wx/lib/agw/data/default_help_text.html +105 -0
  781. wx/lib/agw/flatmenu.py +7333 -0
  782. wx/lib/agw/flatnotebook.py +6672 -0
  783. wx/lib/agw/floatspin.py +1823 -0
  784. wx/lib/agw/fmcustomizedlg.py +540 -0
  785. wx/lib/agw/fmresources.py +407 -0
  786. wx/lib/agw/foldpanelbar.py +2282 -0
  787. wx/lib/agw/fourwaysplitter.py +1130 -0
  788. wx/lib/agw/genericmessagedialog.py +1549 -0
  789. wx/lib/agw/gradientbutton.py +732 -0
  790. wx/lib/agw/hyperlink.py +664 -0
  791. wx/lib/agw/hypertreelist.py +5374 -0
  792. wx/lib/agw/infobar.py +885 -0
  793. wx/lib/agw/knobctrl.py +945 -0
  794. wx/lib/agw/labelbook.py +3029 -0
  795. wx/lib/agw/multidirdialog.py +615 -0
  796. wx/lib/agw/peakmeter.py +1029 -0
  797. wx/lib/agw/persist/__init__.py +188 -0
  798. wx/lib/agw/persist/persist_constants.py +284 -0
  799. wx/lib/agw/persist/persist_handlers.py +2614 -0
  800. wx/lib/agw/persist/persistencemanager.py +864 -0
  801. wx/lib/agw/piectrl.py +1082 -0
  802. wx/lib/agw/pybusyinfo.py +399 -0
  803. wx/lib/agw/pycollapsiblepane.py +940 -0
  804. wx/lib/agw/pygauge.py +570 -0
  805. wx/lib/agw/pyprogress.py +917 -0
  806. wx/lib/agw/ribbon/__init__.py +198 -0
  807. wx/lib/agw/ribbon/art.py +219 -0
  808. wx/lib/agw/ribbon/art_aui.py +1284 -0
  809. wx/lib/agw/ribbon/art_default.py +81 -0
  810. wx/lib/agw/ribbon/art_internal.py +244 -0
  811. wx/lib/agw/ribbon/art_msw.py +2736 -0
  812. wx/lib/agw/ribbon/art_osx.py +52 -0
  813. wx/lib/agw/ribbon/bar.py +1261 -0
  814. wx/lib/agw/ribbon/buttonbar.py +1320 -0
  815. wx/lib/agw/ribbon/control.py +205 -0
  816. wx/lib/agw/ribbon/gallery.py +974 -0
  817. wx/lib/agw/ribbon/page.py +946 -0
  818. wx/lib/agw/ribbon/panel.py +1170 -0
  819. wx/lib/agw/ribbon/toolbar.py +1442 -0
  820. wx/lib/agw/rulerctrl.py +1887 -0
  821. wx/lib/agw/scrolledthumbnail.py +2119 -0
  822. wx/lib/agw/shapedbutton.py +1809 -0
  823. wx/lib/agw/shortcuteditor.py +2634 -0
  824. wx/lib/agw/speedmeter.py +1801 -0
  825. wx/lib/agw/supertooltip.py +1444 -0
  826. wx/lib/agw/thumbnailctrl.py +529 -0
  827. wx/lib/agw/toasterbox.py +1327 -0
  828. wx/lib/agw/ultimatelistctrl.py +13666 -0
  829. wx/lib/agw/xlsgrid.py +2113 -0
  830. wx/lib/agw/zoombar.py +1339 -0
  831. wx/lib/analogclock/__init__.py +140 -0
  832. wx/lib/analogclock/analogclock.py +631 -0
  833. wx/lib/analogclock/helpers.py +991 -0
  834. wx/lib/analogclock/lib_setup/__init__.py +0 -0
  835. wx/lib/analogclock/lib_setup/buttontreectrlpanel.py +297 -0
  836. wx/lib/analogclock/lib_setup/fontselect.py +57 -0
  837. wx/lib/analogclock/setup.py +490 -0
  838. wx/lib/analogclock/styles.py +47 -0
  839. wx/lib/anchors.py +103 -0
  840. wx/lib/art/__init__.py +4 -0
  841. wx/lib/art/flagart.py +1583 -0
  842. wx/lib/art/img2pyartprov.py +56 -0
  843. wx/lib/busy.py +146 -0
  844. wx/lib/buttons.py +1141 -0
  845. wx/lib/calendar.py +1597 -0
  846. wx/lib/checkbox.py +837 -0
  847. wx/lib/colourchooser/__init__.py +38 -0
  848. wx/lib/colourchooser/canvas.py +145 -0
  849. wx/lib/colourchooser/intl.py +24 -0
  850. wx/lib/colourchooser/pycolourbox.py +89 -0
  851. wx/lib/colourchooser/pycolourchooser.py +629 -0
  852. wx/lib/colourchooser/pycolourslider.py +100 -0
  853. wx/lib/colourchooser/pypalette.py +211 -0
  854. wx/lib/colourdb.py +740 -0
  855. wx/lib/colourselect.py +385 -0
  856. wx/lib/colourutils.py +118 -0
  857. wx/lib/combotreebox.py +944 -0
  858. wx/lib/delayedresult.py +420 -0
  859. wx/lib/dialogs.py +510 -0
  860. wx/lib/docview.py +3210 -0
  861. wx/lib/dragscroller.py +79 -0
  862. wx/lib/editor/README.txt +77 -0
  863. wx/lib/editor/__init__.py +24 -0
  864. wx/lib/editor/editor.py +974 -0
  865. wx/lib/editor/images.py +15 -0
  866. wx/lib/editor/selection.py +44 -0
  867. wx/lib/embeddedimage.py +76 -0
  868. wx/lib/eventStack.py +136 -0
  869. wx/lib/eventwatcher.py +440 -0
  870. wx/lib/evtmgr.py +521 -0
  871. wx/lib/expando.py +393 -0
  872. wx/lib/fancytext.py +505 -0
  873. wx/lib/filebrowsebutton.py +459 -0
  874. wx/lib/flashwin.py +262 -0
  875. wx/lib/flashwin_old.py +651 -0
  876. wx/lib/floatcanvas/FCEvents.py +53 -0
  877. wx/lib/floatcanvas/FCObjects.py +2923 -0
  878. wx/lib/floatcanvas/FloatCanvas.py +1027 -0
  879. wx/lib/floatcanvas/GUIMode.py +396 -0
  880. wx/lib/floatcanvas/NavCanvas.py +161 -0
  881. wx/lib/floatcanvas/Resources.py +319 -0
  882. wx/lib/floatcanvas/ScreenShot.py +1788 -0
  883. wx/lib/floatcanvas/Utilities/BBox.py +314 -0
  884. wx/lib/floatcanvas/Utilities/Colors.py +137 -0
  885. wx/lib/floatcanvas/Utilities/GUI.py +91 -0
  886. wx/lib/floatcanvas/Utilities/__init__.py +7 -0
  887. wx/lib/floatcanvas/__init__.py +124 -0
  888. wx/lib/foldmenu.py +89 -0
  889. wx/lib/gestures.py +310 -0
  890. wx/lib/gizmos/__init__.py +18 -0
  891. wx/lib/gizmos/dynamicsash.py +1202 -0
  892. wx/lib/gizmos/ledctrl.py +300 -0
  893. wx/lib/gizmos/treelistctrl.py +87 -0
  894. wx/lib/graphics.py +1939 -0
  895. wx/lib/gridmovers.py +511 -0
  896. wx/lib/iewin.py +249 -0
  897. wx/lib/iewin_old.py +894 -0
  898. wx/lib/imagebrowser.py +856 -0
  899. wx/lib/imageutils.py +163 -0
  900. wx/lib/infoframe.py +490 -0
  901. wx/lib/inspection.py +1255 -0
  902. wx/lib/intctrl.py +1001 -0
  903. wx/lib/itemspicker.py +256 -0
  904. wx/lib/langlistctrl.py +480 -0
  905. wx/lib/layoutf.py +271 -0
  906. wx/lib/masked/__init__.py +27 -0
  907. wx/lib/masked/combobox.py +839 -0
  908. wx/lib/masked/ctrl.py +108 -0
  909. wx/lib/masked/ipaddrctrl.py +242 -0
  910. wx/lib/masked/maskededit.py +7279 -0
  911. wx/lib/masked/numctrl.py +2001 -0
  912. wx/lib/masked/textctrl.py +465 -0
  913. wx/lib/masked/timectrl.py +1466 -0
  914. wx/lib/mixins/__init__.py +17 -0
  915. wx/lib/mixins/grid.py +47 -0
  916. wx/lib/mixins/gridlabelrenderer.py +251 -0
  917. wx/lib/mixins/imagelist.py +77 -0
  918. wx/lib/mixins/inspection.py +184 -0
  919. wx/lib/mixins/listctrl.py +894 -0
  920. wx/lib/mixins/rubberband.py +404 -0
  921. wx/lib/mixins/treemixin.py +678 -0
  922. wx/lib/msgpanel.py +95 -0
  923. wx/lib/multisash.py +747 -0
  924. wx/lib/myole4ax.idl +178 -0
  925. wx/lib/myole4ax.tlb +0 -0
  926. wx/lib/newevent.py +229 -0
  927. wx/lib/nvdlg.py +156 -0
  928. wx/lib/ogl/__init__.py +13 -0
  929. wx/lib/ogl/basic.py +3991 -0
  930. wx/lib/ogl/bmpshape.py +87 -0
  931. wx/lib/ogl/canvas.py +467 -0
  932. wx/lib/ogl/composit.py +1577 -0
  933. wx/lib/ogl/diagram.py +230 -0
  934. wx/lib/ogl/divided.py +483 -0
  935. wx/lib/ogl/drawn.py +900 -0
  936. wx/lib/ogl/lines.py +1811 -0
  937. wx/lib/ogl/oglmisc.py +608 -0
  938. wx/lib/pdfviewer/__init__.py +113 -0
  939. wx/lib/pdfviewer/bitmaps/ArrowLeft.png +0 -0
  940. wx/lib/pdfviewer/bitmaps/ArrowRight.png +0 -0
  941. wx/lib/pdfviewer/bitmaps/DirectionH.png +0 -0
  942. wx/lib/pdfviewer/bitmaps/DirectionV.png +0 -0
  943. wx/lib/pdfviewer/bitmaps/PlayerFirst.png +0 -0
  944. wx/lib/pdfviewer/bitmaps/PlayerLast.png +0 -0
  945. wx/lib/pdfviewer/bitmaps/PlayerNext.png +0 -0
  946. wx/lib/pdfviewer/bitmaps/PlayerPrev.png +0 -0
  947. wx/lib/pdfviewer/bitmaps/Printer.png +0 -0
  948. wx/lib/pdfviewer/bitmaps/ReadMe.txt +28 -0
  949. wx/lib/pdfviewer/bitmaps/Save.png +0 -0
  950. wx/lib/pdfviewer/bitmaps/ZoomIn.png +0 -0
  951. wx/lib/pdfviewer/bitmaps/ZoomOut.png +0 -0
  952. wx/lib/pdfviewer/bitmaps/encode_bitmaps.py +37 -0
  953. wx/lib/pdfviewer/buttonpanel.py +279 -0
  954. wx/lib/pdfviewer/images.py +240 -0
  955. wx/lib/pdfviewer/viewer.py +1077 -0
  956. wx/lib/pdfwin.py +295 -0
  957. wx/lib/pdfwin_old.py +789 -0
  958. wx/lib/platebtn.py +789 -0
  959. wx/lib/plot/CHANGELOG.md +150 -0
  960. wx/lib/plot/README.md +16 -0
  961. wx/lib/plot/__init__.py +46 -0
  962. wx/lib/plot/__main__.py +5 -0
  963. wx/lib/plot/examples/__init__.py +0 -0
  964. wx/lib/plot/examples/demo.py +1009 -0
  965. wx/lib/plot/examples/simple_example.py +54 -0
  966. wx/lib/plot/plotcanvas.py +2981 -0
  967. wx/lib/plot/polyobjects.py +1525 -0
  968. wx/lib/plot/utils.py +327 -0
  969. wx/lib/popupctl.py +250 -0
  970. wx/lib/printout.py +1157 -0
  971. wx/lib/progressindicator.py +151 -0
  972. wx/lib/pubsub/LICENSE_BSD_Simple.txt +23 -0
  973. wx/lib/pubsub/README_WxPython.txt +22 -0
  974. wx/lib/pubsub/RELEASE_NOTES.txt +71 -0
  975. wx/lib/pubsub/__init__.py +25 -0
  976. wx/lib/pubsub/core/__init__.py +92 -0
  977. wx/lib/pubsub/core/arg1/__init__.py +16 -0
  978. wx/lib/pubsub/core/arg1/listenerimpl.py +97 -0
  979. wx/lib/pubsub/core/arg1/publisher.py +40 -0
  980. wx/lib/pubsub/core/arg1/publishermixin.py +34 -0
  981. wx/lib/pubsub/core/arg1/topicargspecimpl.py +66 -0
  982. wx/lib/pubsub/core/arg1/topicmgrimpl.py +19 -0
  983. wx/lib/pubsub/core/callables.py +191 -0
  984. wx/lib/pubsub/core/imp2.py +63 -0
  985. wx/lib/pubsub/core/itopicdefnprovider.py +0 -0
  986. wx/lib/pubsub/core/kwargs/__init__.py +16 -0
  987. wx/lib/pubsub/core/kwargs/datamsg.py +27 -0
  988. wx/lib/pubsub/core/kwargs/listenerimpl.py +93 -0
  989. wx/lib/pubsub/core/kwargs/publisher.py +77 -0
  990. wx/lib/pubsub/core/kwargs/publishermixin.py +65 -0
  991. wx/lib/pubsub/core/kwargs/topicargspecimpl.py +217 -0
  992. wx/lib/pubsub/core/kwargs/topicmgrimpl.py +13 -0
  993. wx/lib/pubsub/core/listener.py +40 -0
  994. wx/lib/pubsub/core/listenerbase.py +185 -0
  995. wx/lib/pubsub/core/notificationmgr.py +185 -0
  996. wx/lib/pubsub/core/publisherbase.py +191 -0
  997. wx/lib/pubsub/core/topicargspec.py +77 -0
  998. wx/lib/pubsub/core/topicdefnprovider.py +632 -0
  999. wx/lib/pubsub/core/topicexc.py +72 -0
  1000. wx/lib/pubsub/core/topicmgr.py +456 -0
  1001. wx/lib/pubsub/core/topicobj.py +472 -0
  1002. wx/lib/pubsub/core/topictreetraverser.py +143 -0
  1003. wx/lib/pubsub/core/topicutils.py +118 -0
  1004. wx/lib/pubsub/core/treeconfig.py +21 -0
  1005. wx/lib/pubsub/core/validatedefnargs.py +29 -0
  1006. wx/lib/pubsub/core/weakmethod.py +102 -0
  1007. wx/lib/pubsub/policies.py +24 -0
  1008. wx/lib/pubsub/pub.py +199 -0
  1009. wx/lib/pubsub/py2and3.py +608 -0
  1010. wx/lib/pubsub/setuparg1.py +47 -0
  1011. wx/lib/pubsub/setupkwargs.py +29 -0
  1012. wx/lib/pubsub/utils/__init__.py +27 -0
  1013. wx/lib/pubsub/utils/exchandling.py +100 -0
  1014. wx/lib/pubsub/utils/misc.py +100 -0
  1015. wx/lib/pubsub/utils/notification.py +331 -0
  1016. wx/lib/pubsub/utils/topictreeprinter.py +195 -0
  1017. wx/lib/pubsub/utils/xmltopicdefnprovider.py +287 -0
  1018. wx/lib/pydocview.py +3300 -0
  1019. wx/lib/rcsizer.py +229 -0
  1020. wx/lib/resizewidget.py +357 -0
  1021. wx/lib/scrolledpanel.py +225 -0
  1022. wx/lib/sheet.py +350 -0
  1023. wx/lib/sized_controls.py +691 -0
  1024. wx/lib/softwareupdate.py +361 -0
  1025. wx/lib/splitter.py +925 -0
  1026. wx/lib/statbmp.py +199 -0
  1027. wx/lib/stattext.py +322 -0
  1028. wx/lib/throbber.py +425 -0
  1029. wx/lib/ticker.py +295 -0
  1030. wx/lib/ticker_xrc.py +48 -0
  1031. wx/lib/utils.py +89 -0
  1032. wx/lib/wordwrap.py +97 -0
  1033. wx/lib/wxcairo/__init__.py +124 -0
  1034. wx/lib/wxcairo/wx_cairocffi.py +200 -0
  1035. wx/lib/wxcairo/wx_pycairo.py +463 -0
  1036. wx/lib/wxpTag.py +274 -0
  1037. wx/locale/af/LC_MESSAGES/wxstd.mo +0 -0
  1038. wx/locale/an/LC_MESSAGES/wxstd.mo +0 -0
  1039. wx/locale/ar/LC_MESSAGES/wxstd.mo +0 -0
  1040. wx/locale/ca/LC_MESSAGES/wxstd.mo +0 -0
  1041. wx/locale/ca@valencia/LC_MESSAGES/wxstd.mo +0 -0
  1042. wx/locale/cs/LC_MESSAGES/wxstd.mo +0 -0
  1043. wx/locale/da/LC_MESSAGES/wxstd.mo +0 -0
  1044. wx/locale/de/LC_MESSAGES/wxstd.mo +0 -0
  1045. wx/locale/el/LC_MESSAGES/wxstd.mo +0 -0
  1046. wx/locale/es/LC_MESSAGES/wxstd.mo +0 -0
  1047. wx/locale/eu/LC_MESSAGES/wxstd.mo +0 -0
  1048. wx/locale/fa_IR/LC_MESSAGES/wxstd.mo +0 -0
  1049. wx/locale/fi/LC_MESSAGES/wxstd.mo +0 -0
  1050. wx/locale/fr/LC_MESSAGES/wxstd.mo +0 -0
  1051. wx/locale/gl_ES/LC_MESSAGES/wxstd.mo +0 -0
  1052. wx/locale/hi/LC_MESSAGES/wxstd.mo +0 -0
  1053. wx/locale/hr/LC_MESSAGES/wxstd.mo +0 -0
  1054. wx/locale/hu/LC_MESSAGES/wxstd.mo +0 -0
  1055. wx/locale/id/LC_MESSAGES/wxstd.mo +0 -0
  1056. wx/locale/it/LC_MESSAGES/wxstd.mo +0 -0
  1057. wx/locale/ja/LC_MESSAGES/wxstd.mo +0 -0
  1058. wx/locale/ka/LC_MESSAGES/wxstd.mo +0 -0
  1059. wx/locale/ko_KR/LC_MESSAGES/wxstd.mo +0 -0
  1060. wx/locale/lt/LC_MESSAGES/wxstd.mo +0 -0
  1061. wx/locale/lv/LC_MESSAGES/wxstd.mo +0 -0
  1062. wx/locale/ms/LC_MESSAGES/wxstd.mo +0 -0
  1063. wx/locale/nb/LC_MESSAGES/wxstd.mo +0 -0
  1064. wx/locale/ne/LC_MESSAGES/wxstd.mo +0 -0
  1065. wx/locale/nl/LC_MESSAGES/wxstd.mo +0 -0
  1066. wx/locale/pl/LC_MESSAGES/wxstd.mo +0 -0
  1067. wx/locale/pt/LC_MESSAGES/wxstd.mo +0 -0
  1068. wx/locale/pt_BR/LC_MESSAGES/wxstd.mo +0 -0
  1069. wx/locale/ro/LC_MESSAGES/wxstd.mo +0 -0
  1070. wx/locale/ru/LC_MESSAGES/wxstd.mo +0 -0
  1071. wx/locale/sk/LC_MESSAGES/wxstd.mo +0 -0
  1072. wx/locale/sl/LC_MESSAGES/wxstd.mo +0 -0
  1073. wx/locale/sq/LC_MESSAGES/wxstd.mo +0 -0
  1074. wx/locale/sv/LC_MESSAGES/wxstd.mo +0 -0
  1075. wx/locale/ta/LC_MESSAGES/wxstd.mo +0 -0
  1076. wx/locale/tr/LC_MESSAGES/wxstd.mo +0 -0
  1077. wx/locale/uk/LC_MESSAGES/wxstd.mo +0 -0
  1078. wx/locale/vi/LC_MESSAGES/wxstd.mo +0 -0
  1079. wx/locale/zh_CN/LC_MESSAGES/wxstd.mo +0 -0
  1080. wx/locale/zh_TW/LC_MESSAGES/wxstd.mo +0 -0
  1081. wx/media.py +27 -0
  1082. wx/media.pyi +223 -0
  1083. wx/msw.py +13 -0
  1084. wx/msw.pyi +65 -0
  1085. wx/propgrid.py +1451 -0
  1086. wx/propgrid.pyi +7914 -0
  1087. wx/py/CHANGES.txt +796 -0
  1088. wx/py/Py.ico +0 -0
  1089. wx/py/PyAlaCarte.py +34 -0
  1090. wx/py/PyAlaMode.py +34 -0
  1091. wx/py/PyAlaModeTest.py +33 -0
  1092. wx/py/PyCrust.ico +0 -0
  1093. wx/py/PyCrust.py +78 -0
  1094. wx/py/PyCrust_16.png +0 -0
  1095. wx/py/PyCrust_32.png +0 -0
  1096. wx/py/PyFilling.py +35 -0
  1097. wx/py/PyShell.py +78 -0
  1098. wx/py/PySlices.ico +0 -0
  1099. wx/py/PySlices.py +98 -0
  1100. wx/py/PySlicesShell.py +94 -0
  1101. wx/py/PySlices_16.png +0 -0
  1102. wx/py/PySlices_32.png +0 -0
  1103. wx/py/PyWrap.py +52 -0
  1104. wx/py/README.txt +77 -0
  1105. wx/py/__init__.py +20 -0
  1106. wx/py/buffer.py +136 -0
  1107. wx/py/crust.py +403 -0
  1108. wx/py/crustslices.py +403 -0
  1109. wx/py/dispatcher.py +259 -0
  1110. wx/py/document.py +37 -0
  1111. wx/py/editor.py +844 -0
  1112. wx/py/editwindow.py +299 -0
  1113. wx/py/filling.py +357 -0
  1114. wx/py/frame.py +978 -0
  1115. wx/py/images.py +212 -0
  1116. wx/py/interpreter.py +170 -0
  1117. wx/py/introspect.py +393 -0
  1118. wx/py/magic.py +98 -0
  1119. wx/py/parse.py +134 -0
  1120. wx/py/path.py +36 -0
  1121. wx/py/pseudo.py +99 -0
  1122. wx/py/shell.py +1588 -0
  1123. wx/py/sliceshell.py +3814 -0
  1124. wx/py/tests/test_interpreter.py +71 -0
  1125. wx/py/tests/test_introspect.py +862 -0
  1126. wx/py/tests/test_pseudo.py +70 -0
  1127. wx/py/tests/test_version.py +36 -0
  1128. wx/py/tests/testall.py +22 -0
  1129. wx/py/version.py +7 -0
  1130. wx/ribbon.py +45 -0
  1131. wx/ribbon.pyi +2494 -0
  1132. wx/richtext.py +142 -0
  1133. wx/richtext.pyi +12113 -0
  1134. wx/siplib.cp313-win_amd64.pyd +0 -0
  1135. wx/stc.py +58 -0
  1136. wx/stc.pyi +8463 -0
  1137. wx/svg/__init__.py +364 -0
  1138. wx/svg/_nanosvg.cp313-win_amd64.pyd +0 -0
  1139. wx/tools/__init__.py +18 -0
  1140. wx/tools/dbg.py +268 -0
  1141. wx/tools/genaxmodule.py +50 -0
  1142. wx/tools/helpviewer.py +92 -0
  1143. wx/tools/img2img.py +85 -0
  1144. wx/tools/img2png.py +54 -0
  1145. wx/tools/img2py.py +309 -0
  1146. wx/tools/img2xpm.py +54 -0
  1147. wx/tools/pywxrc.py +949 -0
  1148. wx/tools/wxget.py +254 -0
  1149. wx/tools/wxget_docs_demo.py +186 -0
  1150. wx/wxbase315u_net_vc140_x64.dll +0 -0
  1151. wx/wxbase315u_vc140_x64.dll +0 -0
  1152. wx/wxbase315u_xml_vc140_x64.dll +0 -0
  1153. wx/wxmsw315u_adv_vc140_x64.dll +0 -0
  1154. wx/wxmsw315u_aui_vc140_x64.dll +0 -0
  1155. wx/wxmsw315u_core_vc140_x64.dll +0 -0
  1156. wx/wxmsw315u_gl_vc140_x64.dll +0 -0
  1157. wx/wxmsw315u_html_vc140_x64.dll +0 -0
  1158. wx/wxmsw315u_media_vc140_x64.dll +0 -0
  1159. wx/wxmsw315u_propgrid_vc140_x64.dll +0 -0
  1160. wx/wxmsw315u_qa_vc140_x64.dll +0 -0
  1161. wx/wxmsw315u_ribbon_vc140_x64.dll +0 -0
  1162. wx/wxmsw315u_richtext_vc140_x64.dll +0 -0
  1163. wx/wxmsw315u_stc_vc140_x64.dll +0 -0
  1164. wx/wxmsw315u_webview_vc140_x64.dll +0 -0
  1165. wx/wxmsw315u_xrc_vc140_x64.dll +0 -0
  1166. wx/xml.py +15 -0
  1167. wx/xml.pyi +575 -0
  1168. wx/xrc.py +65 -0
  1169. wx/xrc.pyi +742 -0
  1170. wxPython_zombie-3.1.5.8.dist-info/LICENSE.txt +950 -0
  1171. wxPython_zombie-3.1.5.8.dist-info/METADATA +107 -0
  1172. wxPython_zombie-3.1.5.8.dist-info/RECORD +1175 -0
  1173. wxPython_zombie-3.1.5.8.dist-info/WHEEL +5 -0
  1174. wxPython_zombie-3.1.5.8.dist-info/entry_points.txt +2 -0
  1175. wxPython_zombie-3.1.5.8.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1525 @@
1
+ # -*- coding: utf-8 -*-
2
+ # pylint: disable=E1101, C0330, C0103
3
+ # E1101: Module X has no Y member
4
+ # C0330: Wrong continued indentation
5
+ # C0103: Invalid attribute/variable/method name
6
+ # (c) 2021 - 2024 Zombie
7
+ """
8
+ polyobjects.py
9
+ ==============
10
+
11
+ This contains all of the PolyXXX objects used by :mod:`wx.lib.plot`.
12
+
13
+ """
14
+ __docformat__ = "restructuredtext en"
15
+
16
+ # Standard Library
17
+ import time as _time
18
+ import wx
19
+ import warnings
20
+ from collections import namedtuple
21
+
22
+ # Third-Party
23
+ try:
24
+ import numpy as np
25
+ except:
26
+ msg = """
27
+ This module requires the NumPy module, which could not be
28
+ imported. It probably is not installed (it's not part of the
29
+ standard Python distribution). See the Numeric Python site
30
+ (http://numpy.scipy.org) for information on downloading source or
31
+ binaries."""
32
+ raise ImportError("NumPy not found.\n" + msg)
33
+
34
+ # Package
35
+ from .utils import pendingDeprecation
36
+ from .utils import TempStyle
37
+ from .utils import pairwise
38
+
39
+
40
+ class PolyPoints(object):
41
+ """
42
+ Base Class for lines and markers.
43
+
44
+ :param points: The points to plot
45
+ :type points: list of ``(x, y)`` pairs
46
+ :param attr: Additional attributes
47
+ :type attr: dict
48
+
49
+ .. warning::
50
+ All methods are private.
51
+ """
52
+
53
+ def __init__(self, points, attr):
54
+ self._points = np.array(points).astype(float)
55
+ self._logscale = (False, False)
56
+ self._absScale = (False, False)
57
+ self._symlogscale = (False, False)
58
+ self._pointSize = (1.0, 1.0)
59
+ self.currentScale = (1, 1)
60
+ self.currentShift = (0, 0)
61
+ self.scaled = self.points
62
+ self.attributes = {}
63
+ self.attributes.update(self._attributes)
64
+ for name, value in attr.items():
65
+ if name not in self._attributes:
66
+ err_txt = "Style attribute incorrect. Should be one of {}"
67
+ raise KeyError(err_txt.format(self._attributes.keys()))
68
+ self.attributes[name] = value
69
+
70
+ @property
71
+ def logScale(self):
72
+ """
73
+ A tuple of ``(x_axis_is_log10, y_axis_is_log10)`` booleans. If a value
74
+ is ``True``, then that axis is plotted on a logarithmic base 10 scale.
75
+
76
+ :getter: Returns the current value of logScale
77
+ :setter: Sets the value of logScale
78
+ :type: tuple of bool, length 2
79
+ :raises ValueError: when setting an invalid value
80
+ """
81
+ return self._logscale
82
+
83
+ @logScale.setter
84
+ def logScale(self, logscale):
85
+ if not isinstance(logscale, tuple) or len(logscale) != 2:
86
+ raise ValueError("`logscale` must be a 2-tuple of bools")
87
+ self._logscale = logscale
88
+
89
+ def setLogScale(self, logscale):
90
+ """
91
+ Set to change the axes to plot Log10(values)
92
+
93
+ Value must be a tuple of booleans (x_axis_bool, y_axis_bool)
94
+
95
+ .. deprecated:: Feb 27, 2016
96
+
97
+ Use the :attr:`~wx.lib.plot.polyobjects.PolyPoints.logScale`
98
+ property instead.
99
+ """
100
+ pendingDeprecation("self.logScale property")
101
+ self._logscale = logscale
102
+
103
+ @property
104
+ def symLogScale(self):
105
+ """
106
+ .. warning::
107
+
108
+ Not yet implemented.
109
+
110
+ A tuple of ``(x_axis_is_SymLog10, y_axis_is_SymLog10)`` booleans.
111
+ If a value is ``True``, then that axis is plotted on a symmetric
112
+ logarithmic base 10 scale.
113
+
114
+ A Symmetric Log10 scale means that values can be positive and
115
+ negative. Any values less than
116
+ :attr:`~wx.lig.plot.PolyPoints.symLogThresh` will be plotted on
117
+ a linear scale to avoid the plot going to infinity near 0.
118
+
119
+ :getter: Returns the current value of symLogScale
120
+ :setter: Sets the value of symLogScale
121
+ :type: tuple of bool, length 2
122
+ :raises ValueError: when setting an invalid value
123
+
124
+ .. notes::
125
+
126
+ This is a simplified example of how SymLog works::
127
+
128
+ if x >= thresh:
129
+ x = Log10(x)
130
+ elif x =< thresh:
131
+ x = -Log10(Abs(x))
132
+ else:
133
+ x = x
134
+
135
+ .. seealso::
136
+
137
+ + :attr:`~wx.lib.plot.PolyPoints.symLogThresh`
138
+ + See http://matplotlib.org/examples/pylab_examples/symlog_demo.html
139
+ for an example.
140
+ """
141
+ return self._symlogscale
142
+
143
+ # TODO: Implement symmetric log scale
144
+ @symLogScale.setter
145
+ def symLogScale(self, symlogscale, thresh):
146
+ raise NotImplementedError("Symmetric Log Scale not yet implemented")
147
+
148
+ if not isinstance(symlogscale, tuple) or len(symlogscale) != 2:
149
+ raise ValueError("`symlogscale` must be a 2-tuple of bools")
150
+ self._symlogscale = symlogscale
151
+
152
+ @property
153
+ def symLogThresh(self):
154
+ """
155
+ .. warning::
156
+
157
+ Not yet implemented.
158
+
159
+ A tuple of ``(x_thresh, y_thresh)`` floats that define where the plot
160
+ changes to linear scale when using a symmetric log scale.
161
+
162
+ :getter: Returns the current value of symLogThresh
163
+ :setter: Sets the value of symLogThresh
164
+ :type: tuple of float, length 2
165
+ :raises ValueError: when setting an invalid value
166
+
167
+ .. notes::
168
+
169
+ This is a simplified example of how SymLog works::
170
+
171
+ if x >= thresh:
172
+ x = Log10(x)
173
+ elif x =< thresh:
174
+ x = -Log10(Abs(x))
175
+ else:
176
+ x = x
177
+
178
+ .. seealso::
179
+
180
+ + :attr:`~wx.lib.plot.PolyPoints.symLogScale`
181
+ + See http://matplotlib.org/examples/pylab_examples/symlog_demo.html
182
+ for an example.
183
+ """
184
+ return self._symlogscale
185
+
186
+ # TODO: Implement symmetric log scale threshold
187
+ @symLogThresh.setter
188
+ def symLogThresh(self, symlogscale, thresh):
189
+ raise NotImplementedError("Symmetric Log Scale not yet implemented")
190
+
191
+ if not isinstance(symlogscale, tuple) or len(symlogscale) != 2:
192
+ raise ValueError("`symlogscale` must be a 2-tuple of bools")
193
+ self._symlogscale = symlogscale
194
+
195
+ @property
196
+ def absScale(self):
197
+ """
198
+ A tuple of ``(x_axis_is_abs, y_axis_is_abs)`` booleans. If a value
199
+ is ``True``, then that axis is plotted on an absolute value scale.
200
+
201
+ :getter: Returns the current value of absScale
202
+ :setter: Sets the value of absScale
203
+ :type: tuple of bool, length 2
204
+ :raises ValueError: when setting an invalid value
205
+ """
206
+ return self._absScale
207
+
208
+ @absScale.setter
209
+ def absScale(self, absscale):
210
+
211
+ if not isinstance(absscale, tuple) and len(absscale) == 2:
212
+ raise ValueError("`absscale` must be a 2-tuple of bools")
213
+ self._absScale = absscale
214
+
215
+ @property
216
+ def points(self):
217
+ """
218
+ Get or set the plotted points.
219
+
220
+ :getter: Returns the current value of points, adjusting for the
221
+ various scale options such as Log, Abs, or SymLog.
222
+ :setter: Sets the value of points.
223
+ :type: list of `(x, y)` pairs
224
+
225
+ .. Note::
226
+
227
+ Only set unscaled points - do not perform the log, abs, or symlog
228
+ adjustments yourself.
229
+ """
230
+ data = np.array(self._points, copy=True) # need the copy
231
+ # TODO: get rid of the
232
+ # need for copy
233
+
234
+ # work on X:
235
+ if self.absScale[0]:
236
+ data = self._abs(data, 0)
237
+ if self.logScale[0]:
238
+ data = self._log10(data, 0)
239
+
240
+ if self.symLogScale[0]:
241
+ # TODO: implement symLogScale
242
+ # Should symLogScale override absScale? My vote is no.
243
+ # Should symLogScale override logScale? My vote is yes.
244
+ # - symLogScale could be a parameter passed to logScale...
245
+ pass
246
+
247
+ # work on Y:
248
+ if self.absScale[1]:
249
+ data = self._abs(data, 1)
250
+ if self.logScale[1]:
251
+ data = self._log10(data, 1)
252
+
253
+ if self.symLogScale[1]:
254
+ # TODO: implement symLogScale
255
+ pass
256
+
257
+ return data
258
+
259
+ @points.setter
260
+ def points(self, points):
261
+ self._points = points
262
+
263
+ def _log10(self, data, index):
264
+ """ Take the Log10 of the data, dropping any negative values """
265
+ data = np.compress(data[:, index] > 0, data, 0)
266
+ data[:, index] = np.log10(data[:, index])
267
+ return data
268
+
269
+ def _abs(self, data, index):
270
+ """ Take the Abs of the data """
271
+ data[:, index] = np.abs(data[:, index])
272
+ return data
273
+
274
+ def boundingBox(self):
275
+ """
276
+ Returns the bouding box for the entire dataset as a tuple with this
277
+ format::
278
+
279
+ ((minX, minY), (maxX, maxY))
280
+
281
+ :returns: boundingbox
282
+ :rtype: numpy array of ``[[minX, minY], [maxX, maxY]]``
283
+ """
284
+ if len(self.points) == 0:
285
+ # no curves to draw
286
+ # defaults to (-1,-1) and (1,1) but axis can be set in Draw
287
+ minXY = np.array([-1.0, -1.0])
288
+ maxXY = np.array([1.0, 1.0])
289
+ else:
290
+ minXY = np.minimum.reduce(self.points)
291
+ maxXY = np.maximum.reduce(self.points)
292
+ return minXY, maxXY
293
+
294
+ def scaleAndShift(self, scale=(1, 1), shift=(0, 0)):
295
+ """
296
+ Scales and shifts the data for plotting.
297
+
298
+ :param scale: The values to scale the data by.
299
+ :type scale: list of floats: ``[x_scale, y_scale]``
300
+ :param shift: The value to shift the data by. This should be in scaled
301
+ units
302
+ :type shift: list of floats: ``[x_shift, y_shift]``
303
+ :returns: None
304
+ """
305
+ if len(self.points) == 0:
306
+ # no curves to draw
307
+ return
308
+
309
+ # TODO: Can we remove the if statement alltogether? Does
310
+ # scaleAndShift ever get called when the current value equals
311
+ # the new value?
312
+
313
+ # cast everything to list: some might be np.ndarray objects
314
+ if (list(scale) != list(self.currentScale)
315
+ or list(shift) != list(self.currentShift)):
316
+ # update point scaling
317
+ self.scaled = scale * self.points + shift
318
+ self.currentScale = scale
319
+ self.currentShift = shift
320
+ # else unchanged use the current scaling
321
+
322
+ def getLegend(self):
323
+ return self.attributes['legend']
324
+
325
+ def getClosestPoint(self, pntXY, pointScaled=True):
326
+ """
327
+ Returns the index of closest point on the curve, pointXY,
328
+ scaledXY, distance x, y in user coords.
329
+
330
+ if pointScaled == True, then based on screen coords
331
+ if pointScaled == False, then based on user coords
332
+ """
333
+ if pointScaled:
334
+ # Using screen coords
335
+ p = self.scaled
336
+ pxy = self.currentScale * np.array(pntXY) + self.currentShift
337
+ else:
338
+ # Using user coords
339
+ p = self.points
340
+ pxy = np.array(pntXY)
341
+ # determine distance for each point
342
+ d = np.sqrt(np.add.reduce((p - pxy) ** 2, 1)) # sqrt(dx^2+dy^2)
343
+ pntIndex = np.argmin(d)
344
+ dist = d[pntIndex]
345
+ return [pntIndex,
346
+ self.points[pntIndex],
347
+ self.scaled[pntIndex] / self._pointSize,
348
+ dist]
349
+
350
+
351
+ class PolyLine(PolyPoints):
352
+ """
353
+ Creates PolyLine object
354
+
355
+ :param points: The points that make up the line
356
+ :type points: list of ``[x, y]`` values
357
+ :param **attr: keyword attributes
358
+
359
+ =========================== ============= ====================
360
+ Keyword and Default Description Type
361
+ =========================== ============= ====================
362
+ ``colour='black'`` Line color :class:`wx.Colour`
363
+ ``width=1`` Line width float
364
+ ``style=wx.PENSTYLE_SOLID`` Line style :class:`wx.PenStyle`
365
+ ``legend=''`` Legend string str
366
+ ``drawstyle='line'`` see below str
367
+ =========================== ============= ====================
368
+
369
+ ================== ==================================================
370
+ Draw style Description
371
+ ================== ==================================================
372
+ ``'line'`` Draws an straight line between consecutive points
373
+ ``'steps-pre'`` Draws a line down from point A and then right to
374
+ point B
375
+ ``'steps-post'`` Draws a line right from point A and then down
376
+ to point B
377
+ ``'steps-mid-x'`` Draws a line horizontally to half way between A
378
+ and B, then draws a line vertically, then again
379
+ horizontally to point B.
380
+ ``'steps-mid-y'`` Draws a line vertically to half way between A
381
+ and B, then draws a line horizonatally, then
382
+ again vertically to point B.
383
+ *Note: This typically does not look very good*
384
+ ================== ==================================================
385
+
386
+ .. warning::
387
+
388
+ All methods except ``__init__`` are private.
389
+ """
390
+
391
+ _attributes = {'colour': 'black',
392
+ 'width': 1,
393
+ 'style': wx.PENSTYLE_SOLID,
394
+ 'legend': '',
395
+ 'drawstyle': 'line',
396
+ }
397
+ _drawstyles = ("line", "steps-pre", "steps-post",
398
+ "steps-mid-x", "steps-mid-y")
399
+
400
+ def __init__(self, points, **attr):
401
+ PolyPoints.__init__(self, points, attr)
402
+
403
+ def draw(self, dc, printerScale, coord=None):
404
+ """
405
+ Draw the lines.
406
+
407
+ :param dc: The DC to draw on.
408
+ :type dc: :class:`wx.DC`
409
+ :param printerScale:
410
+ :type printerScale: float
411
+ :param coord: The legend coordinate?
412
+ :type coord: ???
413
+ """
414
+ colour = self.attributes['colour']
415
+ width = int(self.attributes['width'] * printerScale * self._pointSize[0])
416
+ style = self.attributes['style']
417
+ drawstyle = self.attributes['drawstyle']
418
+
419
+ if not isinstance(colour, wx.Colour):
420
+ colour = wx.Colour(colour)
421
+ pen = wx.Pen(colour, width, style)
422
+ pen.SetCap(wx.CAP_BUTT)
423
+ dc.SetPen(pen)
424
+ if coord is None:
425
+ if len(self.scaled): # bugfix for Mac OS X
426
+ for c1, c2 in zip(self.scaled, self.scaled[1:]):
427
+ self._path(dc, c1, c2, drawstyle)
428
+ else:
429
+ dc.DrawLines(coord) # draw legend line
430
+
431
+ def getSymExtent(self, printerScale):
432
+ """
433
+ Get the Width and Height of the symbol.
434
+
435
+ :param printerScale:
436
+ :type printerScale: float
437
+ """
438
+ h = self.attributes['width'] * printerScale * self._pointSize[0]
439
+ w = 5 * h
440
+ return (w, h)
441
+
442
+ def _path(self, dc, coord1, coord2, drawstyle):
443
+ """
444
+ Calculates the path from coord1 to coord 2 along X and Y
445
+
446
+ :param dc: The DC to draw on.
447
+ :type dc: :class:`wx.DC`
448
+ :param coord1: The first coordinate in the coord pair
449
+ :type coord1: list, length 2: ``[x, y]``
450
+ :param coord2: The second coordinate in the coord pair
451
+ :type coord2: list, length 2: ``[x, y]``
452
+ :param drawstyle: The type of connector to use
453
+ :type drawstyle: str
454
+ """
455
+ if drawstyle == 'line':
456
+ # Straight line between points.
457
+ line = [coord1, coord2]
458
+ elif drawstyle == 'steps-pre':
459
+ # Up/down to next Y, then right to next X
460
+ intermediate = [coord1[0], coord2[1]]
461
+ line = [coord1, intermediate, coord2]
462
+ elif drawstyle == 'steps-post':
463
+ # Right to next X, then up/down to Y
464
+ intermediate = [coord2[0], coord1[1]]
465
+ line = [coord1, intermediate, coord2]
466
+ elif drawstyle == 'steps-mid-x':
467
+ # need 3 lines between points: right -> up/down -> right
468
+ mid_x = ((coord2[0] - coord1[0]) / 2) + coord1[0]
469
+ intermediate1 = [mid_x, coord1[1]]
470
+ intermediate2 = [mid_x, coord2[1]]
471
+ line = [coord1, intermediate1, intermediate2, coord2]
472
+ elif drawstyle == 'steps-mid-y':
473
+ # need 3 lines between points: up/down -> right -> up/down
474
+ mid_y = ((coord2[1] - coord1[1]) / 2) + coord1[1]
475
+ intermediate1 = [coord1[0], mid_y]
476
+ intermediate2 = [coord2[0], mid_y]
477
+ line = [coord1, intermediate1, intermediate2, coord2]
478
+ else:
479
+ err_txt = "Invalid drawstyle '{}'. Must be one of {}."
480
+ raise ValueError(err_txt.format(drawstyle, self._drawstyles))
481
+
482
+ dc.DrawLines(line)
483
+
484
+
485
+ class PolySpline(PolyLine):
486
+ """
487
+ Creates PolySpline object
488
+
489
+ :param points: The points that make up the spline
490
+ :type points: list of ``[x, y]`` values
491
+ :param **attr: keyword attributes
492
+
493
+ =========================== ============= ====================
494
+ Keyword and Default Description Type
495
+ =========================== ============= ====================
496
+ ``colour='black'`` Line color :class:`wx.Colour`
497
+ ``width=1`` Line width float
498
+ ``style=wx.PENSTYLE_SOLID`` Line style :class:`wx.PenStyle`
499
+ ``legend=''`` Legend string str
500
+ =========================== ============= ====================
501
+
502
+ .. warning::
503
+
504
+ All methods except ``__init__`` are private.
505
+ """
506
+
507
+ _attributes = {'colour': 'black',
508
+ 'width': 1,
509
+ 'style': wx.PENSTYLE_SOLID,
510
+ 'legend': ''}
511
+
512
+ def __init__(self, points, **attr):
513
+ PolyLine.__init__(self, points, **attr)
514
+
515
+ def draw(self, dc, printerScale, coord=None):
516
+ """ Draw the spline """
517
+ colour = self.attributes['colour']
518
+ width = int(self.attributes['width'] * printerScale * self._pointSize[0])
519
+ style = self.attributes['style']
520
+ if not isinstance(colour, wx.Colour):
521
+ colour = wx.Colour(colour)
522
+ pen = wx.Pen(colour, width, style)
523
+ pen.SetCap(wx.CAP_ROUND)
524
+ dc.SetPen(pen)
525
+ if coord is None:
526
+ if len(self.scaled) >= 3:
527
+ dc.DrawSpline(self.scaled)
528
+ else:
529
+ dc.DrawLines(coord) # draw legend line
530
+
531
+
532
+ class PolyMarker(PolyPoints):
533
+ """
534
+ Creates a PolyMarker object.
535
+
536
+ :param points: The marker coordinates.
537
+ :type points: list of ``[x, y]`` values
538
+ :param **attr: keyword attributes
539
+
540
+ ================================= ============= ====================
541
+ Keyword and Default Description Type
542
+ ================================= ============= ====================
543
+ ``marker='circle'`` see below str
544
+ ``size=2`` Marker size float
545
+ ``colour='black'`` Outline color :class:`wx.Colour`
546
+ ``width=1`` Outline width float
547
+ ``style=wx.PENSTYLE_SOLID`` Outline style :class:`wx.PenStyle`
548
+ ``fillcolour=colour`` fill color :class:`wx.Colour`
549
+ ``fillstyle=wx.BRUSHSTYLE_SOLID`` fill style :class:`wx.BrushStyle`
550
+ ``legend=''`` Legend string str
551
+ ================================= ============= ====================
552
+
553
+ =================== ==================================
554
+ Marker Description
555
+ =================== ==================================
556
+ ``'circle'`` A circle of diameter ``size``
557
+ ``'dot'`` A dot. Does not have a size.
558
+ ``'square'`` A square with side length ``size``
559
+ ``'triangle'`` An upward-pointed triangle
560
+ ``'triangle_down'`` A downward-pointed triangle
561
+ ``'cross'`` An "X" shape
562
+ ``'plus'`` A "+" shape
563
+ =================== ==================================
564
+
565
+ .. warning::
566
+
567
+ All methods except ``__init__`` are private.
568
+ """
569
+ _attributes = {'colour': 'black',
570
+ 'width': 1,
571
+ 'size': 2,
572
+ 'fillcolour': None,
573
+ 'fillstyle': wx.BRUSHSTYLE_SOLID,
574
+ 'marker': 'circle',
575
+ 'legend': ''}
576
+
577
+ def __init__(self, points, **attr):
578
+ PolyPoints.__init__(self, points, attr)
579
+
580
+ def draw(self, dc, printerScale, coord=None):
581
+ """ Draw the points """
582
+ colour = self.attributes['colour']
583
+ width = int(self.attributes['width'] * printerScale * self._pointSize[0])
584
+ size = self.attributes['size'] * printerScale * self._pointSize[0]
585
+ fillcolour = self.attributes['fillcolour']
586
+ fillstyle = self.attributes['fillstyle']
587
+ marker = self.attributes['marker']
588
+
589
+ if colour and not isinstance(colour, wx.Colour):
590
+ colour = wx.Colour(colour)
591
+ if fillcolour and not isinstance(fillcolour, wx.Colour):
592
+ fillcolour = wx.Colour(fillcolour)
593
+
594
+ dc.SetPen(wx.Pen(colour, width))
595
+ if fillcolour:
596
+ dc.SetBrush(wx.Brush(fillcolour, fillstyle))
597
+ else:
598
+ dc.SetBrush(wx.Brush(colour, fillstyle))
599
+ if coord is None:
600
+ if len(self.scaled): # bugfix for Mac OS X
601
+ self._drawmarkers(dc, self.scaled, marker, size)
602
+ else:
603
+ self._drawmarkers(dc, coord, marker, size) # draw legend marker
604
+
605
+ def getSymExtent(self, printerScale):
606
+ """Width and Height of Marker"""
607
+ s = 5 * self.attributes['size'] * printerScale * self._pointSize[0]
608
+ return (s, s)
609
+
610
+ def _drawmarkers(self, dc, coords, marker, size=1):
611
+ f = getattr(self, "_{}".format(marker))
612
+ f(dc, coords, size)
613
+
614
+ def _circle(self, dc, coords, size=1):
615
+ fact = 2.5 * size
616
+ wh = 5.0 * size
617
+ rect = np.zeros((len(coords), 4), float) + [0.0, 0.0, wh, wh]
618
+ rect[:, 0:2] = coords - [fact, fact]
619
+ dc.DrawEllipseList(rect.astype(np.int32))
620
+
621
+ def _dot(self, dc, coords, size=1):
622
+ dc.DrawPointList(np.array(coords, dtype = int))
623
+
624
+ def _square(self, dc, coords, size=1):
625
+ fact = 2.5 * size
626
+ wh = 5.0 * size
627
+ rect = np.zeros((len(coords), 4), float) + [0.0, 0.0, wh, wh]
628
+ rect[:, 0:2] = coords - [fact, fact]
629
+ dc.DrawRectangleList(rect.astype(np.int32))
630
+
631
+ def _triangle(self, dc, coords, size=1):
632
+ shape = [(-2.5 * size, 1.44 * size),
633
+ (2.5 * size, 1.44 * size), (0.0, -2.88 * size)]
634
+ poly = np.repeat(coords, 3, 0)
635
+ poly.shape = (len(coords), 3, 2)
636
+ poly += shape
637
+ dc.DrawPolygonList(poly.astype(np.int32))
638
+
639
+ def _triangle_down(self, dc, coords, size=1):
640
+ shape = [(-2.5 * size, -1.44 * size),
641
+ (2.5 * size, -1.44 * size), (0.0, 2.88 * size)]
642
+ poly = np.repeat(coords, 3, 0)
643
+ poly.shape = (len(coords), 3, 2)
644
+ poly += shape
645
+ dc.DrawPolygonList(poly.astype(np.int32))
646
+
647
+ def _cross(self, dc, coords, size=1):
648
+ fact = 2.5 * size
649
+ for f in [[-fact, -fact, fact, fact], [-fact, fact, fact, -fact]]:
650
+ lines = np.concatenate((coords, coords), axis=1) + f
651
+ dc.DrawLineList(lines.astype(np.int32))
652
+
653
+ def _plus(self, dc, coords, size=1):
654
+ fact = 2.5 * size
655
+ for f in [[-fact, 0, fact, 0], [0, -fact, 0, fact]]:
656
+ lines = np.concatenate((coords, coords), axis=1) + f
657
+ dc.DrawLineList(lines.astype(np.int32))
658
+
659
+
660
+ class PolyBarsBase(PolyPoints):
661
+ """
662
+ Base class for PolyBars and PolyHistogram.
663
+
664
+ .. warning::
665
+
666
+ All methods are private.
667
+ """
668
+ _attributes = {'edgecolour': 'black',
669
+ 'edgewidth': 2,
670
+ 'edgestyle': wx.PENSTYLE_SOLID,
671
+ 'legend': '',
672
+ 'fillcolour': 'red',
673
+ 'fillstyle': wx.BRUSHSTYLE_SOLID,
674
+ 'barwidth': 1.0
675
+ }
676
+
677
+ def __init__(self, points, attr):
678
+ """
679
+ """
680
+ PolyPoints.__init__(self, points, attr)
681
+
682
+ def _scaleAndShift(self, data, scale=(1, 1), shift=(0, 0)):
683
+ """same as override method, but retuns a value."""
684
+ scaled = scale * data + shift
685
+ return scaled
686
+
687
+ def getSymExtent(self, printerScale):
688
+ """Width and Height of Marker"""
689
+ h = self.attributes['edgewidth'] * printerScale * self._pointSize[0]
690
+ w = 5 * h
691
+ return (w, h)
692
+
693
+ def set_pen_and_brush(self, dc, printerScale):
694
+ pencolour = self.attributes['edgecolour']
695
+ penwidth = (self.attributes['edgewidth']
696
+ * printerScale * self._pointSize[0])
697
+ penstyle = self.attributes['edgestyle']
698
+ fillcolour = self.attributes['fillcolour']
699
+ fillstyle = self.attributes['fillstyle']
700
+
701
+ if not isinstance(pencolour, wx.Colour):
702
+ pencolour = wx.Colour(pencolour)
703
+ pen = wx.Pen(pencolour, penwidth, penstyle)
704
+ pen.SetCap(wx.CAP_BUTT)
705
+
706
+ if not isinstance(fillcolour, wx.Colour):
707
+ fillcolour = wx.Colour(fillcolour)
708
+ brush = wx.Brush(fillcolour, fillstyle)
709
+
710
+ dc.SetPen(pen)
711
+ dc.SetBrush(brush)
712
+
713
+ def scale_rect(self, rect):
714
+ # Scale the points to the plot area
715
+ scaled_rect = self._scaleAndShift(rect,
716
+ self.currentScale,
717
+ self.currentShift)
718
+
719
+ # Convert to (left, top, width, height) for drawing
720
+ wx_rect = [scaled_rect[0][0], # X (left)
721
+ scaled_rect[0][1], # Y (top)
722
+ scaled_rect[1][0] - scaled_rect[0][0], # Width
723
+ scaled_rect[1][1] - scaled_rect[0][1]] # Height
724
+
725
+ return wx_rect
726
+
727
+ def draw(self, dc, printerScale, coord=None):
728
+ pass
729
+
730
+
731
+ class PolyBars(PolyBarsBase):
732
+ """
733
+ Creates a PolyBars object.
734
+
735
+ :param points: The data to plot.
736
+ :type points: sequence of ``(center, height)`` points
737
+ :param **attr: keyword attributes
738
+
739
+ ================================= ============= =======================
740
+ Keyword and Default Description Type
741
+ ================================= ============= =======================
742
+ ``barwidth=1.0`` bar width float or list of floats
743
+ ``edgecolour='black'`` edge color :class:`wx.Colour`
744
+ ``edgewidth=1`` edge width float
745
+ ``edgestyle=wx.PENSTYLE_SOLID`` edge style :class:`wx.PenStyle`
746
+ ``fillcolour='red'`` fill color :class:`wx.Colour`
747
+ ``fillstyle=wx.BRUSHSTYLE_SOLID`` fill style :class:`wx.BrushStyle`
748
+ ``legend=''`` legend string str
749
+ ================================= ============= =======================
750
+
751
+ .. important::
752
+
753
+ If ``barwidth`` is a list of floats:
754
+
755
+ + each bar will have a separate width
756
+ + ``len(barwidth)`` must equal ``len(points)``.
757
+
758
+ .. warning::
759
+
760
+ All methods except ``__init__`` are private.
761
+ """
762
+ def __init__(self, points, **attr):
763
+ PolyBarsBase.__init__(self, points, attr)
764
+
765
+ def calc_rect(self, x, y, w):
766
+ """ Calculate the rectangle for plotting. """
767
+ return self.scale_rect([[x - w / 2, y], # left, top
768
+ [x + w / 2, 0]]) # right, bottom
769
+
770
+ def draw(self, dc, printerScale, coord=None):
771
+ """ Draw the bars """
772
+ self.set_pen_and_brush(dc, printerScale)
773
+ barwidth = self.attributes['barwidth']
774
+
775
+ if coord is None:
776
+ if isinstance(barwidth, (int, float)):
777
+ # use a single width for all bars
778
+ pts = ((x, y, barwidth) for x, y in self.points)
779
+ elif isinstance(barwidth, (list, tuple)):
780
+ # use a separate width for each bar
781
+ if len(barwidth) != len(self.points):
782
+ err_str = ("Barwidth ({} items) and Points ({} items) do "
783
+ "not have the same length!")
784
+ err_str = err_str.format(len(barwidth), len(self.points))
785
+ raise ValueError(err_str)
786
+ pts = ((x, y, w) for (x, y), w in zip(self.points, barwidth))
787
+ else:
788
+ # invalid attribute type
789
+ err_str = ("Invalid type for 'barwidth'. Expected float, "
790
+ "int, or list or tuple of (int or float). Got {}.")
791
+ raise TypeError(err_str.format(type(barwidth)))
792
+
793
+ rects = [self.calc_rect(x, y, w) for x, y, w in pts]
794
+ dc.DrawRectangleList(np.array(rects, dtype = int))
795
+ else:
796
+ dc.DrawLines(coord) # draw legend line
797
+
798
+
799
+ class PolyHistogram(PolyBarsBase):
800
+ """
801
+ Creates a PolyHistogram object.
802
+
803
+ :param hist: The histogram data.
804
+ :type hist: sequence of ``y`` values that define the heights of the bars
805
+ :param binspec: The bin specification.
806
+ :type binspec: sequence of ``x`` values that define the edges of the bins
807
+ :param **attr: keyword attributes
808
+
809
+ ================================= ============= =======================
810
+ Keyword and Default Description Type
811
+ ================================= ============= =======================
812
+ ``edgecolour='black'`` edge color :class:`wx.Colour`
813
+ ``edgewidth=3`` edge width float
814
+ ``edgestyle=wx.PENSTYLE_SOLID`` edge style :class:`wx.PenStyle`
815
+ ``fillcolour='blue'`` fill color :class:`wx.Colour`
816
+ ``fillstyle=wx.BRUSHSTYLE_SOLID`` fill style :class:`wx.BrushStyle`
817
+ ``legend=''`` legend string str
818
+ ================================= ============= =======================
819
+
820
+ .. tip::
821
+
822
+ Use ``np.histogram()`` to easily create your histogram parameters::
823
+
824
+ hist_data, binspec = np.histogram(data)
825
+ hist_plot = PolyHistogram(hist_data, binspec)
826
+
827
+ .. important::
828
+
829
+ ``len(binspec)`` must equal ``len(hist) + 1``.
830
+
831
+ .. warning::
832
+
833
+ All methods except ``__init__`` are private.
834
+ """
835
+ def __init__(self, hist, binspec, **attr):
836
+ if len(binspec) != len(hist) + 1:
837
+ raise ValueError("Len(binspec) must equal len(hist) + 1")
838
+
839
+ self.hist = hist
840
+ self.binspec = binspec
841
+
842
+ # define the bins and center x locations
843
+ self.bins = list(pairwise(self.binspec))
844
+ bar_center_x = (pair[0] + (pair[1] - pair[0])/2 for pair in self.bins)
845
+
846
+ points = list(zip(bar_center_x, self.hist))
847
+ PolyBarsBase.__init__(self, points, attr)
848
+
849
+ def calc_rect(self, y, low, high):
850
+ """ Calculate the rectangle for plotting. """
851
+ return self.scale_rect([[low, y], # left, top
852
+ [high, 0]]) # right, bottom
853
+
854
+ def draw(self, dc, printerScale, coord=None):
855
+ """ Draw the bars """
856
+ self.set_pen_and_brush(dc, printerScale)
857
+
858
+ if coord is None:
859
+ rects = [self.calc_rect(y, low, high)
860
+ for y, (low, high)
861
+ in zip(self.hist, self.bins)]
862
+
863
+ dc.DrawRectangleList(np.array(rects, dtype = int))
864
+ else:
865
+ dc.DrawLines(coord) # draw legend line
866
+
867
+
868
+ class PolyBoxPlot(PolyPoints):
869
+ """
870
+ Creates a PolyBoxPlot object.
871
+
872
+ :param data: Raw data to create a box plot from.
873
+ :type data: sequence of int or float
874
+ :param **attr: keyword attributes
875
+
876
+ ================================= ============= =======================
877
+ Keyword and Default Description Type
878
+ ================================= ============= =======================
879
+ ``colour='black'`` edge color :class:`wx.Colour`
880
+ ``width=1`` edge width float
881
+ ``style=wx.PENSTYLE_SOLID`` edge style :class:`wx.PenStyle`
882
+ ``legend=''`` legend string str
883
+ ================================= ============= =======================
884
+
885
+ .. note::
886
+
887
+ ``np.NaN`` and ``np.inf`` values are ignored.
888
+
889
+ .. admonition:: TODO
890
+
891
+ + [ ] Figure out a better way to get multiple box plots side-by-side
892
+ (current method is a hack).
893
+ + [ ] change the X axis to some labels.
894
+ + [ ] Change getClosestPoint to only grab box plot items and outlers?
895
+ Currently grabs every data point.
896
+ + [ ] Add more customization such as Pens/Brushes, outlier shapes/size,
897
+ and box width.
898
+ + [ ] Figure out how I want to handle log-y: log data then calcBP? Or
899
+ should I calc the BP first then the plot it on a log scale?
900
+ """
901
+ _attributes = {'colour': 'black',
902
+ 'width': 1,
903
+ 'style': wx.PENSTYLE_SOLID,
904
+ 'legend': '',
905
+ }
906
+
907
+ def __init__(self, points, **attr):
908
+ # Set various attributes
909
+ self.box_width = 0.5
910
+
911
+ # Determine the X position and create a 1d dataset.
912
+ self.xpos = points[0, 0]
913
+ points = points[:, 1]
914
+
915
+ # Calculate the box plot points and the outliers
916
+ self._bpdata = self.calcBpData(points)
917
+ self._outliers = self.calcOutliers(points)
918
+ points = np.concatenate((self._bpdata, self._outliers))
919
+ points = np.array([(self.xpos, x) for x in points])
920
+
921
+ # Create a jitter for the outliers
922
+ self.jitter = (0.05 * np.random.random_sample(len(self._outliers))
923
+ + self.xpos - 0.025)
924
+
925
+ # Init the parent class
926
+ PolyPoints.__init__(self, points, attr)
927
+
928
+ def _clean_data(self, data=None):
929
+ """
930
+ Removes NaN and Inf from the data.
931
+ """
932
+ if data is None:
933
+ data = self.points
934
+
935
+ # clean out NaN and infinity values.
936
+ data = data[~np.isnan(data)]
937
+ data = data[~np.isinf(data)]
938
+
939
+ return data
940
+
941
+ def boundingBox(self):
942
+ """
943
+ Returns bounding box for the plot.
944
+
945
+ Override method.
946
+ """
947
+ xpos = self.xpos
948
+
949
+ minXY = np.array([xpos - self.box_width / 2, self._bpdata.min * 0.95])
950
+ maxXY = np.array([xpos + self.box_width / 2, self._bpdata.max * 1.05])
951
+ return minXY, maxXY
952
+
953
+ def getClosestPoint(self, pntXY, pointScaled=True):
954
+ """
955
+ Returns the index of closest point on the curve, pointXY,
956
+ scaledXY, distance x, y in user coords.
957
+
958
+ Override method.
959
+
960
+ if pointScaled == True, then based on screen coords
961
+ if pointScaled == False, then based on user coords
962
+ """
963
+
964
+ xpos = self.xpos
965
+
966
+ # combine the outliers with the box plot data
967
+ data_to_use = np.concatenate((self._bpdata, self._outliers))
968
+ data_to_use = np.array([(xpos, x) for x in data_to_use])
969
+
970
+ if pointScaled:
971
+ # Use screen coords
972
+ p = self.scaled
973
+ pxy = self.currentScale * np.array(pntXY) + self.currentShift
974
+ else:
975
+ # Using user coords
976
+ p = self._points
977
+ pxy = np.array(pntXY)
978
+
979
+ # determine distnace for each point
980
+ d = np.sqrt(np.add.reduce((p - pxy) ** 2, 1)) # sqrt(dx^2+dy^2)
981
+ pntIndex = np.argmin(d)
982
+ dist = d[pntIndex]
983
+ return [pntIndex,
984
+ self.points[pntIndex],
985
+ self.scaled[pntIndex] / self._pointSize,
986
+ dist]
987
+
988
+ def getSymExtent(self, printerScale):
989
+ """Width and Height of Marker"""
990
+ # TODO: does this need to be updated?
991
+ h = self.attributes['width'] * printerScale * self._pointSize[0]
992
+ w = 5 * h
993
+ return (w, h)
994
+
995
+ def calcBpData(self, data=None):
996
+ """
997
+ Box plot points:
998
+
999
+ Median (50%)
1000
+ 75%
1001
+ 25%
1002
+ low_whisker = lowest value that's >= (25% - (IQR * 1.5))
1003
+ high_whisker = highest value that's <= 75% + (IQR * 1.5)
1004
+
1005
+ outliers are outside of 1.5 * IQR
1006
+
1007
+ Parameters
1008
+ ----------
1009
+ data : array-like
1010
+ The data to plot
1011
+
1012
+ Returns
1013
+ -------
1014
+ bpdata : collections.namedtuple
1015
+ Descriptive statistics for data:
1016
+ (min_data, low_whisker, q25, median, q75, high_whisker, max_data)
1017
+
1018
+ """
1019
+ data = self._clean_data(data)
1020
+
1021
+ min_data = float(np.min(data))
1022
+ max_data = float(np.max(data))
1023
+ q25 = float(np.percentile(data, 25))
1024
+ q75 = float(np.percentile(data, 75))
1025
+
1026
+ iqr = q75 - q25
1027
+
1028
+ low_whisker = float(data[data >= q25 - 1.5 * iqr].min())
1029
+ high_whisker = float(data[data <= q75 + 1.5 * iqr].max())
1030
+
1031
+ median = float(np.median(data))
1032
+
1033
+ BPData = namedtuple("bpdata", ("min", "low_whisker", "q25", "median",
1034
+ "q75", "high_whisker", "max"))
1035
+
1036
+ bpdata = BPData(min_data, low_whisker, q25, median,
1037
+ q75, high_whisker, max_data)
1038
+
1039
+ return bpdata
1040
+
1041
+ def calcOutliers(self, data=None):
1042
+ """
1043
+ Calculates the outliers. Must be called after calcBpData.
1044
+ """
1045
+ data = self._clean_data(data)
1046
+
1047
+ outliers = data
1048
+ outlier_bool = np.logical_or(outliers > self._bpdata.high_whisker,
1049
+ outliers < self._bpdata.low_whisker)
1050
+ outliers = outliers[outlier_bool]
1051
+ return outliers
1052
+
1053
+ def _scaleAndShift(self, data, scale=(1, 1), shift=(0, 0)):
1054
+ """same as override method, but retuns a value."""
1055
+ scaled = scale * data + shift
1056
+ return scaled
1057
+
1058
+ @TempStyle('pen')
1059
+ def draw(self, dc, printerScale, coord=None):
1060
+ """
1061
+ Draws a box plot on the DC.
1062
+
1063
+ Notes
1064
+ -----
1065
+ The following draw order is required:
1066
+
1067
+ 1. First the whisker line
1068
+ 2. Then the IQR box
1069
+ 3. Lasly the median line.
1070
+
1071
+ This is because
1072
+
1073
+ + The whiskers are drawn as single line rather than two lines
1074
+ + The median line must be visable over the box if the box has a fill.
1075
+
1076
+ Other than that, the draw order can be changed.
1077
+ """
1078
+ self._draw_whisker(dc, printerScale)
1079
+ self._draw_iqr_box(dc, printerScale)
1080
+ self._draw_median(dc, printerScale) # median after box
1081
+ self._draw_whisker_ends(dc, printerScale)
1082
+ self._draw_outliers(dc, printerScale)
1083
+
1084
+ @TempStyle('pen')
1085
+ def _draw_whisker(self, dc, printerScale):
1086
+ """Draws the whiskers as a single line"""
1087
+ xpos = self.xpos
1088
+
1089
+ # We draw it as one line and then hide the middle part with
1090
+ # the IQR rectangle
1091
+ whisker_line = np.array([[xpos, self._bpdata.low_whisker],
1092
+ [xpos, self._bpdata.high_whisker]])
1093
+
1094
+ whisker_line = self._scaleAndShift(whisker_line,
1095
+ self.currentScale,
1096
+ self.currentShift)
1097
+
1098
+ whisker_pen = wx.Pen(wx.BLACK, 2, wx.PENSTYLE_SOLID)
1099
+ whisker_pen.SetCap(wx.CAP_BUTT)
1100
+ dc.SetPen(whisker_pen)
1101
+ dc.DrawLines(whisker_line)
1102
+
1103
+ @TempStyle('pen')
1104
+ def _draw_iqr_box(self, dc, printerScale):
1105
+ """Draws the Inner Quartile Range box"""
1106
+ xpos = self.xpos
1107
+ box_w = self.box_width
1108
+
1109
+ iqr_box = [[xpos - box_w / 2, self._bpdata.q75], # left, top
1110
+ [xpos + box_w / 2, self._bpdata.q25]] # right, bottom
1111
+
1112
+ # Scale it to the plot area
1113
+ iqr_box = self._scaleAndShift(iqr_box,
1114
+ self.currentScale,
1115
+ self.currentShift)
1116
+
1117
+ # rectangles are drawn (left, top, width, height) so adjust
1118
+ iqr_box = [iqr_box[0][0], # X (left)
1119
+ iqr_box[0][1], # Y (top)
1120
+ iqr_box[1][0] - iqr_box[0][0], # Width
1121
+ iqr_box[1][1] - iqr_box[0][1]] # Height
1122
+
1123
+ box_pen = wx.Pen(wx.BLACK, 3, wx.PENSTYLE_SOLID)
1124
+ box_brush = wx.Brush(wx.GREEN, wx.BRUSHSTYLE_SOLID)
1125
+ dc.SetPen(box_pen)
1126
+ dc.SetBrush(box_brush)
1127
+
1128
+ dc.DrawRectangleList([np.array(iqr_box, dtype = int)])
1129
+
1130
+ @TempStyle('pen')
1131
+ def _draw_median(self, dc, printerScale, coord=None):
1132
+ """Draws the median line"""
1133
+ xpos = self.xpos
1134
+
1135
+ median_line = np.array(
1136
+ [[xpos - self.box_width / 2, self._bpdata.median],
1137
+ [xpos + self.box_width / 2, self._bpdata.median]]
1138
+ )
1139
+
1140
+ median_line = self._scaleAndShift(median_line,
1141
+ self.currentScale,
1142
+ self.currentShift)
1143
+
1144
+ median_pen = wx.Pen(wx.BLACK, 4, wx.PENSTYLE_SOLID)
1145
+ median_pen.SetCap(wx.CAP_BUTT)
1146
+ dc.SetPen(median_pen)
1147
+ dc.DrawLines(median_line)
1148
+
1149
+ @TempStyle('pen')
1150
+ def _draw_whisker_ends(self, dc, printerScale):
1151
+ """Draws the end caps of the whiskers"""
1152
+ xpos = self.xpos
1153
+ fence_top = np.array(
1154
+ [[xpos - self.box_width * 0.2, self._bpdata.high_whisker],
1155
+ [xpos + self.box_width * 0.2, self._bpdata.high_whisker]]
1156
+ )
1157
+
1158
+ fence_top = self._scaleAndShift(fence_top,
1159
+ self.currentScale,
1160
+ self.currentShift)
1161
+
1162
+ fence_bottom = np.array(
1163
+ [[xpos - self.box_width * 0.2, self._bpdata.low_whisker],
1164
+ [xpos + self.box_width * 0.2, self._bpdata.low_whisker]]
1165
+ )
1166
+
1167
+ fence_bottom = self._scaleAndShift(fence_bottom,
1168
+ self.currentScale,
1169
+ self.currentShift)
1170
+
1171
+ fence_pen = wx.Pen(wx.BLACK, 2, wx.PENSTYLE_SOLID)
1172
+ fence_pen.SetCap(wx.CAP_BUTT)
1173
+ dc.SetPen(fence_pen)
1174
+ dc.DrawLines(fence_top)
1175
+ dc.DrawLines(fence_bottom)
1176
+
1177
+ @TempStyle('pen')
1178
+ def _draw_outliers(self, dc, printerScale):
1179
+ """Draws dots for the outliers"""
1180
+ # Set the pen
1181
+ outlier_pen = wx.Pen(wx.BLUE, 5, wx.PENSTYLE_SOLID)
1182
+ dc.SetPen(outlier_pen)
1183
+
1184
+ outliers = self._outliers
1185
+
1186
+ # Scale the data for plotting
1187
+ pt_data = np.array([self.jitter, outliers]).T
1188
+ pt_data = self._scaleAndShift(pt_data,
1189
+ self.currentScale,
1190
+ self.currentShift)
1191
+
1192
+ # Draw the outliers
1193
+ size = 0.5
1194
+ fact = 2.5 * size
1195
+ wh = 5.0 * size
1196
+ rect = np.zeros((len(pt_data), 4), float) + [0.0, 0.0, wh, wh]
1197
+ rect[:, 0:2] = pt_data - [fact, fact]
1198
+ dc.DrawRectangleList(rect.astype(np.int32))
1199
+
1200
+
1201
+ class PlotGraphics(object):
1202
+ """
1203
+ Creates a PlotGraphics object.
1204
+
1205
+ :param objects: The Poly objects to plot.
1206
+ :type objects: list of :class:`~wx.lib.plot.PolyPoints` objects
1207
+ :param title: The title shown at the top of the graph.
1208
+ :type title: str
1209
+ :param xLabel: The x-axis label.
1210
+ :type xLabel: str
1211
+ :param yLabel: The y-axis label.
1212
+ :type yLabel: str
1213
+
1214
+ .. warning::
1215
+
1216
+ All methods except ``__init__`` are private.
1217
+ """
1218
+ def __init__(self, objects, title='', xLabel='', yLabel=''):
1219
+ if type(objects) not in [list, tuple]:
1220
+ raise TypeError("objects argument should be list or tuple")
1221
+ self.objects = objects
1222
+ self._title = title
1223
+ self._xLabel = xLabel
1224
+ self._yLabel = yLabel
1225
+ self._pointSize = (1.0, 1.0)
1226
+
1227
+ @property
1228
+ def logScale(self):
1229
+ if len(self.objects) == 0:
1230
+ return
1231
+ return [obj.logScale for obj in self.objects]
1232
+
1233
+ @logScale.setter
1234
+ def logScale(self, logscale):
1235
+ # XXX: error checking done by PolyPoints class
1236
+ # if not isinstance(logscale, tuple) and len(logscale) != 2:
1237
+ # raise TypeError("logscale must be a 2-tuple of bools")
1238
+ if len(self.objects) == 0:
1239
+ return
1240
+ for obj in self.objects:
1241
+ obj.logScale = logscale
1242
+
1243
+ def setLogScale(self, logscale):
1244
+ """
1245
+ Set the log scale boolean value.
1246
+
1247
+ .. deprecated:: Feb 27, 2016
1248
+
1249
+ Use the :attr:`~wx.lib.plot.polyobjects.PlotGraphics.logScale`
1250
+ property instead.
1251
+ """
1252
+ pendingDeprecation("self.logScale property")
1253
+ self.logScale = logscale
1254
+
1255
+ @property
1256
+ def absScale(self):
1257
+ if len(self.objects) == 0:
1258
+ return
1259
+ return [obj.absScale for obj in self.objects]
1260
+
1261
+ @absScale.setter
1262
+ def absScale(self, absscale):
1263
+ # XXX: error checking done by PolyPoints class
1264
+ # if not isinstance(absscale, tuple) and len(absscale) != 2:
1265
+ # raise TypeError("absscale must be a 2-tuple of bools")
1266
+ if len(self.objects) == 0:
1267
+ return
1268
+ for obj in self.objects:
1269
+ obj.absScale = absscale
1270
+
1271
+ def boundingBox(self):
1272
+ p1, p2 = self.objects[0].boundingBox()
1273
+ for o in self.objects[1:]:
1274
+ p1o, p2o = o.boundingBox()
1275
+ p1 = np.minimum(p1, p1o)
1276
+ p2 = np.maximum(p2, p2o)
1277
+ return p1, p2
1278
+
1279
+ def scaleAndShift(self, scale=(1, 1), shift=(0, 0)):
1280
+ for o in self.objects:
1281
+ o.scaleAndShift(scale, shift)
1282
+
1283
+ def setPrinterScale(self, scale):
1284
+ """
1285
+ Thickens up lines and markers only for printing
1286
+
1287
+ .. deprecated:: Feb 27, 2016
1288
+
1289
+ Use the :attr:`~wx.lib.plot.polyobjects.PlotGraphics.printerScale`
1290
+ property instead.
1291
+ """
1292
+ pendingDeprecation("self.printerScale property")
1293
+ self.printerScale = scale
1294
+
1295
+ def setXLabel(self, xLabel=''):
1296
+ """
1297
+ Set the X axis label on the graph
1298
+
1299
+ .. deprecated:: Feb 27, 2016
1300
+
1301
+ Use the :attr:`~wx.lib.plot.polyobjects.PlotGraphics.xLabel`
1302
+ property instead.
1303
+ """
1304
+ pendingDeprecation("self.xLabel property")
1305
+ self.xLabel = xLabel
1306
+
1307
+ def setYLabel(self, yLabel=''):
1308
+ """
1309
+ Set the Y axis label on the graph
1310
+
1311
+ .. deprecated:: Feb 27, 2016
1312
+
1313
+ Use the :attr:`~wx.lib.plot.polyobjects.PlotGraphics.yLabel`
1314
+ property instead.
1315
+ """
1316
+ pendingDeprecation("self.yLabel property")
1317
+ self.yLabel = yLabel
1318
+
1319
+ def setTitle(self, title=''):
1320
+ """
1321
+ Set the title at the top of graph
1322
+
1323
+ .. deprecated:: Feb 27, 2016
1324
+
1325
+ Use the :attr:`~wx.lib.plot.polyobjects.PlotGraphics.title`
1326
+ property instead.
1327
+ """
1328
+ pendingDeprecation("self.title property")
1329
+ self.title = title
1330
+
1331
+ def getXLabel(self):
1332
+ """
1333
+ Get X axis label string
1334
+
1335
+ .. deprecated:: Feb 27, 2016
1336
+
1337
+ Use the :attr:`~wx.lib.plot.polyobjects.PlotGraphics.xLabel`
1338
+ property instead.
1339
+ """
1340
+ pendingDeprecation("self.xLabel property")
1341
+ return self.xLabel
1342
+
1343
+ def getYLabel(self):
1344
+ """
1345
+ Get Y axis label string
1346
+
1347
+ .. deprecated:: Feb 27, 2016
1348
+
1349
+ Use the :attr:`~wx.lib.plot.polyobjects.PlotGraphics.yLabel`
1350
+ property instead.
1351
+ """
1352
+ pendingDeprecation("self.yLabel property")
1353
+ return self.yLabel
1354
+
1355
+ def getTitle(self, title=''):
1356
+ """
1357
+ Get the title at the top of graph
1358
+
1359
+ .. deprecated:: Feb 27, 2016
1360
+
1361
+ Use the :attr:`~wx.lib.plot.polyobjects.PlotGraphics.title`
1362
+ property instead.
1363
+ """
1364
+ pendingDeprecation("self.title property")
1365
+ return self.title
1366
+
1367
+ @property
1368
+ def printerScale(self):
1369
+ return self._printerScale
1370
+
1371
+ @printerScale.setter
1372
+ def printerScale(self, scale):
1373
+ """Thickens up lines and markers only for printing"""
1374
+ self._printerScale = scale
1375
+
1376
+ @property
1377
+ def xLabel(self):
1378
+ """Get the X axis label on the graph"""
1379
+ return self._xLabel
1380
+
1381
+ @xLabel.setter
1382
+ def xLabel(self, text):
1383
+ self._xLabel = text
1384
+
1385
+ @property
1386
+ def yLabel(self):
1387
+ """Get the Y axis label on the graph"""
1388
+ return self._yLabel
1389
+
1390
+ @yLabel.setter
1391
+ def yLabel(self, text):
1392
+ self._yLabel = text
1393
+
1394
+ @property
1395
+ def title(self):
1396
+ """Get the title at the top of graph"""
1397
+ return self._title
1398
+
1399
+ @title.setter
1400
+ def title(self, text):
1401
+ self._title = text
1402
+
1403
+ def draw(self, dc):
1404
+ for o in self.objects:
1405
+ # t=_time.perf_counter() # profile info
1406
+ o._pointSize = self._pointSize
1407
+ o.draw(dc, self._printerScale)
1408
+ # print(o, "time=", _time.perf_counter()-t)
1409
+
1410
+ def getSymExtent(self, printerScale):
1411
+ """Get max width and height of lines and markers symbols for legend"""
1412
+ self.objects[0]._pointSize = self._pointSize
1413
+ symExt = self.objects[0].getSymExtent(printerScale)
1414
+ for o in self.objects[1:]:
1415
+ o._pointSize = self._pointSize
1416
+ oSymExt = o.getSymExtent(printerScale)
1417
+ symExt = np.maximum(symExt, oSymExt)
1418
+ return symExt
1419
+
1420
+ def getLegendNames(self):
1421
+ """Returns list of legend names"""
1422
+ lst = [None] * len(self)
1423
+ for i in range(len(self)):
1424
+ lst[i] = self.objects[i].getLegend()
1425
+ return lst
1426
+
1427
+ def __len__(self):
1428
+ return len(self.objects)
1429
+
1430
+ def __getitem__(self, item):
1431
+ return self.objects[item]
1432
+
1433
+
1434
+ # -------------------------------------------------------------------------
1435
+ # Used to layout the printer page
1436
+
1437
+
1438
+ class PlotPrintout(wx.Printout):
1439
+ """Controls how the plot is made in printing and previewing"""
1440
+ # Do not change method names in this class,
1441
+ # we have to override wx.Printout methods here!
1442
+
1443
+ def __init__(self, graph):
1444
+ """graph is instance of plotCanvas to be printed or previewed"""
1445
+ wx.Printout.__init__(self)
1446
+ self.graph = graph
1447
+
1448
+ def HasPage(self, page):
1449
+ if page == 1:
1450
+ return True
1451
+ else:
1452
+ return False
1453
+
1454
+ def GetPageInfo(self):
1455
+ return (1, 1, 1, 1) # disable page numbers
1456
+
1457
+ def OnPrintPage(self, page):
1458
+ dc = self.GetDC() # allows using floats for certain functions
1459
+ # print("PPI Printer",self.GetPPIPrinter())
1460
+ # print("PPI Screen", self.GetPPIScreen())
1461
+ # print("DC GetSize", dc.GetSize())
1462
+ # print("GetPageSizePixels", self.GetPageSizePixels())
1463
+ # Note PPIScreen does not give the correct number
1464
+ # Calulate everything for printer and then scale for preview
1465
+ PPIPrinter = self.GetPPIPrinter() # printer dots/inch (w,h)
1466
+ # PPIScreen= self.GetPPIScreen() # screen dots/inch (w,h)
1467
+ dcSize = dc.GetSize() # DC size
1468
+ if self.graph._antiAliasingEnabled and not isinstance(dc, wx.GCDC):
1469
+ try:
1470
+ dc = wx.GCDC(dc)
1471
+ except Exception:
1472
+ pass
1473
+ else:
1474
+ if self.graph._hiResEnabled:
1475
+ # high precision - each logical unit is 1/20 of a point
1476
+ dc.SetMapMode(wx.MM_TWIPS)
1477
+ pageSize = self.GetPageSizePixels() # page size in terms of pixcels
1478
+ clientDcSize = self.graph.GetClientSize()
1479
+
1480
+ # find what the margins are (mm)
1481
+ pgSetupData = self.graph.pageSetupData
1482
+ margLeftSize, margTopSize = pgSetupData.GetMarginTopLeft()
1483
+ margRightSize, margBottomSize = pgSetupData.GetMarginBottomRight()
1484
+
1485
+ # calculate offset and scale for dc
1486
+ pixLeft = margLeftSize * PPIPrinter[0] / 25.4 # mm*(dots/in)/(mm/in)
1487
+ pixRight = margRightSize * PPIPrinter[0] / 25.4
1488
+ pixTop = margTopSize * PPIPrinter[1] / 25.4
1489
+ pixBottom = margBottomSize * PPIPrinter[1] / 25.4
1490
+
1491
+ plotAreaW = pageSize[0] - (pixLeft + pixRight)
1492
+ plotAreaH = pageSize[1] - (pixTop + pixBottom)
1493
+
1494
+ # ratio offset and scale to screen size if preview
1495
+ if self.IsPreview():
1496
+ ratioW = float(dcSize[0]) / pageSize[0]
1497
+ ratioH = float(dcSize[1]) / pageSize[1]
1498
+ pixLeft *= ratioW
1499
+ pixTop *= ratioH
1500
+ plotAreaW *= ratioW
1501
+ plotAreaH *= ratioH
1502
+
1503
+ # rescale plot to page or preview plot area
1504
+ self.graph._setSize(plotAreaW, plotAreaH)
1505
+
1506
+ # Set offset and scale
1507
+ dc.SetDeviceOrigin(int(pixLeft), int(pixTop))
1508
+
1509
+ # Thicken up pens and increase marker size for printing
1510
+ ratioW = float(plotAreaW) / clientDcSize[0]
1511
+ ratioH = float(plotAreaH) / clientDcSize[1]
1512
+ aveScale = (ratioW + ratioH) / 2
1513
+ if self.graph._antiAliasingEnabled and not self.IsPreview():
1514
+ scale = dc.GetUserScale()
1515
+ dc.SetUserScale(scale[0] / self.graph._pointSize[0],
1516
+ scale[1] / self.graph._pointSize[1])
1517
+ self.graph._setPrinterScale(aveScale) # tickens up pens for printing
1518
+
1519
+ self.graph._printDraw(dc)
1520
+ # rescale back to original
1521
+ self.graph._setSize()
1522
+ self.graph._setPrinterScale(1)
1523
+ self.graph.Redraw() # to get point label scale and shift correct
1524
+
1525
+ return True