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,2981 @@
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
+ plotcanvas.py
9
+ =============
10
+
11
+ This is the main window that you will want to import into your application.
12
+
13
+ """
14
+ __docformat__ = "restructuredtext en"
15
+
16
+ # Standard Library
17
+ import sys
18
+ import time as _time
19
+
20
+ # Third-Party
21
+ import wx
22
+ import numpy as np
23
+
24
+ # Package
25
+ from .polyobjects import PlotPrintout
26
+ from .polyobjects import PolyMarker, PolyLine, PolyBoxPlot
27
+ from .utils import DisplaySide
28
+ from .utils import set_displayside
29
+ from .utils import pendingDeprecation
30
+ from .utils import TempStyle
31
+ from .utils import scale_and_shift_point
32
+
33
+
34
+ class PlotCanvas(wx.Panel):
35
+ """
36
+ Creates a PlotCanvas object.
37
+
38
+ Subclass of a wx.Panel which holds two scrollbars and the actual
39
+ plotting canvas (self.canvas). It allows for simple general plotting
40
+ of data with zoom, labels, and automatic axis scaling.
41
+
42
+ This is the main window that you will want to import into your
43
+ application.
44
+
45
+ Parameters for ``__init__`` are the same as any :class:`wx.Panel`.
46
+ """
47
+
48
+ def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
49
+ size=wx.DefaultSize, style=0, name="plotCanvas"):
50
+ wx.Panel.__init__(self, parent, id, pos, size, style, name)
51
+
52
+ sizer = wx.FlexGridSizer(2, 2, 0, 0)
53
+ self.canvas = wx.Window(self, -1)
54
+ self.sb_vert = wx.ScrollBar(self, -1, style=wx.SB_VERTICAL)
55
+ self.sb_vert.SetScrollbar(0, 1000, 1000, 1000)
56
+ self.sb_hor = wx.ScrollBar(self, -1, style=wx.SB_HORIZONTAL)
57
+ self.sb_hor.SetScrollbar(0, 1000, 1000, 1000)
58
+
59
+ sizer.Add(self.canvas, 1, wx.EXPAND)
60
+ sizer.Add(self.sb_vert, 0, wx.EXPAND)
61
+ sizer.Add(self.sb_hor, 0, wx.EXPAND)
62
+ sizer.Add((0, 0))
63
+
64
+ self.sb_vert.Show(False)
65
+ self.sb_hor.Show(False)
66
+
67
+ self.SetSizer(sizer)
68
+ sizer.AddGrowableRow(0, 1)
69
+ sizer.AddGrowableCol(0, 1)
70
+ self.Fit()
71
+
72
+ self.border = (1, 1)
73
+
74
+ self.SetBackgroundColour("white")
75
+
76
+ # Create some mouse events for zooming
77
+ self.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
78
+ self.canvas.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp)
79
+ self.canvas.Bind(wx.EVT_MOTION, self.OnMotion)
80
+ self.canvas.Bind(wx.EVT_LEFT_DCLICK, self.OnMouseDoubleClick)
81
+ self.canvas.Bind(wx.EVT_RIGHT_DOWN, self.OnMouseRightDown)
82
+
83
+ # scrollbar events
84
+ self.Bind(wx.EVT_SCROLL_THUMBTRACK, self.OnScroll)
85
+ self.Bind(wx.EVT_SCROLL_PAGEUP, self.OnScroll)
86
+ self.Bind(wx.EVT_SCROLL_PAGEDOWN, self.OnScroll)
87
+ self.Bind(wx.EVT_SCROLL_LINEUP, self.OnScroll)
88
+ self.Bind(wx.EVT_SCROLL_LINEDOWN, self.OnScroll)
89
+
90
+ # set curser as cross-hairs
91
+ self.defaultCursor = wx.Cursor(wx.CURSOR_ARROW)
92
+ self.HandCursor = wx.Cursor(wx.CURSOR_SIZING)
93
+ self.GrabHandCursor = wx.Cursor(wx.CURSOR_SIZING)
94
+ self.MagCursor = wx.Cursor(wx.CURSOR_MAGNIFIER)
95
+ self.canvas.SetCursor(self.defaultCursor)
96
+
97
+ # Things for printing
98
+ self._print_data = None
99
+ self._pageSetupData = None
100
+ self.printerScale = 1
101
+ self.parent = parent
102
+
103
+ # scrollbar variables
104
+ self._sb_ignore = False
105
+ self._sb_show = False
106
+ self._adjustingSB = False
107
+ self._sb_xfullrange = 0
108
+ self._sb_yfullrange = 0
109
+ self._sb_xunit = 0
110
+ self._sb_yunit = 0
111
+
112
+ self._screenCoordinates = np.array([0.0, 0.0])
113
+
114
+ # Zooming variables
115
+ self._zoomInFactor = 0.5
116
+ self._zoomOutFactor = 2
117
+ self._zoomCorner1 = np.array([0.0, 0.0]) # left mouse down corner
118
+ self._zoomCorner2 = np.array([0.0, 0.0]) # left mouse up corner
119
+ self._zoomEnabled = False
120
+ self._hasDragged = False
121
+
122
+ # Drawing Variables
123
+ self.last_draw = None
124
+ self._pointScale = 1
125
+ self._pointShift = 0
126
+ self._xSpec = 'auto'
127
+ self._ySpec = 'auto'
128
+
129
+ # Initial Plot Options
130
+ self._dragEnabled = False
131
+ self._logscale = (False, False)
132
+ self._absScale = (False, False)
133
+ self._gridEnabled = (True, True)
134
+ self._legendEnabled = False
135
+ self._titleEnabled = True
136
+ self._xAxisLabelEnabled = True
137
+ self._yAxisLabelEnabled = True
138
+ self._axesLabelsEnabled = True
139
+ self._centerLinesEnabled = False
140
+ self._diagonalsEnabled = False
141
+ self._ticksEnabled = DisplaySide(False, False, False, False)
142
+ self._axesEnabled = DisplaySide(True, True, True, True)
143
+ self._axesValuesEnabled = DisplaySide(True, True, False, False)
144
+
145
+ # Fonts
146
+ self._fontCache = {}
147
+ self._fontSizeAxis = 10
148
+ self._fontSizeTitle = 15
149
+ self._fontSizeLegend = 7
150
+
151
+ # pointLabels
152
+ self._pointLabelEnabled = False
153
+ self.last_PointLabel = None
154
+ self._pointLabelFunc = None
155
+ self.canvas.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave)
156
+ if sys.platform != "darwin":
157
+ self._logicalFunction = wx.EQUIV # (NOT src) XOR dst
158
+ else:
159
+ # wx.EQUIV not supported on Mac OS X
160
+ self._logicalFunction = wx.COPY
161
+
162
+ self._useScientificNotation = False
163
+
164
+ self._antiAliasingEnabled = False
165
+ self._hiResEnabled = False
166
+ self._pointSize = (1, 1)
167
+ self._fontScale = 1
168
+
169
+ self.canvas.Bind(wx.EVT_PAINT, self.OnPaint)
170
+ self.canvas.Bind(wx.EVT_SIZE, self.OnSize)
171
+ # OnSize called to make sure the buffer is initialized.
172
+ # This might result in OnSize getting called twice on some
173
+ # platforms at initialization, but little harm done.
174
+ self.OnSize(None) # sets the initial size based on client size
175
+
176
+ # Default Pens
177
+ self._gridPen = wx.Pen(wx.Colour(180, 180, 180, 255),
178
+ self._pointSize[0],
179
+ wx.PENSTYLE_DOT)
180
+
181
+ self._centerLinePen = wx.Pen(wx.RED,
182
+ self._pointSize[0],
183
+ wx.PENSTYLE_SHORT_DASH)
184
+
185
+ self._axesPen = wx.Pen(wx.BLACK,
186
+ self._pointSize[0],
187
+ wx.PENSTYLE_SOLID)
188
+
189
+ self._tickPen = wx.Pen(wx.BLACK,
190
+ self._pointSize[0],
191
+ wx.PENSTYLE_SOLID)
192
+ self._tickLength = tuple(-x * 2 for x in self._pointSize)
193
+
194
+ self._diagonalPen = wx.Pen(wx.BLUE,
195
+ self._pointSize[0],
196
+ wx.PENSTYLE_DOT_DASH)
197
+
198
+ def SetCursor(self, cursor):
199
+ self.canvas.SetCursor(cursor)
200
+
201
+ ### Pen Properties
202
+ @property
203
+ def gridPen(self):
204
+ """
205
+ The :class:`wx.Pen` used to draw the grid lines on the plot.
206
+
207
+ :getter: Returns the :class:`wx.Pen` used for drawing the grid
208
+ lines.
209
+ :setter: Sets the :class:`wx.Pen` use for drawging the grid lines.
210
+ :type: :class:`wx.Pen`
211
+ :raise: `TypeError` when setting a value that is not a
212
+ :class:`wx.Pen`.
213
+ """
214
+ return self._gridPen
215
+
216
+ @gridPen.setter
217
+ def gridPen(self, pen):
218
+ if not isinstance(pen, wx.Pen):
219
+ raise TypeError("pen must be an instance of wx.Pen")
220
+ self._gridPen = pen
221
+
222
+ @property
223
+ def diagonalPen(self):
224
+ """
225
+ The :class:`wx.Pen` used to draw the diagonal lines on the plot.
226
+
227
+ :getter: Returns the :class:`wx.Pen` used for drawing the diagonal
228
+ lines.
229
+ :setter: Sets the :class:`wx.Pen` use for drawging the diagonal lines.
230
+ :type: :class:`wx.Pen`
231
+ :raise: `TypeError` when setting a value that is not a
232
+ :class:`wx.Pen`.
233
+ """
234
+ return self._diagonalPen
235
+
236
+ @diagonalPen.setter
237
+ def diagonalPen(self, pen):
238
+ if not isinstance(pen, wx.Pen):
239
+ raise TypeError("pen must be an instance of wx.Pen")
240
+ self._diagonalPen = pen
241
+
242
+ @property
243
+ def centerLinePen(self):
244
+ """
245
+ The :class:`wx.Pen` used to draw the center lines on the plot.
246
+
247
+ :getter: Returns the :class:`wx.Pen` used for drawing the center
248
+ lines.
249
+ :setter: Sets the :class:`wx.Pen` use for drawging the center lines.
250
+ :type: :class:`wx.Pen`
251
+ :raise: `TypeError` when setting a value that is not a
252
+ :class:`wx.Pen`.
253
+ """
254
+ return self._centerLinePen
255
+
256
+ @centerLinePen.setter
257
+ def centerLinePen(self, pen):
258
+ if not isinstance(pen, wx.Pen):
259
+ raise TypeError("pen must be an instance of wx.Pen")
260
+ self._centerLinePen = pen
261
+
262
+ @property
263
+ def axesPen(self):
264
+ """
265
+ The :class:`wx.Pen` used to draw the axes lines on the plot.
266
+
267
+ :getter: Returns the :class:`wx.Pen` used for drawing the axes
268
+ lines.
269
+ :setter: Sets the :class:`wx.Pen` use for drawging the axes lines.
270
+ :type: :class:`wx.Pen`
271
+ :raise: `TypeError` when setting a value that is not a
272
+ :class:`wx.Pen`.
273
+ """
274
+ return self._axesPen
275
+
276
+ @axesPen.setter
277
+ def axesPen(self, pen):
278
+ if not isinstance(pen, wx.Pen):
279
+ raise TypeError("pen must be an instance of wx.Pen")
280
+ self._axesPen = pen
281
+
282
+ @property
283
+ def tickPen(self):
284
+ """
285
+ The :class:`wx.Pen` used to draw the tick marks on the plot.
286
+
287
+ :getter: Returns the :class:`wx.Pen` used for drawing the tick marks.
288
+ :setter: Sets the :class:`wx.Pen` use for drawging the tick marks.
289
+ :type: :class:`wx.Pen`
290
+ :raise: `TypeError` when setting a value that is not a
291
+ :class:`wx.Pen`.
292
+ """
293
+ return self._tickPen
294
+
295
+ @tickPen.setter
296
+ def tickPen(self, pen):
297
+ if not isinstance(pen, wx.Pen):
298
+ raise TypeError("pen must be an instance of wx.Pen")
299
+ self._tickPen = pen
300
+
301
+ @property
302
+ def tickLength(self):
303
+ """
304
+ The length of the tick marks on an axis.
305
+
306
+ :getter: Returns the length of the tick marks.
307
+ :setter: Sets the length of the tick marks.
308
+ :type: tuple of (xlength, ylength): int or float
309
+ :raise: `TypeError` when setting a value that is not an int or float.
310
+ """
311
+ return self._tickLength
312
+
313
+ @tickLength.setter
314
+ def tickLength(self, length):
315
+ if not isinstance(length, (tuple, list)):
316
+ raise TypeError("`length` must be a 2-tuple of ints or floats")
317
+ self._tickLength = length
318
+
319
+ @property
320
+ def tickLengthPrinterScale(self):
321
+ return (3 * self.printerScale * self._tickLength[0],
322
+ 3 * self.printerScale * self._tickLength[1])
323
+
324
+ # SaveFile
325
+ def SaveFile(self, fileName=''):
326
+ """
327
+ Saves the file to the type specified in the extension. If no file
328
+ name is specified a dialog box is provided. Returns True if
329
+ sucessful, otherwise False.
330
+
331
+ .bmp Save a Windows bitmap file.
332
+ .xbm Save an X bitmap file.
333
+ .xpm Save an XPM bitmap file.
334
+ .png Save a Portable Network Graphics file.
335
+ .jpg Save a Joint Photographic Experts Group file.
336
+
337
+ """
338
+ extensions = {
339
+ "bmp": wx.BITMAP_TYPE_BMP, # Save a Windows bitmap file.
340
+ "xbm": wx.BITMAP_TYPE_XBM, # Save an X bitmap file.
341
+ "xpm": wx.BITMAP_TYPE_XPM, # Save an XPM bitmap file.
342
+ "jpg": wx.BITMAP_TYPE_JPEG, # Save a JPG file.
343
+ "png": wx.BITMAP_TYPE_PNG, # Save a PNG file.
344
+ }
345
+
346
+ fType = fileName[-3:].lower()
347
+ dlg1 = None
348
+ while fType not in extensions:
349
+
350
+ msg_txt = ('File name extension\n' # implicit str concat
351
+ 'must be one of\nbmp, xbm, xpm, png, or jpg')
352
+
353
+ if dlg1: # FileDialog exists: Check for extension
354
+ dlg2 = wx.MessageDialog(self, msg_txt, 'File Name Error',
355
+ wx.OK | wx.ICON_ERROR)
356
+ try:
357
+ dlg2.ShowModal()
358
+ finally:
359
+ dlg2.Destroy()
360
+ # FileDialog doesn't exist: just check one
361
+ else:
362
+ msg_txt = ("Choose a file with extension bmp, "
363
+ "gif, xbm, xpm, png, or jpg")
364
+ wildcard_str = ("BMP files (*.bmp)|*.bmp|XBM files (*.xbm)|"
365
+ "*.xbm|XPM file (*.xpm)|*.xpm|"
366
+ "PNG files (*.png)|*.png|"
367
+ "JPG files (*.jpg)|*.jpg")
368
+ dlg1 = wx.FileDialog(self,
369
+ msg_txt,
370
+ ".",
371
+ "",
372
+ wildcard_str,
373
+ wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT,
374
+ )
375
+
376
+ if dlg1.ShowModal() == wx.ID_OK:
377
+ fileName = dlg1.GetPath()
378
+ fType = fileName[-3:].lower()
379
+ else: # exit without saving
380
+ dlg1.Destroy()
381
+ return False
382
+
383
+ if dlg1:
384
+ dlg1.Destroy()
385
+
386
+ # Save Bitmap
387
+ res = self._Buffer.SaveFile(fileName, extensions[fType])
388
+ return res
389
+
390
+ @property
391
+ def print_data(self):
392
+ if not self._print_data:
393
+ self._print_data = wx.PrintData()
394
+ self._print_data.SetPaperId(wx.PAPER_LETTER)
395
+ self._print_data.SetOrientation(wx.LANDSCAPE)
396
+ return self._print_data
397
+
398
+ @property
399
+ def pageSetupData(self):
400
+ if not self._pageSetupData:
401
+ self._pageSetupData = wx.PageSetupDialogData()
402
+ self._pageSetupData.SetMarginBottomRight((25, 25))
403
+ self._pageSetupData.SetMarginTopLeft((25, 25))
404
+ self._pageSetupData.SetPrintData(self.print_data)
405
+ return self._pageSetupData
406
+
407
+ def PageSetup(self):
408
+ """Brings up the page setup dialog"""
409
+ data = self.pageSetupData
410
+ data.SetPrintData(self.print_data)
411
+ dlg = wx.PageSetupDialog(self.parent, data)
412
+ try:
413
+ if dlg.ShowModal() == wx.ID_OK:
414
+ data = dlg.GetPageSetupData()
415
+ # updates page parameters from dialog
416
+ self.pageSetupData.SetMarginBottomRight(
417
+ data.GetMarginBottomRight())
418
+ self.pageSetupData.SetMarginTopLeft(data.GetMarginTopLeft())
419
+ self.pageSetupData.SetPrintData(data.GetPrintData())
420
+ self._print_data = wx.PrintData(
421
+ data.GetPrintData()) # updates print_data
422
+ finally:
423
+ dlg.Destroy()
424
+
425
+ def Printout(self, paper=None):
426
+ """Print current plot."""
427
+ if paper is not None:
428
+ self.print_data.SetPaperId(paper)
429
+ pdd = wx.PrintDialogData(self.print_data)
430
+ printer = wx.Printer(pdd)
431
+ out = PlotPrintout(self)
432
+ print_ok = printer.Print(self.parent, out)
433
+ if print_ok:
434
+ self._print_data = wx.PrintData(
435
+ printer.GetPrintDialogData().GetPrintData())
436
+ out.Destroy()
437
+
438
+ def PrintPreview(self):
439
+ """Print-preview current plot."""
440
+ printout = PlotPrintout(self)
441
+ printout2 = PlotPrintout(self)
442
+ self.preview = wx.PrintPreview(printout, printout2, self.print_data)
443
+ if not self.preview.IsOk():
444
+ wx.MessageDialog(self, "Print Preview failed.\n"
445
+ "Check that default printer is configured\n",
446
+ "Print error", wx.OK | wx.CENTRE).ShowModal()
447
+ self.preview.SetZoom(40)
448
+ # search up tree to find frame instance
449
+ frameInst = self
450
+ while not isinstance(frameInst, wx.Frame):
451
+ frameInst = frameInst.GetParent()
452
+ frame = wx.PreviewFrame(self.preview, frameInst, "Preview")
453
+ frame.Initialize()
454
+ frame.SetPosition(self.GetPosition())
455
+ frame.SetSize((600, 550))
456
+ frame.Centre(wx.BOTH)
457
+ frame.Show(True)
458
+
459
+ def setLogScale(self, logscale):
460
+ """
461
+ Set the log scale boolean value.
462
+
463
+ .. deprecated:: Feb 27, 2016
464
+
465
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.logScale`
466
+ property instead.
467
+ """
468
+ pendingDeprecation("self.logScale property")
469
+ self.logScale = logscale
470
+
471
+ def getLogScale(self):
472
+ """
473
+ Set the log scale boolean value.
474
+
475
+ .. deprecated:: Feb 27, 2016
476
+
477
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.logScale`
478
+ property instead.
479
+ """
480
+ pendingDeprecation("self.logScale property")
481
+ return self.logScale
482
+
483
+ @property
484
+ def logScale(self):
485
+ """
486
+ The logScale value as a 2-tuple of bools:
487
+ ``(x_axis_is_log_scale, y_axis_is_log_scale)``.
488
+
489
+ :getter: Returns the value of logScale.
490
+ :setter: Sets the value of logScale.
491
+ :type: tuple of bools, length 2
492
+ :raise: `TypeError` when setting an invalid value.
493
+ """
494
+ return self._logscale
495
+
496
+ @logScale.setter
497
+ def logScale(self, logscale):
498
+ if type(logscale) != tuple:
499
+ raise TypeError(
500
+ 'logscale must be a tuple of bools, e.g. (False, False)'
501
+ )
502
+ if self.last_draw is not None:
503
+ graphics, xAxis, yAxis = self.last_draw
504
+ graphics.logScale = logscale
505
+ self.last_draw = (graphics, None, None)
506
+ self.xSpec = 'min'
507
+ self.ySpec = 'min'
508
+ self._logscale = logscale
509
+
510
+ @property
511
+ def absScale(self):
512
+ """
513
+ The absScale value as a 2-tuple of bools:
514
+ ``(x_axis_is_abs_scale, y_axis_is_abs_scale)``.
515
+
516
+ :getter: Returns the value of absScale.
517
+ :setter: Sets the value of absScale.
518
+ :type: tuple of bools, length 2
519
+ :raise: `TypeError` when setting an invalid value.
520
+ """
521
+ return self._absScale
522
+
523
+ @absScale.setter
524
+ def absScale(self, absscale):
525
+ if not isinstance(absscale, tuple):
526
+ raise TypeError(
527
+ "absscale must be tuple of bools, e.g. (False, False)"
528
+ )
529
+ if self.last_draw is not None:
530
+ graphics, xAxis, yAxis = self.last_draw
531
+ graphics.absScale = absscale
532
+ self.last_draw = (graphics, None, None)
533
+ self.xSpec = 'min'
534
+ self.ySpec = 'min'
535
+ self._absScale = absscale
536
+
537
+ def SetFontSizeAxis(self, point=10):
538
+ """
539
+ Set the tick and axis label font size (default is 10 point)
540
+
541
+ .. deprecated:: Feb 27, 2016
542
+
543
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.fontSizeAxis`
544
+ property
545
+ instead.
546
+ """
547
+ pendingDeprecation("self.fontSizeAxis property")
548
+ self.fontSizeAxis = point
549
+
550
+ def GetFontSizeAxis(self):
551
+ """
552
+ Get current tick and axis label font size in points
553
+
554
+ .. deprecated:: Feb 27, 2016
555
+
556
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.fontSizeAxis`
557
+ property
558
+ instead.
559
+ """
560
+ pendingDeprecation("self.fontSizeAxis property")
561
+ return self.fontSizeAxis
562
+
563
+ @property
564
+ def fontSizeAxis(self):
565
+ """
566
+ The current tick and axis label font size in points.
567
+
568
+ Default is 10pt font.
569
+
570
+ :getter: Returns the value of fontSizeAxis.
571
+ :setter: Sets the value of fontSizeAxis.
572
+ :type: int or float
573
+ """
574
+ return self._fontSizeAxis
575
+
576
+ @fontSizeAxis.setter
577
+ def fontSizeAxis(self, value):
578
+ self._fontSizeAxis = value
579
+
580
+ def SetFontSizeTitle(self, point=15):
581
+ """
582
+ Set Title font size (default is 15 point)
583
+
584
+ .. deprecated:: Feb 27, 2016
585
+
586
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.fontSizeTitle`
587
+ property instead.
588
+ """
589
+ pendingDeprecation("self.fontSizeTitle property")
590
+ self.fontSizeTitle = point
591
+
592
+ def GetFontSizeTitle(self):
593
+ """
594
+ Get Title font size (default is 15 point)
595
+
596
+ .. deprecated:: Feb 27, 2016
597
+
598
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.fontSizeTitle`
599
+ property instead.
600
+ """
601
+ pendingDeprecation("self.fontSizeTitle property")
602
+ return self.fontSizeTitle
603
+
604
+ @property
605
+ def fontSizeTitle(self):
606
+ """
607
+ The current Title font size in points.
608
+
609
+ Default is 15pt font.
610
+
611
+ :getter: Returns the value of fontSizeTitle.
612
+ :setter: Sets the value of fontSizeTitle.
613
+ :type: int or float
614
+ """
615
+ return self._fontSizeTitle
616
+
617
+ @fontSizeTitle.setter
618
+ def fontSizeTitle(self, pointsize):
619
+ self._fontSizeTitle = pointsize
620
+
621
+ def SetFontSizeLegend(self, point=7):
622
+ """
623
+ Set legend font size (default is 7 point)
624
+
625
+ .. deprecated:: Feb 27, 2016
626
+
627
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.fontSizeLegend'
628
+ property instead.
629
+ """
630
+ pendingDeprecation("self.fontSizeLegend property")
631
+ self.fontSizeLegend = point
632
+
633
+ def GetFontSizeLegend(self):
634
+ """
635
+ Get legend font size (default is 7 point)
636
+
637
+ .. deprecated:: Feb 27, 2016
638
+
639
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.fontSizeLegend'
640
+ property instead.
641
+ """
642
+ return self.fontSizeLegend
643
+
644
+ @property
645
+ def fontSizeLegend(self):
646
+ """
647
+ The current Legned font size in points.
648
+
649
+ Default is 7pt font.
650
+
651
+ :getter: Returns the value of fontSizeLegend.
652
+ :setter: Sets the value of fontSizeLegend.
653
+ :type: int or float
654
+ """
655
+ return self._fontSizeLegend
656
+
657
+ @fontSizeLegend.setter
658
+ def fontSizeLegend(self, point):
659
+ self._fontSizeLegend = point
660
+
661
+ def SetShowScrollbars(self, value):
662
+ """
663
+ Set the showScrollbars value.
664
+
665
+ .. deprecated:: Feb 27, 2016
666
+
667
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.showScrollbars`
668
+ property instead.
669
+ """
670
+ pendingDeprecation("self.showScrollbars property")
671
+ self.showScrollbars = value
672
+
673
+ def GetShowScrollbars(self):
674
+ """
675
+ Get the showScrollbars value.
676
+
677
+ .. deprecated:: Feb 27, 2016
678
+
679
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.showScrollbars`
680
+ property instead.
681
+ """
682
+ pendingDeprecation("self.showScrollbars property")
683
+ return self.showScrollbars
684
+
685
+ @property
686
+ def showScrollbars(self):
687
+ """
688
+ The current showScrollbars value.
689
+
690
+ :getter: Returns the value of showScrollbars.
691
+ :setter: Sets the value of showScrollbars.
692
+ :type: bool
693
+ :raises: `TypeError` if setting a non-boolean value.
694
+ """
695
+ return self._sb_show
696
+
697
+ @showScrollbars.setter
698
+ def showScrollbars(self, value):
699
+ if not isinstance(value, bool):
700
+ raise TypeError("Value should be True or False")
701
+ if value == self._sb_show:
702
+ # no change, so don't do anything
703
+ return
704
+ self._sb_show = value
705
+ self.sb_vert.Show(value)
706
+ self.sb_hor.Show(value)
707
+
708
+ def _do_update():
709
+ self.Layout()
710
+ self._adjustScrollbars()
711
+ wx.CallAfter(_do_update)
712
+
713
+ def SetUseScientificNotation(self, useScientificNotation):
714
+ """
715
+ Set the useScientificNotation value.
716
+
717
+ .. deprecated:: Feb 27, 2016
718
+
719
+ Use the
720
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.useScientificNotation`
721
+ property instead.
722
+ """
723
+ pendingDeprecation("self.useScientificNotation property")
724
+ self.useScientificNotation = useScientificNotation
725
+
726
+ def GetUseScientificNotation(self):
727
+ """
728
+ Get the useScientificNotation value.
729
+
730
+ .. deprecated:: Feb 27, 2016
731
+
732
+ Use the
733
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.useScientificNotation`
734
+ property instead.
735
+ """
736
+ pendingDeprecation("self.useScientificNotation property")
737
+ return self.useScientificNotation
738
+
739
+ @property
740
+ def useScientificNotation(self):
741
+ """
742
+ The current useScientificNotation value.
743
+
744
+ :getter: Returns the value of useScientificNotation.
745
+ :setter: Sets the value of useScientificNotation.
746
+ :type: bool
747
+ :raises: `TypeError` if setting a non-boolean value.
748
+ """
749
+ return self._useScientificNotation
750
+
751
+ @useScientificNotation.setter
752
+ def useScientificNotation(self, value):
753
+ if not isinstance(value, bool):
754
+ raise TypeError("Value should be True or False")
755
+ self._useScientificNotation = value
756
+
757
+ def SetEnableAntiAliasing(self, enableAntiAliasing):
758
+ """
759
+ Set the enableAntiAliasing value.
760
+
761
+ .. deprecated:: Feb 27, 2016
762
+
763
+ Use the
764
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableAntiAliasing`
765
+ property instead.
766
+ """
767
+ pendingDeprecation("self.enableAntiAliasing property")
768
+ self.enableAntiAliasing = enableAntiAliasing
769
+
770
+ def GetEnableAntiAliasing(self):
771
+ """
772
+ Get the enableAntiAliasing value.
773
+
774
+ .. deprecated:: Feb 27, 2016
775
+
776
+ Use the
777
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableAntiAliasing`
778
+ property instead.
779
+ """
780
+ pendingDeprecation("self.enableAntiAliasing property")
781
+ return self.enableAntiAliasing
782
+
783
+ @property
784
+ def enableAntiAliasing(self):
785
+ """
786
+ The current enableAntiAliasing value.
787
+
788
+ :getter: Returns the value of enableAntiAliasing.
789
+ :setter: Sets the value of enableAntiAliasing.
790
+ :type: bool
791
+ :raises: `TypeError` if setting a non-boolean value.
792
+ """
793
+ return self._antiAliasingEnabled
794
+
795
+ @enableAntiAliasing.setter
796
+ def enableAntiAliasing(self, value):
797
+ if not isinstance(value, bool):
798
+ raise TypeError("Value should be True or False")
799
+ self._antiAliasingEnabled = value
800
+ self.Redraw()
801
+
802
+ def SetEnableHiRes(self, enableHiRes):
803
+ """
804
+ Set the enableHiRes value.
805
+
806
+ .. deprecated:: Feb 27, 2016
807
+
808
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableHiRes`
809
+ property instead.
810
+ """
811
+ pendingDeprecation("self.enableHiRes property")
812
+ self.enableHiRes = enableHiRes
813
+
814
+ def GetEnableHiRes(self):
815
+ """
816
+ Get the enableHiRes value.
817
+
818
+ .. deprecated:: Feb 27, 2016
819
+
820
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableHiRes`
821
+ property instead.
822
+ """
823
+ pendingDeprecation("self.enableHiRes property")
824
+ return self._hiResEnabled
825
+
826
+ @property
827
+ def enableHiRes(self):
828
+ """
829
+ The current enableHiRes value.
830
+
831
+ :getter: Returns the value of enableHiRes.
832
+ :setter: Sets the value of enableHiRes.
833
+ :type: bool
834
+ :raises: `TypeError` if setting a non-boolean value.
835
+ """
836
+ return self._hiResEnabled
837
+
838
+ @enableHiRes.setter
839
+ def enableHiRes(self, value):
840
+ if not isinstance(value, bool):
841
+ raise TypeError("Value should be True or False")
842
+ self._hiResEnabled = value
843
+ self.Redraw()
844
+
845
+ def SetEnableDrag(self, value):
846
+ """
847
+ Set the enableDrag value.
848
+
849
+ .. deprecated:: Feb 27, 2016
850
+
851
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableDrag`
852
+ property instead.
853
+ """
854
+ pendingDeprecation("self.enableDrag property")
855
+ self.enableDrag = value
856
+
857
+ def GetEnableDrag(self):
858
+ """
859
+ Get the enableDrag value.
860
+
861
+ .. deprecated:: Feb 27, 2016
862
+
863
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableDrag`
864
+ property instead.
865
+ """
866
+ pendingDeprecation("self.enableDrag property")
867
+ return self.enableDrag
868
+
869
+ @property
870
+ def enableDrag(self):
871
+ """
872
+ The current enableDrag value.
873
+
874
+ :getter: Returns the value of enableDrag.
875
+ :setter: Sets the value of enableDrag.
876
+ :type: bool
877
+ :raises: `TypeError` if setting a non-boolean value.
878
+
879
+ .. note::
880
+ This is mutually exclusive with
881
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableZoom`. Setting
882
+ one will disable the other.
883
+
884
+ .. seealso::
885
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableZoom`
886
+ """
887
+ return self._dragEnabled
888
+
889
+ @enableDrag.setter
890
+ def enableDrag(self, value):
891
+ if not isinstance(value, bool):
892
+ raise TypeError("Value must be a bool.")
893
+ if value:
894
+ if self.enableZoom:
895
+ self.enableZoom = False
896
+ self.SetCursor(self.HandCursor)
897
+ else:
898
+ self.SetCursor(self.defaultCursor)
899
+ self._dragEnabled = value
900
+
901
+ def SetEnableZoom(self, value):
902
+ """
903
+ Set the enableZoom value.
904
+
905
+ .. deprecated:: Feb 27, 2016
906
+
907
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableZoom`
908
+ property instead.
909
+ """
910
+ pendingDeprecation("self.enableZoom property")
911
+ self.enableZoom = value
912
+
913
+ def GetEnableZoom(self):
914
+ """
915
+ Get the enableZoom value.
916
+
917
+ .. deprecated:: Feb 27, 2016
918
+
919
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableZoom`
920
+ property instead.
921
+ """
922
+ pendingDeprecation("self.enableZoom property")
923
+ return self.enableZoom
924
+
925
+ @property
926
+ def enableZoom(self):
927
+ """
928
+ The current enableZoom value.
929
+
930
+ :getter: Returns the value of enableZoom.
931
+ :setter: Sets the value of enableZoom.
932
+ :type: bool
933
+ :raises: `TypeError` if setting a non-boolean value.
934
+
935
+ .. note::
936
+ This is mutually exclusive with
937
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableDrag`. Setting
938
+ one will disable the other.
939
+
940
+ .. seealso::
941
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableDrag`
942
+ """
943
+ return self._zoomEnabled
944
+
945
+ @enableZoom.setter
946
+ def enableZoom(self, value):
947
+ if not isinstance(value, bool):
948
+ raise TypeError("Value must be a bool.")
949
+ if value:
950
+ if self.enableDrag:
951
+ self.enableDrag = False
952
+ self.SetCursor(self.MagCursor)
953
+ else:
954
+ self.SetCursor(self.defaultCursor)
955
+ self._zoomEnabled = value
956
+
957
+ def SetEnableGrid(self, value):
958
+ """
959
+ Set the enableGrid value.
960
+
961
+ .. deprecated:: Feb 27, 2016
962
+
963
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableGrid`
964
+ property instead.
965
+ """
966
+ pendingDeprecation("self.enableGrid property")
967
+ self.enableGrid = value
968
+
969
+ def GetEnableGrid(self):
970
+ """
971
+ Get the enableGrid value.
972
+
973
+ .. deprecated:: Feb 27, 2016
974
+
975
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableGrid`
976
+ property instead.
977
+ """
978
+ pendingDeprecation("self.enableGrid property")
979
+ return self.enableGrid
980
+
981
+ @property
982
+ def enableGrid(self):
983
+ """
984
+ The current enableGrid value.
985
+
986
+ :getter: Returns the value of enableGrid.
987
+ :setter: Sets the value of enableGrid.
988
+ :type: bool or 2-tuple of bools
989
+ :raises: `TypeError` if setting an invalid value.
990
+
991
+ If set to a single boolean value, then both X and y grids will be
992
+ enabled (``enableGrid = True``) or disabled (``enableGrid = False``).
993
+
994
+ If a 2-tuple of bools, the 1st value is the X (vertical) grid and
995
+ the 2nd value is the Y (horizontal) grid.
996
+ """
997
+ return self._gridEnabled
998
+
999
+ @enableGrid.setter
1000
+ def enableGrid(self, value):
1001
+ if isinstance(value, bool):
1002
+ value = (value, value)
1003
+ elif isinstance(value, tuple) and len(value) == 2:
1004
+ pass
1005
+ else:
1006
+ err_txt = "Value must be a bool or 2-tuple of bool."
1007
+ raise TypeError(err_txt)
1008
+
1009
+ self._gridEnabled = value
1010
+ self.Redraw()
1011
+
1012
+ def SetEnableCenterLines(self, value):
1013
+ """
1014
+ Set the enableCenterLines value.
1015
+
1016
+ .. deprecated:: Feb 27, 2016
1017
+
1018
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableCenterLines`
1019
+ property instead.
1020
+ """
1021
+ pendingDeprecation("self.enableCenterLines property")
1022
+ self.enableCenterLines = value
1023
+
1024
+ def GetEnableCenterLines(self):
1025
+ """
1026
+ Get the enableCenterLines value.
1027
+
1028
+ .. deprecated:: Feb 27, 2016
1029
+
1030
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableCenterLines`
1031
+ property instead.
1032
+ """
1033
+ pendingDeprecation("self.enableCenterLines property")
1034
+ return self.enableCenterLines
1035
+
1036
+ @property
1037
+ def enableCenterLines(self):
1038
+ """
1039
+ The current enableCenterLines value.
1040
+
1041
+ :getter: Returns the value of enableCenterLines.
1042
+ :setter: Sets the value of enableCenterLines.
1043
+ :type: bool or str
1044
+ :raises: `TypeError` if setting an invalid value.
1045
+
1046
+ If set to a single boolean value, then both horizontal and vertical
1047
+ lines will be enabled or disabled.
1048
+
1049
+ If a string, must be one of ``('Horizontal', 'Vertical')``.
1050
+ """
1051
+ return self._centerLinesEnabled
1052
+
1053
+ @enableCenterLines.setter
1054
+ def enableCenterLines(self, value):
1055
+ if value not in [True, False, 'Horizontal', 'Vertical']:
1056
+ raise TypeError(
1057
+ "Value should be True, False, 'Horizontal' or 'Vertical'")
1058
+ self._centerLinesEnabled = value
1059
+ self.Redraw()
1060
+
1061
+ def SetEnableDiagonals(self, value):
1062
+ """
1063
+ Set the enableDiagonals value.
1064
+
1065
+ .. deprecated:: Feb 27, 2016
1066
+
1067
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableDiagonals`
1068
+ property instead.
1069
+ """
1070
+ pendingDeprecation("self.enableDiagonals property")
1071
+ self.enableDiagonals = value
1072
+
1073
+ def GetEnableDiagonals(self):
1074
+ """
1075
+ Get the enableDiagonals value.
1076
+
1077
+ .. deprecated:: Feb 27, 2016
1078
+
1079
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableDiagonals`
1080
+ property instead.
1081
+ """
1082
+ pendingDeprecation("self.enableDiagonals property")
1083
+ return self.enableDiagonals
1084
+
1085
+ @property
1086
+ def enableDiagonals(self):
1087
+ """
1088
+ The current enableDiagonals value.
1089
+
1090
+ :getter: Returns the value of enableDiagonals.
1091
+ :setter: Sets the value of enableDiagonals.
1092
+ :type: bool or str
1093
+ :raises: `TypeError` if setting an invalid value.
1094
+
1095
+ If set to a single boolean value, then both diagonal lines will
1096
+ be enabled or disabled.
1097
+
1098
+ If a string, must be one of ``('Bottomleft-Topright',
1099
+ 'Bottomright-Topleft')``.
1100
+ """
1101
+ return self._diagonalsEnabled
1102
+
1103
+ @enableDiagonals.setter
1104
+ def enableDiagonals(self, value):
1105
+ # TODO: Rename Bottomleft-TopRight, Bottomright-Topleft
1106
+ if value not in [True, False,
1107
+ 'Bottomleft-Topright', 'Bottomright-Topleft']:
1108
+ raise TypeError(
1109
+ "Value should be True, False, 'Bottomleft-Topright' or "
1110
+ "'Bottomright-Topleft'"
1111
+ )
1112
+ self._diagonalsEnabled = value
1113
+ self.Redraw()
1114
+
1115
+ def SetEnableLegend(self, value):
1116
+ """
1117
+ Set the enableLegend value.
1118
+
1119
+ .. deprecated:: Feb 27, 2016
1120
+
1121
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableLegend`
1122
+ property instead.
1123
+ """
1124
+ pendingDeprecation("self.enableLegend property")
1125
+ self.enableLegend = value
1126
+
1127
+ def GetEnableLegend(self):
1128
+ """
1129
+ Get the enableLegend value.
1130
+
1131
+ .. deprecated:: Feb 27, 2016
1132
+
1133
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableLegend`
1134
+ property instead.
1135
+ """
1136
+ pendingDeprecation("self.enableLegend property")
1137
+ return self.enableLegend
1138
+
1139
+ @property
1140
+ def enableLegend(self):
1141
+ """
1142
+ The current enableLegend value.
1143
+
1144
+ :getter: Returns the value of enableLegend.
1145
+ :setter: Sets the value of enableLegend.
1146
+ :type: bool
1147
+ :raises: `TypeError` if setting a non-boolean value.
1148
+ """
1149
+ return self._legendEnabled
1150
+
1151
+ @enableLegend.setter
1152
+ def enableLegend(self, value):
1153
+ """Set True to enable legend."""
1154
+ # XXX: why not `if not isinstance(value, bool):`?
1155
+ if value not in [True, False]:
1156
+ raise TypeError("Value should be True or False")
1157
+ self._legendEnabled = value
1158
+ self.Redraw()
1159
+
1160
+ def SetEnableTitle(self, value):
1161
+ """
1162
+ Set the enableTitle value.
1163
+
1164
+ .. deprecated:: Feb 27, 2016
1165
+
1166
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableTitle`
1167
+ property instead.
1168
+ """
1169
+ pendingDeprecation("self.enableTitle property")
1170
+ self.enableTitle = value
1171
+
1172
+ def GetEnableTitle(self):
1173
+ """
1174
+ Get the enableTitle value.
1175
+
1176
+ .. deprecated:: Feb 27, 2016
1177
+
1178
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enableTitle`
1179
+ property instead.
1180
+ """
1181
+ pendingDeprecation("self.enableTitle property")
1182
+ return self.enableTitle
1183
+
1184
+ @property
1185
+ def enableTitle(self):
1186
+ """
1187
+ The current enableTitle value.
1188
+
1189
+ :getter: Returns the value of enableTitle.
1190
+ :setter: Sets the value of enableTitle.
1191
+ :type: bool
1192
+ :raises: `TypeError` if setting a non-boolean value.
1193
+ """
1194
+ return self._titleEnabled
1195
+
1196
+ @enableTitle.setter
1197
+ def enableTitle(self, value):
1198
+ if not isinstance(value, bool):
1199
+ raise TypeError("Value must be a bool.")
1200
+ self._titleEnabled = value
1201
+ self.Redraw()
1202
+
1203
+ def SetEnablePointLabel(self, value):
1204
+ """
1205
+ Set the enablePointLabel value.
1206
+
1207
+ .. deprecated:: Feb 27, 2016
1208
+
1209
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enablePointLabel`
1210
+ property instead.
1211
+ """
1212
+ pendingDeprecation("self.enablePointLabel property")
1213
+ self.enablePointLabel = value
1214
+
1215
+ def GetEnablePointLabel(self):
1216
+ """
1217
+ Set the enablePointLabel value.
1218
+
1219
+ .. deprecated:: Feb 27, 2016
1220
+
1221
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enablePointLabel`
1222
+ property instead.
1223
+ """
1224
+ pendingDeprecation("self.enablePointLabel property")
1225
+ return self.enablePointLabel
1226
+
1227
+ @property
1228
+ def enablePointLabel(self):
1229
+ """
1230
+ The current enablePointLabel value.
1231
+
1232
+ :getter: Returns the value of enablePointLabel.
1233
+ :setter: Sets the value of enablePointLabel.
1234
+ :type: bool
1235
+ :raises: `TypeError` if setting a non-boolean value.
1236
+ """
1237
+ return self._pointLabelEnabled
1238
+
1239
+ @enablePointLabel.setter
1240
+ def enablePointLabel(self, value):
1241
+ if not isinstance(value, bool):
1242
+ raise TypeError("Value must be a bool.")
1243
+ self._pointLabelEnabled = value
1244
+ self.Redraw() # will erase existing pointLabel if present
1245
+ self.last_PointLabel = None
1246
+
1247
+ @property
1248
+ def enableAxes(self):
1249
+ """
1250
+ The current enableAxes value.
1251
+
1252
+ :getter: Returns the value of enableAxes.
1253
+ :setter: Sets the value of enableAxes.
1254
+ :type: bool, 2-tuple of bool, or 4-tuple of bool
1255
+ :raises: `TypeError` if setting an invalid value.
1256
+ :raises: `ValueError` if the tuple has incorrect length.
1257
+
1258
+ If bool, enable or disable all axis
1259
+
1260
+ If 2-tuple, enable or disable the bottom or left axes: ``(bottom,
1261
+ left)``
1262
+
1263
+ If 4-tuple, enable or disable each axis individually: ``(bottom,
1264
+ left, top, right)``
1265
+ """
1266
+ return self._axesEnabled
1267
+
1268
+ @enableAxes.setter
1269
+ def enableAxes(self, value):
1270
+ self._axesEnabled = set_displayside(value)
1271
+ self.Redraw()
1272
+
1273
+ @property
1274
+ def enableAxesValues(self):
1275
+ """
1276
+ The current enableAxesValues value.
1277
+
1278
+ :getter: Returns the value of enableAxesValues.
1279
+ :setter: Sets the value of enableAxesValues.
1280
+ :type: bool, 2-tuple of bool, or 4-tuple of bool
1281
+ :raises: `TypeError` if setting an invalid value.
1282
+ :raises: `ValueError` if the tuple has incorrect length.
1283
+
1284
+ If bool, enable or disable all axis values
1285
+
1286
+ If 2-tuple, enable or disable the bottom or left axes values:
1287
+ ``(bottom, left)``
1288
+
1289
+ If 4-tuple, enable or disable each axis value individually:
1290
+ ``(bottom, left, top, right)``
1291
+ """
1292
+ return self._axesValuesEnabled
1293
+
1294
+ @enableAxesValues.setter
1295
+ def enableAxesValues(self, value):
1296
+ self._axesValuesEnabled = set_displayside(value)
1297
+ self.Redraw()
1298
+
1299
+ @property
1300
+ def enableTicks(self):
1301
+ """
1302
+ The current enableTicks value.
1303
+
1304
+ :getter: Returns the value of enableTicks.
1305
+ :setter: Sets the value of enableTicks.
1306
+ :type: bool, 2-tuple of bool, or 4-tuple of bool
1307
+ :raises: `TypeError` if setting an invalid value.
1308
+ :raises: `ValueError` if the tuple has incorrect length.
1309
+
1310
+ If bool, enable or disable all ticks
1311
+
1312
+ If 2-tuple, enable or disable the bottom or left ticks:
1313
+ ``(bottom, left)``
1314
+
1315
+ If 4-tuple, enable or disable each tick side individually:
1316
+ ``(bottom, left, top, right)``
1317
+ """
1318
+ return self._ticksEnabled
1319
+
1320
+ @enableTicks.setter
1321
+ def enableTicks(self, value):
1322
+ self._ticksEnabled = set_displayside(value)
1323
+ self.Redraw()
1324
+
1325
+ @property
1326
+ def enablePlotTitle(self):
1327
+ """
1328
+ The current enablePlotTitle value.
1329
+
1330
+ :getter: Returns the value of enablePlotTitle.
1331
+ :setter: Sets the value of enablePlotTitle.
1332
+ :type: bool
1333
+ :raises: `TypeError` if setting an invalid value.
1334
+ """
1335
+ return self._titleEnabled
1336
+
1337
+ @enablePlotTitle.setter
1338
+ def enablePlotTitle(self, value):
1339
+ if not isinstance(value, bool):
1340
+ raise TypeError("`value` must be boolean True or False")
1341
+ self._titleEnabled = value
1342
+ self.Redraw()
1343
+
1344
+ @property
1345
+ def enableXAxisLabel(self):
1346
+ """
1347
+ The current enableXAxisLabel value.
1348
+
1349
+ :getter: Returns the value of enableXAxisLabel.
1350
+ :setter: Sets the value of enableXAxisLabel.
1351
+ :type: bool
1352
+ :raises: `TypeError` if setting an invalid value.
1353
+ """
1354
+ return self._xAxisLabelEnabled
1355
+
1356
+ @enableXAxisLabel.setter
1357
+ def enableXAxisLabel(self, value):
1358
+ if not isinstance(value, bool):
1359
+ raise TypeError("`value` must be boolean True or False")
1360
+ self._xAxisLabelEnabled = value
1361
+ self.Redraw()
1362
+
1363
+ @property
1364
+ def enableYAxisLabel(self):
1365
+ """
1366
+ The current enableYAxisLabel value.
1367
+
1368
+ :getter: Returns the value of enableYAxisLabel.
1369
+ :setter: Sets the value of enableYAxisLabel.
1370
+ :type: bool
1371
+ :raises: `TypeError` if setting an invalid value.
1372
+ """
1373
+ return self._yAxisLabelEnabled
1374
+
1375
+ @enableYAxisLabel.setter
1376
+ def enableYAxisLabel(self, value):
1377
+ if not isinstance(value, bool):
1378
+ raise TypeError("`value` must be boolean True or False")
1379
+ self._yAxisLabelEnabled = value
1380
+ self.Redraw()
1381
+
1382
+ # TODO: this conflicts with enableXAxisLabel and enableYAxisLabel
1383
+ @property
1384
+ def enableAxesLabels(self):
1385
+ """
1386
+ The current enableAxesLabels value.
1387
+
1388
+ :getter: Returns the value of enableAxesLabels.
1389
+ :setter: Sets the value of enableAxesLabels.
1390
+ :type: bool
1391
+ :raises: `TypeError` if setting an invalid value.
1392
+ """
1393
+ return self._axesLabelsEnabled
1394
+
1395
+ @enableAxesLabels.setter
1396
+ def enableAxesLabels(self, value):
1397
+ if not isinstance(value, bool):
1398
+ raise TypeError("`value` must be boolean True or False")
1399
+ self._axesLabelsEnabled = value
1400
+ self.Redraw()
1401
+
1402
+ def SetPointLabelFunc(self, func):
1403
+ """
1404
+ Set the enablePointLabel value.
1405
+
1406
+ .. deprecated:: Feb 27, 2016
1407
+
1408
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enablePointLabel`
1409
+ property instead.
1410
+ """
1411
+ pendingDeprecation("self.pointLabelFunc property")
1412
+ self.pointLabelFunc = func
1413
+
1414
+ def GetPointLabelFunc(self):
1415
+ """
1416
+ Get the enablePointLabel value.
1417
+
1418
+ .. deprecated:: Feb 27, 2016
1419
+
1420
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.enablePointLabel`
1421
+ property instead.
1422
+ """
1423
+ pendingDeprecation("self.pointLabelFunc property")
1424
+ return self.pointLabelFunc
1425
+
1426
+ @property
1427
+ def pointLabelFunc(self):
1428
+ """
1429
+ The current pointLabelFunc value.
1430
+
1431
+ :getter: Returns the value of pointLabelFunc.
1432
+ :setter: Sets the value of pointLabelFunc.
1433
+ :type: function
1434
+
1435
+ TODO: More information is needed.
1436
+ Sets the function with custom code for pointLabel drawing
1437
+ """
1438
+ return self._pointLabelFunc
1439
+
1440
+ @pointLabelFunc.setter
1441
+ def pointLabelFunc(self, func):
1442
+ self._pointLabelFunc = func
1443
+
1444
+ def Reset(self):
1445
+ """Unzoom the plot."""
1446
+ self.last_PointLabel = None # reset pointLabel
1447
+ if self.last_draw is not None:
1448
+ self._Draw(self.last_draw[0])
1449
+
1450
+ def ScrollRight(self, units):
1451
+ """Move view right number of axis units."""
1452
+ self.last_PointLabel = None # reset pointLabel
1453
+ if self.last_draw is not None:
1454
+ graphics, xAxis, yAxis = self.last_draw
1455
+ xAxis = (xAxis[0] + units, xAxis[1] + units)
1456
+ self._Draw(graphics, xAxis, yAxis)
1457
+
1458
+ def ScrollUp(self, units):
1459
+ """Move view up number of axis units."""
1460
+ self.last_PointLabel = None # reset pointLabel
1461
+ if self.last_draw is not None:
1462
+ graphics, xAxis, yAxis = self.last_draw
1463
+ yAxis = (yAxis[0] + units, yAxis[1] + units)
1464
+ self._Draw(graphics, xAxis, yAxis)
1465
+
1466
+ def GetXY(self, event):
1467
+ """Wrapper around _getXY, which handles log scales"""
1468
+ x, y = self._getXY(event)
1469
+ if self.logScale[0]:
1470
+ x = np.power(10, x)
1471
+ if self.logScale[1]:
1472
+ y = np.power(10, y)
1473
+ return x, y
1474
+
1475
+ def _getXY(self, event):
1476
+ """Takes a mouse event and returns the XY user axis values."""
1477
+ x, y = self.PositionScreenToUser(event.GetPosition())
1478
+ return x, y
1479
+
1480
+ def PositionUserToScreen(self, pntXY):
1481
+ """Converts User position to Screen Coordinates"""
1482
+ userPos = np.array(pntXY)
1483
+ x, y = userPos * self._pointScale + self._pointShift
1484
+ return x, y
1485
+
1486
+ def PositionScreenToUser(self, pntXY):
1487
+ """Converts Screen position to User Coordinates"""
1488
+ screenPos = np.array(pntXY)
1489
+ x, y = (screenPos - self._pointShift) / self._pointScale
1490
+ return x, y
1491
+
1492
+ def SetXSpec(self, spectype='auto'):
1493
+ """
1494
+ Set the xSpec value.
1495
+
1496
+ .. deprecated:: Feb 27, 2016
1497
+
1498
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.xSpec`
1499
+ property instead.
1500
+ """
1501
+ pendingDeprecation("self.xSpec property")
1502
+ self.xSpec = spectype
1503
+
1504
+ def SetYSpec(self, spectype='auto'):
1505
+ """
1506
+ Set the ySpec value.
1507
+
1508
+ .. deprecated:: Feb 27, 2016
1509
+
1510
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.ySpec`
1511
+ property instead.
1512
+ """
1513
+ pendingDeprecation("self.ySpec property")
1514
+ self.ySpec = spectype
1515
+
1516
+ def GetXSpec(self):
1517
+ """
1518
+ Get the xSpec value.
1519
+
1520
+ .. deprecated:: Feb 27, 2016
1521
+
1522
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.xSpec`
1523
+ property instead.
1524
+ """
1525
+ pendingDeprecation("self.xSpec property")
1526
+ return self.xSpec
1527
+
1528
+ def GetYSpec(self):
1529
+ """
1530
+ Get the ySpec value.
1531
+
1532
+ .. deprecated:: Feb 27, 2016
1533
+
1534
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.ySpec`
1535
+ property instead.
1536
+ """
1537
+ pendingDeprecation("self.ySpec property")
1538
+ return self.ySpec
1539
+
1540
+ @property
1541
+ def xSpec(self):
1542
+ """
1543
+ Defines the X axis type.
1544
+
1545
+ Default is 'auto'.
1546
+
1547
+ :getter: Returns the value of xSpec.
1548
+ :setter: Sets the value of xSpec.
1549
+ :type: str, int, or length-2 sequence of floats
1550
+ :raises: `TypeError` if setting an invalid value.
1551
+
1552
+ Valid strings:
1553
+ + 'none' - shows no axis or tick mark values
1554
+ + 'min' - shows min bounding box values
1555
+ + 'auto' - rounds axis range to sensible values
1556
+
1557
+ Other valid values:
1558
+ + <number> - like 'min', but with <number> tick marks
1559
+ + list or tuple: a list of (min, max) values. Must be length 2.
1560
+
1561
+ .. seealso::
1562
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.ySpec`
1563
+ """
1564
+ return self._xSpec
1565
+
1566
+ @xSpec.setter
1567
+ def xSpec(self, value):
1568
+ ok_values = ('none', 'min', 'auto')
1569
+ if value not in ok_values and not isinstance(value, (int, float)):
1570
+ if not isinstance(value, (list, tuple)) and len(value != 2):
1571
+ err_str = ("xSpec must be 'none', 'min', 'auto', "
1572
+ "a number, or sequence of numbers (length 2)")
1573
+ raise TypeError(err_str)
1574
+ self._xSpec = value
1575
+
1576
+ @property
1577
+ def ySpec(self):
1578
+ """
1579
+ Defines the Y axis type.
1580
+
1581
+ Default is 'auto'.
1582
+
1583
+ :getter: Returns the value of xSpec.
1584
+ :setter: Sets the value of xSpec.
1585
+ :type: str, int, or length-2 sequence of floats
1586
+ :raises: `TypeError` if setting an invalid value.
1587
+
1588
+ Valid strings:
1589
+ + 'none' - shows no axis or tick mark values
1590
+ + 'min' - shows min bounding box values
1591
+ + 'auto' - rounds axis range to sensible values
1592
+
1593
+ Other valid values:
1594
+ + <number> - like 'min', but with <number> tick marks
1595
+ + list or tuple: a list of (min, max) values. Must be length 2.
1596
+
1597
+ .. seealso::
1598
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.xSpec`
1599
+ """
1600
+ return self._ySpec
1601
+
1602
+ @ySpec.setter
1603
+ def ySpec(self, value):
1604
+ ok_values = ('none', 'min', 'auto')
1605
+ if value not in ok_values and not isinstance(value, (int, float)):
1606
+ if not isinstance(value, (list, tuple)) and len(value != 2):
1607
+ err_str = ("ySpec must be 'none', 'min', 'auto', "
1608
+ "a number, or sequence of numbers (length 2)")
1609
+ raise TypeError(err_str)
1610
+ self._ySpec = value
1611
+
1612
+ def GetXMaxRange(self):
1613
+ """
1614
+ Get the xMaxRange value.
1615
+
1616
+ .. deprecated:: Feb 27, 2016
1617
+
1618
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.xMaxRange`
1619
+ property instead.
1620
+ """
1621
+ pendingDeprecation("self.xMaxRange property")
1622
+ return self.xMaxRange
1623
+
1624
+ @property
1625
+ def xMaxRange(self):
1626
+ """
1627
+ The plots' maximum X range as a tuple of ``(min, max)``.
1628
+
1629
+ :getter: Returns the value of xMaxRange.
1630
+
1631
+ .. seealso::
1632
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.yMaxRange`
1633
+ """
1634
+ xAxis = self._getXMaxRange()
1635
+ if self.logScale[0]:
1636
+ xAxis = np.power(10, xAxis)
1637
+ return xAxis
1638
+
1639
+ def _getXMaxRange(self):
1640
+ """Returns (minX, maxX) x-axis range for displayed graph"""
1641
+ graphics = self.last_draw[0]
1642
+ p1, p2 = graphics.boundingBox() # min, max points of graphics
1643
+ xAxis = self._axisInterval(self._xSpec, p1[0], p2[0]) # in user units
1644
+ return xAxis
1645
+
1646
+ def GetYMaxRange(self):
1647
+ """
1648
+ Get the yMaxRange value.
1649
+
1650
+ .. deprecated:: Feb 27, 2016
1651
+
1652
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.yMaxRange`
1653
+ property instead.
1654
+ """
1655
+ pendingDeprecation("self.yMaxRange property")
1656
+ return self.yMaxRange
1657
+
1658
+ @property
1659
+ def yMaxRange(self):
1660
+ """
1661
+ The plots' maximum Y range as a tuple of ``(min, max)``.
1662
+
1663
+ :getter: Returns the value of yMaxRange.
1664
+
1665
+ .. seealso::
1666
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.xMaxRange`
1667
+ """
1668
+ yAxis = self._getYMaxRange()
1669
+ if self.logScale[1]:
1670
+ yAxis = np.power(10, yAxis)
1671
+ return yAxis
1672
+
1673
+ def _getYMaxRange(self):
1674
+ """Returns (minY, maxY) y-axis range for displayed graph"""
1675
+ graphics = self.last_draw[0]
1676
+ p1, p2 = graphics.boundingBox() # min, max points of graphics
1677
+ yAxis = self._axisInterval(self._ySpec, p1[1], p2[1])
1678
+ return yAxis
1679
+
1680
+ def GetXCurrentRange(self):
1681
+ """
1682
+ Get the xCurrentRange value.
1683
+
1684
+ .. deprecated:: Feb 27, 2016
1685
+
1686
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.xCurrentRange`
1687
+ property instead.
1688
+ """
1689
+ pendingDeprecation("self.xCurrentRange property")
1690
+ return self.xCurrentRange
1691
+
1692
+ @property
1693
+ def xCurrentRange(self):
1694
+ """
1695
+ The plots' X range of the currently displayed portion as
1696
+ a tuple of ``(min, max)``
1697
+
1698
+ :getter: Returns the value of xCurrentRange.
1699
+
1700
+ .. seealso::
1701
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.yCurrentRange`
1702
+ """
1703
+ xAxis = self._getXCurrentRange()
1704
+ if self.logScale[0]:
1705
+ xAxis = np.power(10, xAxis)
1706
+ return xAxis
1707
+
1708
+ def _getXCurrentRange(self):
1709
+ """Returns (minX, maxX) x-axis for currently displayed
1710
+ portion of graph"""
1711
+ return self.last_draw[1]
1712
+
1713
+ def GetYCurrentRange(self):
1714
+ """
1715
+ Get the yCurrentRange value.
1716
+
1717
+ .. deprecated:: Feb 27, 2016
1718
+
1719
+ Use the :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.yCurrentRange`
1720
+ property instead.
1721
+ """
1722
+ pendingDeprecation("self.yCurrentRange property")
1723
+ return self.yCurrentRange
1724
+
1725
+ @property
1726
+ def yCurrentRange(self):
1727
+ """
1728
+ The plots' Y range of the currently displayed portion as
1729
+ a tuple of ``(min, max)``
1730
+
1731
+ :getter: Returns the value of yCurrentRange.
1732
+
1733
+ .. seealso::
1734
+ :attr:`~wx.lib.plot.plotcanvas.PlotCanvas.xCurrentRange`
1735
+ """
1736
+ yAxis = self._getYCurrentRange()
1737
+ if self.logScale[1]:
1738
+ yAxis = np.power(10, yAxis)
1739
+ return yAxis
1740
+
1741
+ def _getYCurrentRange(self):
1742
+ """Returns (minY, maxY) y-axis for currently displayed
1743
+ portion of graph"""
1744
+ return self.last_draw[2]
1745
+
1746
+ def Draw(self, graphics, xAxis=None, yAxis=None, dc=None):
1747
+ """Wrapper around _Draw, which handles log axes"""
1748
+
1749
+ graphics.logScale = self.logScale
1750
+
1751
+ # check Axis is either tuple or none
1752
+ err_txt = "xAxis should be None or (minX, maxX). Got type `{}`."
1753
+ if type(xAxis) not in [type(None), tuple]:
1754
+ raise TypeError(err_txt .format(type(xAxis)))
1755
+
1756
+ err_txt = "yAxis should be None or (minY, maxY). Got type `{}`."
1757
+ if type(yAxis) not in [type(None), tuple]:
1758
+ raise TypeError(err_txt.format(type(yAxis)))
1759
+
1760
+ # check case for axis = (a,b) where a==b caused by improper zooms
1761
+ if xAxis is not None:
1762
+ if xAxis[0] == xAxis[1]:
1763
+ return
1764
+ if self.logScale[0]:
1765
+ xAxis = np.log10(xAxis)
1766
+ if yAxis is not None:
1767
+ if yAxis[0] == yAxis[1]:
1768
+ return
1769
+ if self.logScale[1]:
1770
+ yAxis = np.log10(yAxis)
1771
+ self._Draw(graphics, xAxis, yAxis, dc)
1772
+
1773
+ def _Draw(self, graphics, xAxis=None, yAxis=None, dc=None):
1774
+ """\
1775
+ Draw objects in graphics with specified x and y axis.
1776
+ graphics- instance of PlotGraphics with list of PolyXXX objects
1777
+ xAxis - tuple with (min, max) axis range to view
1778
+ yAxis - same as xAxis
1779
+ dc - drawing context - doesn't have to be specified.
1780
+ If it's not, the offscreen buffer is used
1781
+ """
1782
+
1783
+ if dc is None:
1784
+ # sets new dc and clears it
1785
+ dc = wx.BufferedDC(wx.ClientDC(self.canvas), self._Buffer)
1786
+ bbr = wx.Brush(self.GetBackgroundColour(), wx.BRUSHSTYLE_SOLID)
1787
+ dc.SetBackground(bbr)
1788
+ dc.SetBackgroundMode(wx.SOLID)
1789
+ dc.Clear()
1790
+ if self._antiAliasingEnabled:
1791
+ if not isinstance(dc, wx.GCDC):
1792
+ try:
1793
+ dc = wx.GCDC(dc)
1794
+ except Exception: # XXX: Yucky.
1795
+ pass
1796
+ else:
1797
+ if self._hiResEnabled:
1798
+ # high precision: each logical unit is 1/20 of a point
1799
+ dc.SetMapMode(wx.MM_TWIPS)
1800
+ self._pointSize = tuple(
1801
+ 1.0 / lscale for lscale in dc.GetLogicalScale())
1802
+ self._setSize()
1803
+ elif self._pointSize != (1.0, 1.0):
1804
+ self._pointSize = (1.0, 1.0)
1805
+ self._setSize()
1806
+
1807
+ if (sys.platform in ("darwin", "win32")
1808
+ or not isinstance(dc, wx.GCDC)
1809
+ or wx.VERSION >= (2, 9)):
1810
+ self._fontScale = sum(self._pointSize) / 2.0
1811
+ else:
1812
+ # on Linux, we need to correct the font size by a certain
1813
+ # factor if wx.GCDC is used, to make text the same size as
1814
+ # if wx.GCDC weren't used
1815
+ screenppi = map(float, wx.ScreenDC().GetPPI())
1816
+ ppi = dc.GetPPI()
1817
+ self._fontScale = (
1818
+ (screenppi[0] / ppi[0] * self._pointSize[0]
1819
+ + screenppi[1] / ppi[1] * self._pointSize[1])
1820
+ / 2.0
1821
+ )
1822
+
1823
+ graphics._pointSize = self._pointSize
1824
+
1825
+ dc.SetTextForeground(self.GetForegroundColour())
1826
+ dc.SetTextBackground(self.GetBackgroundColour())
1827
+
1828
+ # dc.Clear()
1829
+
1830
+ # set font size for every thing but title and legend
1831
+ dc.SetFont(self._getFont(self._fontSizeAxis))
1832
+
1833
+ # sizes axis to axis type, create lower left and upper right
1834
+ # corners of plot
1835
+ if xAxis is None or yAxis is None:
1836
+ # One or both axis not specified in Draw
1837
+ p1, p2 = graphics.boundingBox() # min, max points of graphics
1838
+ if xAxis is None:
1839
+ xAxis = self._axisInterval(
1840
+ self._xSpec, p1[0], p2[0]) # in user units
1841
+ if yAxis is None:
1842
+ yAxis = self._axisInterval(self._ySpec, p1[1], p2[1])
1843
+ # Adjust bounding box for axis spec
1844
+ # lower left corner user scale (xmin,ymin)
1845
+ p1[0], p1[1] = xAxis[0], yAxis[0]
1846
+ # upper right corner user scale (xmax,ymax)
1847
+ p2[0], p2[1] = xAxis[1], yAxis[1]
1848
+ else:
1849
+ # Both axis specified in Draw
1850
+ # lower left corner user scale (xmin,ymin)
1851
+ p1 = np.array([xAxis[0], yAxis[0]])
1852
+ # upper right corner user scale (xmax,ymax)
1853
+ p2 = np.array([xAxis[1], yAxis[1]])
1854
+
1855
+ # saves most recent values
1856
+ self.last_draw = (graphics, np.array(xAxis), np.array(yAxis))
1857
+
1858
+ # Get ticks and textExtents for axis if required
1859
+ xticks = yticks = None
1860
+ xTextExtent = yTextExtent = (0, 0) # No text for ticks
1861
+ if self._xSpec != 'none':
1862
+ xticks = self._xticks(xAxis[0], xAxis[1])
1863
+ # w h of x axis text last number on axis
1864
+ xTextExtent = dc.GetTextExtent(xticks[-1][1])
1865
+
1866
+ if self._ySpec != 'none':
1867
+ yticks = self._yticks(yAxis[0], yAxis[1])
1868
+ if self.logScale[1]:
1869
+ # make sure we have enough room to display SI notation.
1870
+ yTextExtent = dc.GetTextExtent('-2e-2')
1871
+ else:
1872
+ yTextExtentBottom = dc.GetTextExtent(yticks[0][1])
1873
+ yTextExtentTop = dc.GetTextExtent(yticks[-1][1])
1874
+ yTextExtent = (max(yTextExtentBottom[0], yTextExtentTop[0]),
1875
+ max(yTextExtentBottom[1], yTextExtentTop[1]))
1876
+
1877
+ # TextExtents for Title and Axis Labels
1878
+ titleWH, xLabelWH, yLabelWH = self._titleLablesWH(dc, graphics)
1879
+
1880
+ # TextExtents for Legend
1881
+ legendBoxWH, legendSymExt, legendTextExt = self._legendWH(
1882
+ dc,
1883
+ graphics
1884
+ )
1885
+
1886
+ # room around graph area
1887
+ # use larger of number width or legend width
1888
+ rhsW = max(xTextExtent[0], legendBoxWH[0]) + 5 * self._pointSize[0]
1889
+ lhsW = yTextExtent[0] + yLabelWH[1] + 3 * self._pointSize[0]
1890
+ bottomH = (max(xTextExtent[1], yTextExtent[1] / 2.)
1891
+ + xLabelWH[1] + 2 * self._pointSize[1])
1892
+ topH = yTextExtent[1] / 2. + titleWH[1]
1893
+ # make plot area smaller by text size
1894
+ textSize_scale = np.array([rhsW + lhsW, bottomH + topH])
1895
+ # shift plot area by this amount
1896
+ textSize_shift = np.array([lhsW, bottomH])
1897
+
1898
+ # Draw the labels (title, axes labels)
1899
+ self._drawPlotAreaLabels(dc, graphics, lhsW, rhsW, titleWH,
1900
+ bottomH, topH, xLabelWH, yLabelWH)
1901
+
1902
+ # drawing legend makers and text
1903
+ if self._legendEnabled:
1904
+ self._drawLegend(dc,
1905
+ graphics,
1906
+ rhsW,
1907
+ topH,
1908
+ legendBoxWH,
1909
+ legendSymExt,
1910
+ legendTextExt)
1911
+
1912
+ # allow for scaling and shifting plotted points
1913
+ scale = ((self.plotbox_size - textSize_scale) / (p2 - p1)
1914
+ * np.array((1, -1)))
1915
+ shift = (-p1 * scale + self.plotbox_origin
1916
+ + textSize_shift * np.array((1, -1)))
1917
+ # make available for mouse events
1918
+ self._pointScale = scale / self._pointSize
1919
+ self._pointShift = shift / self._pointSize
1920
+ self._drawPlotAreaItems(dc, p1, p2, scale, shift, xticks, yticks)
1921
+
1922
+ graphics.scaleAndShift(scale, shift)
1923
+ # thicken up lines and markers if printing
1924
+ graphics.printerScale = self.printerScale
1925
+
1926
+ # set clipping area so drawing does not occur outside axis box
1927
+ ptx, pty, rectWidth, rectHeight = self._point2ClientCoord(p1, p2)
1928
+ # allow graph to overlap axis lines by adding units to w and h
1929
+ dc.SetClippingRegion(*np.array([ptx * self._pointSize[0],
1930
+ pty * self._pointSize[1],
1931
+ rectWidth * self._pointSize[0] + 2,
1932
+ rectHeight * self._pointSize[1] + 1],
1933
+ dtype = int))
1934
+ # Draw the lines and markers
1935
+ # start = _time.perf_counter()
1936
+ graphics.draw(dc)
1937
+ # time_str = "entire graphics drawing took: {} seconds"
1938
+ # print(time_str.format(_time.perf_counter() - start))
1939
+ # remove the clipping region
1940
+ dc.DestroyClippingRegion()
1941
+
1942
+ self._adjustScrollbars()
1943
+
1944
+ def Redraw(self, dc=None):
1945
+ """Redraw the existing plot."""
1946
+ if self.last_draw is not None:
1947
+ graphics, xAxis, yAxis = self.last_draw
1948
+ self._Draw(graphics, xAxis, yAxis, dc)
1949
+
1950
+ def Clear(self):
1951
+ """Erase the window."""
1952
+ self.last_PointLabel = None # reset pointLabel
1953
+ dc = wx.BufferedDC(wx.ClientDC(self.canvas), self._Buffer)
1954
+ bbr = wx.Brush(self.GetBackgroundColour(), wx.SOLID)
1955
+ dc.SetBackground(bbr)
1956
+ dc.SetBackgroundMode(wx.SOLID)
1957
+ dc.Clear()
1958
+ if self._antiAliasingEnabled:
1959
+ try:
1960
+ dc = wx.GCDC(dc)
1961
+ except Exception:
1962
+ pass
1963
+ dc.SetTextForeground(self.GetForegroundColour())
1964
+ dc.SetTextBackground(self.GetBackgroundColour())
1965
+ self.last_draw = None
1966
+
1967
+ def Zoom(self, Center, Ratio):
1968
+ """
1969
+ Zoom on the plot
1970
+ Centers on the X,Y coords given in Center
1971
+ Zooms by the Ratio = (Xratio, Yratio) given
1972
+ """
1973
+ self.last_PointLabel = None # reset maker
1974
+ x, y = Center
1975
+ if self.last_draw is not None:
1976
+ (graphics, xAxis, yAxis) = self.last_draw
1977
+ w = (xAxis[1] - xAxis[0]) * Ratio[0]
1978
+ h = (yAxis[1] - yAxis[0]) * Ratio[1]
1979
+ xAxis = (x - w / 2, x + w / 2)
1980
+ yAxis = (y - h / 2, y + h / 2)
1981
+ self._Draw(graphics, xAxis, yAxis)
1982
+
1983
+ def GetClosestPoints(self, pntXY, pointScaled=True):
1984
+ """
1985
+ Returns list with
1986
+ [curveNumber, legend, index of closest point,
1987
+ pointXY, scaledXY, distance]
1988
+ list for each curve.
1989
+ Returns [] if no curves are being plotted.
1990
+
1991
+ x, y in user coords
1992
+ if pointScaled == True based on screen coords
1993
+ if pointScaled == False based on user coords
1994
+ """
1995
+ if self.last_draw is None:
1996
+ # no graph available
1997
+ return []
1998
+ graphics, xAxis, yAxis = self.last_draw
1999
+ l = []
2000
+ for curveNum, obj in enumerate(graphics):
2001
+ # check there are points in the curve
2002
+ if len(obj.points) == 0:
2003
+ continue # go to next obj
2004
+ #[curveNum, legend, closest pt index, pointXY, scaledXY, dist]
2005
+ cn = ([curveNum] +
2006
+ [obj.getLegend()] + obj.getClosestPoint(pntXY, pointScaled))
2007
+ l.append(cn)
2008
+ return l
2009
+
2010
+ def GetClosestPoint(self, pntXY, pointScaled=True):
2011
+ """
2012
+ Returns list with
2013
+ [curveNumber, legend, index of closest point,
2014
+ pointXY, scaledXY, distance]
2015
+ list for only the closest curve.
2016
+ Returns [] if no curves are being plotted.
2017
+
2018
+ x, y in user coords
2019
+ if pointScaled == True based on screen coords
2020
+ if pointScaled == False based on user coords
2021
+ """
2022
+ # closest points on screen based on screen scaling (pointScaled=True)
2023
+ closestPts = self.GetClosestPoints(pntXY, pointScaled)
2024
+ if closestPts == []:
2025
+ return [] # no graph present
2026
+ # find one with least distance
2027
+ dists = [c[-1] for c in closestPts]
2028
+ mdist = min(dists) # Min dist
2029
+ i = dists.index(mdist) # index for min dist
2030
+ return closestPts[i] # this is the closest point on closest curve
2031
+
2032
+ def UpdatePointLabel(self, mDataDict):
2033
+ """
2034
+ Updates the pointLabel point on screen with data contained in
2035
+ mDataDict.
2036
+
2037
+ mDataDict will be passed to your function set by
2038
+ SetPointLabelFunc. It can contain anything you
2039
+ want to display on the screen at the scaledXY point
2040
+ you specify.
2041
+
2042
+ This function can be called from parent window with onClick,
2043
+ onMotion events etc.
2044
+ """
2045
+ if self.last_PointLabel is not None:
2046
+ # compare pointXY
2047
+ if np.any(
2048
+ mDataDict["pointXY"] != self.last_PointLabel["pointXY"]):
2049
+ # closest changed
2050
+ self._drawPointLabel(self.last_PointLabel) # erase old
2051
+ self._drawPointLabel(mDataDict) # plot new
2052
+ else:
2053
+ # just plot new with no erase
2054
+ self._drawPointLabel(mDataDict) # plot new
2055
+ # save for next erase
2056
+ self.last_PointLabel = mDataDict
2057
+
2058
+ # event handlers **********************************
2059
+ # TODO: some of these event handlers can be modified
2060
+ # Meaning: only bind the event if the item is enabled. Disable
2061
+ # the event when the item is disabled.
2062
+ #
2063
+ # Example::
2064
+ #
2065
+ # if self._zoomEnabled:
2066
+ # self.Bind(stuff)
2067
+ # else:
2068
+ # self.UnBind(stuff) # or equivalent
2069
+ #
2070
+ # def OnZoom(self, event):
2071
+ # # process zoom event.
2072
+ #
2073
+ # What this change would do is remove most of the if statements
2074
+ # within these event handlers.
2075
+ def OnMotion(self, event):
2076
+ if self._zoomEnabled and event.LeftIsDown():
2077
+ if self._hasDragged:
2078
+ self._drawRubberBand(
2079
+ self._zoomCorner1, self._zoomCorner2) # remove old
2080
+ else:
2081
+ self._hasDragged = True
2082
+ self._zoomCorner2[0], self._zoomCorner2[1] = self._getXY(event)
2083
+ self._drawRubberBand(
2084
+ self._zoomCorner1, self._zoomCorner2) # add new
2085
+ elif self._dragEnabled and event.LeftIsDown():
2086
+ coordinates = event.GetPosition()
2087
+ newpos, oldpos = map(
2088
+ np.array,
2089
+ map(self.PositionScreenToUser,
2090
+ [coordinates, self._screenCoordinates]
2091
+ )
2092
+ )
2093
+ dist = newpos - oldpos
2094
+ self._screenCoordinates = coordinates
2095
+
2096
+ if self.last_draw is not None:
2097
+ graphics, xAxis, yAxis = self.last_draw
2098
+ yAxis -= dist[1]
2099
+ xAxis -= dist[0]
2100
+ self._Draw(graphics, xAxis, yAxis)
2101
+
2102
+ def OnMouseLeftDown(self, event):
2103
+ self._zoomCorner1[0], self._zoomCorner1[1] = self._getXY(event)
2104
+ self._screenCoordinates = np.array(event.GetPosition())
2105
+ if self._dragEnabled:
2106
+ self.SetCursor(self.GrabHandCursor)
2107
+ self.canvas.CaptureMouse()
2108
+
2109
+ def OnMouseLeftUp(self, event):
2110
+ if self._zoomEnabled:
2111
+ if self._hasDragged is True:
2112
+ self._drawRubberBand(
2113
+ self._zoomCorner1, self._zoomCorner2) # remove old
2114
+ self._zoomCorner2[0], self._zoomCorner2[1] = self._getXY(event)
2115
+ self._hasDragged = False # reset flag
2116
+ minX, minY = np.minimum(self._zoomCorner1, self._zoomCorner2)
2117
+ maxX, maxY = np.maximum(self._zoomCorner1, self._zoomCorner2)
2118
+ self.last_PointLabel = None # reset pointLabel
2119
+ if self.last_draw is not None:
2120
+ self._Draw(self.last_draw[0],
2121
+ xAxis=(minX, maxX),
2122
+ yAxis=(minY, maxY),
2123
+ dc=None)
2124
+ # else: # A box has not been drawn, zoom in on a point
2125
+ # this interfered with the double click, so I've disables it.
2126
+ # X,Y = self._getXY(event)
2127
+ # self.Zoom( (X,Y), (self._zoomInFactor,self._zoomInFactor) )
2128
+ if self._dragEnabled:
2129
+ self.SetCursor(self.HandCursor)
2130
+ if self.canvas.HasCapture():
2131
+ self.canvas.ReleaseMouse()
2132
+
2133
+ def OnMouseDoubleClick(self, event):
2134
+ if self._zoomEnabled:
2135
+ # Give a little time for the click to be totally finished
2136
+ # before (possibly) removing the scrollbars and trigering
2137
+ # size events, etc.
2138
+ wx.CallLater(200, self.Reset)
2139
+
2140
+ def OnMouseRightDown(self, event):
2141
+ if self._zoomEnabled:
2142
+ X, Y = self._getXY(event)
2143
+ self.Zoom((X, Y), (self._zoomOutFactor, self._zoomOutFactor))
2144
+
2145
+ def OnPaint(self, event):
2146
+ # All that is needed here is to draw the buffer to screen
2147
+ if self.last_PointLabel is not None:
2148
+ self._drawPointLabel(self.last_PointLabel) # erase old
2149
+ self.last_PointLabel = None
2150
+ dc = wx.BufferedPaintDC(self.canvas, self._Buffer)
2151
+ if self._antiAliasingEnabled:
2152
+ try:
2153
+ dc = wx.GCDC(dc)
2154
+ except Exception:
2155
+ pass
2156
+
2157
+ def OnSize(self, event):
2158
+ # The Buffer init is done here, to make sure the buffer is always
2159
+ # the same size as the Window
2160
+ Size = self.canvas.GetClientSize()
2161
+ Size.width = max(1, Size.width)
2162
+ Size.height = max(1, Size.height)
2163
+
2164
+ # Make new offscreen bitmap: this bitmap will always have the
2165
+ # current drawing in it, so it can be used to save the image to
2166
+ # a file, or whatever.
2167
+ self._Buffer = wx.Bitmap(Size.width, Size.height)
2168
+ self._setSize()
2169
+
2170
+ self.last_PointLabel = None # reset pointLabel
2171
+
2172
+ if self.last_draw is None:
2173
+ self.Clear()
2174
+ else:
2175
+ graphics, xSpec, ySpec = self.last_draw
2176
+ self._Draw(graphics, xSpec, ySpec)
2177
+
2178
+ def OnLeave(self, event):
2179
+ """Used to erase pointLabel when mouse outside window"""
2180
+ if self.last_PointLabel is not None:
2181
+ self._drawPointLabel(self.last_PointLabel) # erase old
2182
+ self.last_PointLabel = None
2183
+
2184
+ def OnScroll(self, evt):
2185
+ if not self._adjustingSB:
2186
+ self._sb_ignore = True
2187
+ sbpos = evt.GetPosition()
2188
+
2189
+ if evt.GetOrientation() == wx.VERTICAL:
2190
+ fullrange = self.sb_vert.GetRange()
2191
+ pagesize = self.sb_vert.GetPageSize()
2192
+ sbpos = fullrange - pagesize - sbpos
2193
+ dist = (sbpos * self._sb_yunit -
2194
+ (self._getYCurrentRange()[0] - self._sb_yfullrange[0]))
2195
+ self.ScrollUp(dist)
2196
+
2197
+ if evt.GetOrientation() == wx.HORIZONTAL:
2198
+ dist = (sbpos * self._sb_xunit -
2199
+ (self._getXCurrentRange()[0] - self._sb_xfullrange[0]))
2200
+ self.ScrollRight(dist)
2201
+
2202
+ # Private Methods **************************************************
2203
+ def _setSize(self, width=None, height=None):
2204
+ """DC width and height."""
2205
+ if width is None:
2206
+ (self.width, self.height) = self.canvas.GetClientSize()
2207
+ else:
2208
+ self.width, self.height = width, height
2209
+ self.width *= self._pointSize[0] # high precision
2210
+ self.height *= self._pointSize[1] # high precision
2211
+ self.plotbox_size = 0.97 * np.array([self.width, self.height])
2212
+ xo = 0.5 * (self.width - self.plotbox_size[0])
2213
+ yo = self.height - 0.5 * (self.height - self.plotbox_size[1])
2214
+ self.plotbox_origin = np.array([xo, yo])
2215
+
2216
+ def _setPrinterScale(self, scale):
2217
+ """Used to thicken lines and increase marker size for print out."""
2218
+ # line thickness on printer is very thin at 600 dot/in. Markers small
2219
+ self.printerScale = scale
2220
+
2221
+ def _printDraw(self, printDC):
2222
+ """Used for printing."""
2223
+ if self.last_draw is not None:
2224
+ graphics, xSpec, ySpec = self.last_draw
2225
+ self._Draw(graphics, xSpec, ySpec, printDC)
2226
+
2227
+ def _drawPointLabel(self, mDataDict):
2228
+ """Draws and erases pointLabels"""
2229
+ width = self._Buffer.GetWidth()
2230
+ height = self._Buffer.GetHeight()
2231
+ if sys.platform != "darwin":
2232
+ tmp_Buffer = wx.Bitmap(width, height)
2233
+ dcs = wx.MemoryDC()
2234
+ dcs.SelectObject(tmp_Buffer)
2235
+ dcs.Clear()
2236
+ else:
2237
+ tmp_Buffer = self._Buffer.GetSubBitmap((0, 0, width, height))
2238
+ dcs = wx.MemoryDC(self._Buffer)
2239
+ self._pointLabelFunc(dcs, mDataDict) # custom user pointLabel func
2240
+
2241
+ dc = wx.ClientDC(self.canvas)
2242
+ dc = wx.BufferedDC(dc, self._Buffer)
2243
+ # this will erase if called twice
2244
+ dc.Blit(0, 0, width, height, dcs, 0, 0, self._logicalFunction)
2245
+ if sys.platform == "darwin":
2246
+ self._Buffer = tmp_Buffer
2247
+
2248
+ def _drawLegend(self, dc, graphics, rhsW, topH, legendBoxWH,
2249
+ legendSymExt, legendTextExt):
2250
+ """Draws legend symbols and text"""
2251
+ # top right hand corner of graph box is ref corner
2252
+ trhc = (self.plotbox_origin +
2253
+ (self.plotbox_size - [rhsW, topH]) * [1, -1])
2254
+ # border space between legend sym and graph box
2255
+ legendLHS = .091 * legendBoxWH[0]
2256
+ # 1.1 used as space between lines
2257
+ lineHeight = max(legendSymExt[1], legendTextExt[1]) * 1.1
2258
+ dc.SetFont(self._getFont(self._fontSizeLegend))
2259
+
2260
+ from .polyobjects import PolyLine
2261
+ from .polyobjects import PolyMarker
2262
+ from .polyobjects import PolyBoxPlot
2263
+
2264
+ for i in range(len(graphics)):
2265
+ o = graphics[i]
2266
+ s = i * lineHeight
2267
+ if isinstance(o, PolyMarker) or isinstance(o, PolyBoxPlot):
2268
+ # draw marker with legend
2269
+ pnt = (trhc[0] + legendLHS + legendSymExt[0] / 2.,
2270
+ trhc[1] + s + lineHeight / 2.)
2271
+ o.draw(dc, self.printerScale, coord=np.array([pnt]))
2272
+ elif isinstance(o, PolyLine):
2273
+ # draw line with legend
2274
+ pnt1 = (trhc[0] + legendLHS, trhc[1] + s + lineHeight / 2.)
2275
+ pnt2 = (trhc[0] + legendLHS + legendSymExt[0],
2276
+ trhc[1] + s + lineHeight / 2.)
2277
+ o.draw(dc, self.printerScale, coord=np.array([pnt1, pnt2]))
2278
+ else:
2279
+ raise TypeError(
2280
+ "object is neither PolyMarker or PolyLine instance")
2281
+ # draw legend txt
2282
+ pnt = ((trhc[0] + legendLHS + legendSymExt[0]
2283
+ + 5 * self._pointSize[0]),
2284
+ trhc[1] + s + lineHeight / 2. - legendTextExt[1] / 2)
2285
+ pnt = list(map(int, pnt))
2286
+ dc.DrawText(o.getLegend(), pnt[0], pnt[1])
2287
+ dc.SetFont(self._getFont(self._fontSizeAxis)) # reset
2288
+
2289
+ def _titleLablesWH(self, dc, graphics):
2290
+ """Draws Title and labels and returns width and height for each"""
2291
+ # TextExtents for Title and Axis Labels
2292
+ dc.SetFont(self._getFont(self._fontSizeTitle))
2293
+ if self.enablePlotTitle:
2294
+ title = graphics.title
2295
+ titleWH = dc.GetTextExtent(title)
2296
+ else:
2297
+ titleWH = (0, 0)
2298
+ dc.SetFont(self._getFont(self._fontSizeAxis))
2299
+ xLabel, yLabel = graphics.xLabel, graphics.yLabel
2300
+ xLabelWH = dc.GetTextExtent(xLabel)
2301
+ yLabelWH = dc.GetTextExtent(yLabel)
2302
+ return titleWH, xLabelWH, yLabelWH
2303
+
2304
+ def _legendWH(self, dc, graphics):
2305
+ """Returns the size in screen units for legend box"""
2306
+ if self._legendEnabled is not True:
2307
+ legendBoxWH = symExt = txtExt = (0, 0)
2308
+ else:
2309
+ # find max symbol size
2310
+ symExt = graphics.getSymExtent(self.printerScale)
2311
+ # find max legend text extent
2312
+ dc.SetFont(self._getFont(self._fontSizeLegend))
2313
+ txtList = graphics.getLegendNames()
2314
+ txtExt = dc.GetTextExtent(txtList[0])
2315
+ for txt in graphics.getLegendNames()[1:]:
2316
+ txtExt = np.maximum(txtExt, dc.GetTextExtent(txt))
2317
+ maxW = symExt[0] + txtExt[0]
2318
+ maxH = max(symExt[1], txtExt[1])
2319
+ # padding .1 for lhs of legend box and space between lines
2320
+ maxW = maxW * 1.1
2321
+ maxH = maxH * 1.1 * len(txtList)
2322
+ dc.SetFont(self._getFont(self._fontSizeAxis))
2323
+ legendBoxWH = (maxW, maxH)
2324
+ return (legendBoxWH, symExt, txtExt)
2325
+
2326
+ def _drawRubberBand(self, corner1, corner2):
2327
+ """Draws/erases rect box from corner1 to corner2"""
2328
+ coords = self._point2ClientCoord(corner1, corner2)
2329
+ # draw rectangle
2330
+ dc = wx.ClientDC(self.canvas)
2331
+ dc.SetPen(wx.Pen(wx.BLACK))
2332
+ dc.SetBrush(wx.Brush(wx.WHITE, wx.BRUSHSTYLE_TRANSPARENT))
2333
+ dc.SetLogicalFunction(wx.INVERT)
2334
+ dc.DrawRectangle(*np.array(coords, dtype = int))
2335
+ dc.SetLogicalFunction(wx.COPY)
2336
+
2337
+ def _getFont(self, size):
2338
+ """Take font size, adjusts if printing and returns wx.Font"""
2339
+ s = size * self.printerScale * self._fontScale
2340
+ of = self.GetFont()
2341
+ # Linux speed up to get font from cache rather than X font server
2342
+ key = (int(s), of.GetFamily(), of.GetStyle(), of.GetWeight())
2343
+ font = self._fontCache.get(key, None)
2344
+ if font:
2345
+ return font # yeah! cache hit
2346
+ else:
2347
+ font = wx.Font(
2348
+ int(s), of.GetFamily(), of.GetStyle(), of.GetWeight())
2349
+ self._fontCache[key] = font
2350
+ return font
2351
+
2352
+ def _point2ClientCoord(self, corner1, corner2):
2353
+ """Converts user point coords to client screen int
2354
+ coords x,y,width,height"""
2355
+ c1 = np.array(corner1)
2356
+ c2 = np.array(corner2)
2357
+ # convert to screen coords
2358
+ pt1 = c1 * self._pointScale + self._pointShift
2359
+ pt2 = c2 * self._pointScale + self._pointShift
2360
+ # make height and width positive
2361
+ pul = np.minimum(pt1, pt2) # Upper left corner
2362
+ plr = np.maximum(pt1, pt2) # Lower right corner
2363
+ rectWidth, rectHeight = plr - pul
2364
+ ptx, pty = pul
2365
+ return ptx, pty, rectWidth, rectHeight
2366
+
2367
+ def _axisInterval(self, spec, lower, upper):
2368
+ """Returns sensible axis range for given spec"""
2369
+ if spec == 'none' or spec == 'min' or isinstance(spec, (float, int)):
2370
+ if lower == upper:
2371
+ return lower - 0.5, upper + 0.5
2372
+ else:
2373
+ return lower, upper
2374
+ elif spec == 'auto':
2375
+ range = upper - lower
2376
+ if range == 0.:
2377
+ return lower - 0.5, upper + 0.5
2378
+ log = np.log10(range)
2379
+ power = np.floor(log)
2380
+ fraction = log - power
2381
+ if fraction <= 0.05:
2382
+ power = power - 1
2383
+ grid = 10. ** power
2384
+ lower = lower - lower % grid
2385
+ mod = upper % grid
2386
+ if mod != 0:
2387
+ upper = upper - mod + grid
2388
+ return lower, upper
2389
+ # elif type(spec) == type(()):
2390
+ elif isinstance(spec, tuple):
2391
+ lower, upper = spec
2392
+ if lower <= upper:
2393
+ return lower, upper
2394
+ else:
2395
+ return upper, lower
2396
+ else:
2397
+ raise ValueError(str(spec) + ': illegal axis specification')
2398
+
2399
+ @TempStyle('pen')
2400
+ def _drawGrid(self, dc, p1, p2, scale, shift, xticks, yticks):
2401
+ """
2402
+ Draws the gridlines
2403
+
2404
+ :param :class:`wx.DC` `dc`: The :class:`wx.DC` to draw on.
2405
+ :type `dc`: :class:`wx.DC`
2406
+ :param p1: The lower-left hand corner of the plot in plot coords. So,
2407
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2408
+ p1 = (-10, -5)
2409
+ :type p1: :class:`np.array`, length 2
2410
+ :param p2: The upper-right hand corner of the plot in plot coords. So,
2411
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2412
+ p2 = (10, 5)
2413
+ :type p2: :class:`np.array`, length 2
2414
+ :param scale: The [X, Y] scaling factor to convert plot coords to
2415
+ DC coords
2416
+ :type scale: :class:`np.array`, length 2
2417
+ :param shift: The [X, Y] shift values to convert plot coords to
2418
+ DC coords. Must be in plot units, not DC units.
2419
+ :type shift: :class:`np.array`, length 2
2420
+ :param xticks: The X tick definition
2421
+ :type xticks: list of length-2 lists
2422
+ :param yticks: The Y tick definition
2423
+ :type yticks: list of length-2 lists
2424
+ """
2425
+ # increases thickness for printing only
2426
+ pen = self.gridPen
2427
+ penWidth = self.printerScale * pen.GetWidth()
2428
+ pen.SetWidth(int(penWidth))
2429
+ dc.SetPen(pen)
2430
+
2431
+ x, y, width, height = self._point2ClientCoord(p1, p2)
2432
+
2433
+ if self._xSpec != 'none':
2434
+ if self.enableGrid[0]:
2435
+ for x, _ in xticks:
2436
+ pt = scale_and_shift_point(x, p1[1], scale, shift)
2437
+ dc.DrawLine(*map(int, (pt[0], pt[1], pt[0], pt[1] - height)))
2438
+
2439
+ if self._ySpec != 'none':
2440
+ if self.enableGrid[1]:
2441
+ for y, label in yticks:
2442
+ pt = scale_and_shift_point(p1[0], y, scale, shift)
2443
+ dc.DrawLine(*map(int, (pt[0], pt[1], pt[0] + width, pt[1])))
2444
+
2445
+ @TempStyle('pen')
2446
+ def _drawTicks(self, dc, p1, p2, scale, shift, xticks, yticks):
2447
+ """Draw the tick marks
2448
+
2449
+ :param :class:`wx.DC` `dc`: The :class:`wx.DC` to draw on.
2450
+ :type `dc`: :class:`wx.DC`
2451
+ :param p1: The lower-left hand corner of the plot in plot coords. So,
2452
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2453
+ p1 = (-10, -5)
2454
+ :type p1: :class:`np.array`, length 2
2455
+ :param p2: The upper-right hand corner of the plot in plot coords. So,
2456
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2457
+ p2 = (10, 5)
2458
+ :type p2: :class:`np.array`, length 2
2459
+ :param scale: The [X, Y] scaling factor to convert plot coords to
2460
+ DC coords
2461
+ :type scale: :class:`np.array`, length 2
2462
+ :param shift: The [X, Y] shift values to convert plot coords to
2463
+ DC coords. Must be in plot units, not DC units.
2464
+ :type shift: :class:`np.array`, length 2
2465
+ :param xticks: The X tick definition
2466
+ :type xticks: list of length-2 lists
2467
+ :param yticks: The Y tick definition
2468
+ :type yticks: list of length-2 lists
2469
+ """
2470
+ # TODO: add option for ticks to extend outside of graph
2471
+ # - done via negative ticklength values?
2472
+ # + works but the axes values cut off the ticks.
2473
+ # increases thickness for printing only
2474
+ pen = self.tickPen
2475
+ penWidth = self.printerScale * pen.GetWidth()
2476
+ pen.SetWidth(int(penWidth))
2477
+ dc.SetPen(pen)
2478
+
2479
+ # lengthen lines for printing
2480
+ xTickLength = self.tickLengthPrinterScale[0]
2481
+ yTickLength = self.tickLengthPrinterScale[1]
2482
+
2483
+ ticks = self.enableTicks
2484
+ if self.xSpec != 'none': # I don't like this :-/
2485
+ if ticks.bottom:
2486
+ lines = []
2487
+ for x, label in xticks:
2488
+ pt = scale_and_shift_point(x, p1[1], scale, shift)
2489
+ lines.append((pt[0], pt[1], pt[0], pt[1] - xTickLength))
2490
+ dc.DrawLineList(np.array(lines, dtype = int))
2491
+ if ticks.top:
2492
+ lines = []
2493
+ for x, label in xticks:
2494
+ pt = scale_and_shift_point(x, p2[1], scale, shift)
2495
+ lines.append((pt[0], pt[1], pt[0], pt[1] + xTickLength))
2496
+ dc.DrawLineList(np.array(lines, dtype = int))
2497
+
2498
+ if self.ySpec != 'none':
2499
+ if ticks.left:
2500
+ lines = []
2501
+ for y, label in yticks:
2502
+ pt = scale_and_shift_point(p1[0], y, scale, shift)
2503
+ lines.append((pt[0], pt[1], pt[0] + yTickLength, pt[1]))
2504
+ dc.DrawLineList(np.array(lines, dtype = int))
2505
+ if ticks.right:
2506
+ lines = []
2507
+ for y, label in yticks:
2508
+ pt = scale_and_shift_point(p2[0], y, scale, shift)
2509
+ lines.append((pt[0], pt[1], pt[0] - yTickLength, pt[1]))
2510
+ dc.DrawLineList(np.array(lines, dtype = int))
2511
+
2512
+ @TempStyle('pen')
2513
+ def _drawCenterLines(self, dc, p1, p2, scale, shift):
2514
+ """Draws the center lines
2515
+
2516
+ :param :class:`wx.DC` `dc`: The :class:`wx.DC` to draw on.
2517
+ :type `dc`: :class:`wx.DC`
2518
+ :param p1: The lower-left hand corner of the plot in plot coords. So,
2519
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2520
+ p1 = (-10, -5)
2521
+ :type p1: :class:`np.array`, length 2
2522
+ :param p2: The upper-right hand corner of the plot in plot coords. So,
2523
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2524
+ p2 = (10, 5)
2525
+ :type p2: :class:`np.array`, length 2
2526
+ :param scale: The [X, Y] scaling factor to convert plot coords to
2527
+ DC coords
2528
+ :type scale: :class:`np.array`, length 2
2529
+ :param shift: The [X, Y] shift values to convert plot coords to
2530
+ DC coords. Must be in plot units, not DC units.
2531
+ :type shift: :class:`np.array`, length 2
2532
+ """
2533
+ # increases thickness for printing only
2534
+ pen = self.centerLinePen
2535
+ penWidth = self.printerScale * pen.GetWidth()
2536
+ pen.SetWidth(int(penWidth))
2537
+ dc.SetPen(pen)
2538
+
2539
+ if self._centerLinesEnabled in ('Horizontal', True):
2540
+ y1 = scale[1] * p1[1] + shift[1]
2541
+ y2 = scale[1] * p2[1] + shift[1]
2542
+ y = (y1 - y2) / 2.0 + y2
2543
+ dc.DrawLine(*map(int, (scale[0] * p1[0] + shift[0],
2544
+ y,
2545
+ scale[0] * p2[0] + shift[0],
2546
+ y)))
2547
+ if self._centerLinesEnabled in ('Vertical', True):
2548
+ x1 = scale[0] * p1[0] + shift[0]
2549
+ x2 = scale[0] * p2[0] + shift[0]
2550
+ x = (x1 - x2) / 2.0 + x2
2551
+ dc.DrawLine(*map(int, (x,
2552
+ scale[1] * p1[1] + shift[1],
2553
+ x,
2554
+ scale[1] * p2[1] + shift[1])))
2555
+
2556
+ @TempStyle('pen')
2557
+ def _drawDiagonals(self, dc, p1, p2, scale, shift):
2558
+ """
2559
+ Draws the diagonal lines.
2560
+
2561
+ :param :class:`wx.DC` `dc`: The :class:`wx.DC` to draw on.
2562
+ :type `dc`: :class:`wx.DC`
2563
+ :param p1: The lower-left hand corner of the plot in plot coords. So,
2564
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2565
+ p1 = (-10, -5)
2566
+ :type p1: :class:`np.array`, length 2
2567
+ :param p2: The upper-right hand corner of the plot in plot coords. So,
2568
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2569
+ p2 = (10, 5)
2570
+ :type p2: :class:`np.array`, length 2
2571
+ :param scale: The [X, Y] scaling factor to convert plot coords to
2572
+ DC coords
2573
+ :type scale: :class:`np.array`, length 2
2574
+ :param shift: The [X, Y] shift values to convert plot coords to
2575
+ DC coords. Must be in plot units, not DC units.
2576
+ :type shift: :class:`np.array`, length 2
2577
+ """
2578
+ pen = self.diagonalPen
2579
+ penWidth = self.printerScale * pen.GetWidth()
2580
+ pen.SetWidth(int(penWidth))
2581
+ dc.SetPen(pen)
2582
+
2583
+ if self._diagonalsEnabled in ('Bottomleft-Topright', True):
2584
+ dc.DrawLine(*map(int, (scale[0] * p1[0] + shift[0],
2585
+ scale[1] * p1[1] + shift[1],
2586
+ scale[0] * p2[0] + shift[0],
2587
+ scale[1] * p2[1] + shift[1])))
2588
+ if self._diagonalsEnabled in ('Bottomright-Topleft', True):
2589
+ dc.DrawLine(*map(int, (scale[0] * p1[0] + shift[0],
2590
+ scale[1] * p2[1] + shift[1],
2591
+ scale[0] * p2[0] + shift[0],
2592
+ scale[1] * p1[1] + shift[1])))
2593
+
2594
+ @TempStyle('pen')
2595
+ def _drawAxes(self, dc, p1, p2, scale, shift):
2596
+ """
2597
+ Draw the frame lines.
2598
+
2599
+ :param :class:`wx.DC` `dc`: The :class:`wx.DC` to draw on.
2600
+ :type `dc`: :class:`wx.DC`
2601
+ :param p1: The lower-left hand corner of the plot in plot coords. So,
2602
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2603
+ p1 = (-10, -5)
2604
+ :type p1: :class:`np.array`, length 2
2605
+ :param p2: The upper-right hand corner of the plot in plot coords. So,
2606
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2607
+ p2 = (10, 5)
2608
+ :type p2: :class:`np.array`, length 2
2609
+ :param scale: The [X, Y] scaling factor to convert plot coords to
2610
+ DC coords
2611
+ :type scale: :class:`np.array`, length 2
2612
+ :param shift: The [X, Y] shift values to convert plot coords to
2613
+ DC coords. Must be in plot units, not DC units.
2614
+ :type shift: :class:`np.array`, length 2
2615
+ """
2616
+ # increases thickness for printing only
2617
+ pen = self.axesPen
2618
+ penWidth = self.printerScale * pen.GetWidth()
2619
+ pen.SetWidth(int(penWidth))
2620
+ dc.SetPen(pen)
2621
+
2622
+ axes = self.enableAxes
2623
+ if self.xSpec != 'none':
2624
+ if axes.bottom:
2625
+ lower, upper = p1[0], p2[0]
2626
+ a1 = scale_and_shift_point(lower, p1[1], scale, shift)
2627
+ a2 = scale_and_shift_point(upper, p1[1], scale, shift)
2628
+ dc.DrawLine(*map(int, (a1[0], a1[1], a2[0], a2[1])))
2629
+ if axes.top:
2630
+ lower, upper = p1[0], p2[0]
2631
+ a1 = scale_and_shift_point(lower, p2[1], scale, shift)
2632
+ a2 = scale_and_shift_point(upper, p2[1], scale, shift)
2633
+ dc.DrawLine(*map(int, (a1[0], a1[1], a2[0], a2[1])))
2634
+
2635
+ if self.ySpec != 'none':
2636
+ if axes.left:
2637
+ lower, upper = p1[1], p2[1]
2638
+ a1 = scale_and_shift_point(p1[0], lower, scale, shift)
2639
+ a2 = scale_and_shift_point(p1[0], upper, scale, shift)
2640
+ dc.DrawLine(*map(int, (a1[0], a1[1], a2[0], a2[1])))
2641
+ if axes.right:
2642
+ lower, upper = p1[1], p2[1]
2643
+ a1 = scale_and_shift_point(p2[0], lower, scale, shift)
2644
+ a2 = scale_and_shift_point(p2[0], upper, scale, shift)
2645
+ dc.DrawLine(*map(int, (a1[0], a1[1], a2[0], a2[1])))
2646
+
2647
+ @TempStyle('pen')
2648
+ def _drawAxesValues(self, dc, p1, p2, scale, shift, xticks, yticks):
2649
+ """
2650
+ Draws the axes values: numbers representing each major grid or tick.
2651
+
2652
+ :param :class:`wx.DC` `dc`: The :class:`wx.DC` to draw on.
2653
+ :type `dc`: :class:`wx.DC`
2654
+ :param p1: The lower-left hand corner of the plot in plot coords. So,
2655
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2656
+ p1 = (-10, -5)
2657
+ :type p1: :class:`np.array`, length 2
2658
+ :param p2: The upper-right hand corner of the plot in plot coords. So,
2659
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2660
+ p2 = (10, 5)
2661
+ :type p2: :class:`np.array`, length 2
2662
+ :param scale: The [X, Y] scaling factor to convert plot coords to
2663
+ DC coords
2664
+ :type scale: :class:`np.array`, length 2
2665
+ :param shift: The [X, Y] shift values to convert plot coords to
2666
+ DC coords. Must be in plot units, not DC units.
2667
+ :type shift: :class:`np.array`, length 2
2668
+ :param xticks: The X tick definition
2669
+ :type xticks: list of length-2 lists
2670
+ :param yticks: The Y tick definition
2671
+ :type yticks: list of length-2 lists
2672
+ """
2673
+ # get the tick lengths so that labels don't overlap
2674
+ xTickLength = self.tickLengthPrinterScale[0]
2675
+ yTickLength = self.tickLengthPrinterScale[1]
2676
+ # only care about negative (out of plot area) tick lengths.
2677
+ xTickLength = xTickLength if xTickLength < 0 else 0
2678
+ yTickLength = yTickLength if yTickLength < 0 else 0
2679
+
2680
+ # TODO: More code duplication? Same as _drawGrid and _drawTicks?
2681
+ # TODO: update the bounding boxes when adding right and top values
2682
+ axes = self.enableAxesValues
2683
+ if self.xSpec != 'none':
2684
+ if axes.bottom:
2685
+ labels = [tick[1] for tick in xticks]
2686
+ coords = []
2687
+ for x, label in xticks:
2688
+ w = dc.GetTextExtent(label)[0]
2689
+ pt = scale_and_shift_point(x, p1[1], scale, shift)
2690
+ coords.append(
2691
+ (pt[0] - w/2,
2692
+ pt[1] + 2 * self._pointSize[1] - xTickLength)
2693
+ )
2694
+ dc.DrawTextList(labels, np.array(coords, dtype = int))
2695
+
2696
+ if axes.top:
2697
+ labels = [tick[1] for tick in xticks]
2698
+ coords = []
2699
+ for x, label in xticks:
2700
+ w, h = dc.GetTextExtent(label)
2701
+ pt = scale_and_shift_point(x, p2[1], scale, shift)
2702
+ coords.append(
2703
+ (pt[0] - w/2,
2704
+ pt[1] - 2 * self._pointSize[1] - h - xTickLength)
2705
+ )
2706
+ dc.DrawTextList(labels, np.array(coords, dtype = int))
2707
+
2708
+ if self.ySpec != 'none':
2709
+ if axes.left:
2710
+ h = dc.GetCharHeight()
2711
+ labels = [tick[1] for tick in yticks]
2712
+ coords = []
2713
+ for y, label in yticks:
2714
+ w = dc.GetTextExtent(label)[0]
2715
+ pt = scale_and_shift_point(p1[0], y, scale, shift)
2716
+ coords.append(
2717
+ (pt[0] - w - 3 * self._pointSize[0] + yTickLength,
2718
+ pt[1] - 0.5 * h)
2719
+ )
2720
+ dc.DrawTextList(labels, np.array(coords, dtype = int))
2721
+
2722
+ if axes.right:
2723
+ h = dc.GetCharHeight()
2724
+ labels = [tick[1] for tick in yticks]
2725
+ coords = []
2726
+ for y, label in yticks:
2727
+ w = dc.GetTextExtent(label)[0]
2728
+ pt = scale_and_shift_point(p2[0], y, scale, shift)
2729
+ coords.append(
2730
+ (pt[0] + 3 * self._pointSize[0] + yTickLength,
2731
+ pt[1] - 0.5 * h)
2732
+ )
2733
+ dc.DrawTextList(labels, np.array(coords, dtype = int))
2734
+
2735
+ @TempStyle('pen')
2736
+ def _drawPlotAreaItems(self, dc, p1, p2, scale, shift, xticks, yticks):
2737
+ """
2738
+ Draws each frame element
2739
+
2740
+ :param :class:`wx.DC` `dc`: The :class:`wx.DC` to draw on.
2741
+ :type `dc`: :class:`wx.DC`
2742
+ :param p1: The lower-left hand corner of the plot in plot coords. So,
2743
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2744
+ p1 = (-10, -5)
2745
+ :type p1: :class:`np.array`, length 2
2746
+ :param p2: The upper-right hand corner of the plot in plot coords. So,
2747
+ if the plot ranges from x=-10 to 10 and y=-5 to 5, then
2748
+ p2 = (10, 5)
2749
+ :type p2: :class:`np.array`, length 2
2750
+ :param scale: The [X, Y] scaling factor to convert plot coords to
2751
+ DC coords
2752
+ :type scale: :class:`np.array`, length 2
2753
+ :param shift: The [X, Y] shift values to convert plot coords to
2754
+ DC coords. Must be in plot units, not DC units.
2755
+ :type shift: :class:`np.array`, length 2
2756
+ :param xticks: The X tick definition
2757
+ :type xticks: list of length-2 lists
2758
+ :param yticks: The Y tick definition
2759
+ :type yticks: list of length-2 lists
2760
+ """
2761
+ if self._gridEnabled:
2762
+ self._drawGrid(dc, p1, p2, scale, shift, xticks, yticks)
2763
+
2764
+ if self._ticksEnabled:
2765
+ self._drawTicks(dc, p1, p2, scale, shift, xticks, yticks)
2766
+
2767
+ if self._centerLinesEnabled:
2768
+ self._drawCenterLines(dc, p1, p2, scale, shift)
2769
+
2770
+ if self._diagonalsEnabled:
2771
+ self._drawDiagonals(dc, p1, p2, scale, shift)
2772
+
2773
+ if self._axesEnabled:
2774
+ self._drawAxes(dc, p1, p2, scale, shift)
2775
+
2776
+ if self._axesValuesEnabled:
2777
+ self._drawAxesValues(dc, p1, p2, scale, shift, xticks, yticks)
2778
+
2779
+ @TempStyle('pen')
2780
+ def _drawPlotTitle(self, dc, graphics, lhsW, rhsW, titleWH):
2781
+ """
2782
+ Draws the plot title
2783
+ """
2784
+ dc.SetFont(self._getFont(self._fontSizeTitle))
2785
+ titlePos = (
2786
+ self.plotbox_origin[0] + lhsW
2787
+ + (self.plotbox_size[0] - lhsW - rhsW) / 2. - titleWH[0] / 2.,
2788
+ self.plotbox_origin[1] - self.plotbox_size[1]
2789
+ )
2790
+ titlePos = list(map(int, titlePos))
2791
+ dc.DrawText(graphics.title, titlePos[0], titlePos[1])
2792
+
2793
+ def _drawAxesLabels(self, dc, graphics, lhsW, rhsW, bottomH, topH,
2794
+ xLabelWH, yLabelWH):
2795
+ """
2796
+ Draws the axes labels
2797
+ """
2798
+ # get the tick lengths so that labels don't overlap
2799
+ xTickLength = self.tickLengthPrinterScale[0]
2800
+ yTickLength = self.tickLengthPrinterScale[1]
2801
+ # only care about negative (out of plot area) tick lengths.
2802
+ xTickLength = xTickLength if xTickLength < 0 else 0
2803
+ yTickLength = yTickLength if yTickLength < 0 else 0
2804
+
2805
+ # TODO: axes values get big when this is turned off
2806
+ dc.SetFont(self._getFont(self._fontSizeAxis))
2807
+ xLabelPos = (
2808
+ self.plotbox_origin[0] + lhsW
2809
+ + (self.plotbox_size[0] - lhsW - rhsW) / 2. - xLabelWH[0] / 2.,
2810
+ self.plotbox_origin[1] - xLabelWH[1] - yTickLength
2811
+ )
2812
+ xLabelPos = list(map(int, xLabelPos))
2813
+ dc.DrawText(graphics.xLabel, xLabelPos[0], xLabelPos[1])
2814
+ yLabelPos = (
2815
+ self.plotbox_origin[0] - 3 * self._pointSize[0] + xTickLength,
2816
+ self.plotbox_origin[1] - bottomH
2817
+ - (self.plotbox_size[1] - bottomH - topH) / 2. + yLabelWH[0] / 2.
2818
+ )
2819
+ yLabelPos = list(map(int, yLabelPos))
2820
+ if graphics.yLabel: # bug fix for Linux
2821
+ dc.DrawRotatedText(
2822
+ graphics.yLabel, yLabelPos[0], yLabelPos[1], 90)
2823
+
2824
+ @TempStyle('pen')
2825
+ def _drawPlotAreaLabels(self, dc, graphics, lhsW, rhsW, titleWH,
2826
+ bottomH, topH, xLabelWH, yLabelWH):
2827
+ """
2828
+ Draw the plot area labels.
2829
+ """
2830
+ if self._titleEnabled:
2831
+ self._drawPlotTitle(dc, graphics, lhsW, rhsW, titleWH)
2832
+
2833
+ if self._axesLabelsEnabled:
2834
+ self._drawAxesLabels(dc, graphics, lhsW, rhsW,
2835
+ bottomH, topH, xLabelWH, yLabelWH)
2836
+
2837
+ def _xticks(self, *args):
2838
+ if self._logscale[0]:
2839
+ return self._logticks(*args)
2840
+ else:
2841
+ attr = {'numticks': self._xSpec}
2842
+ return self._ticks(*args, **attr)
2843
+
2844
+ def _yticks(self, *args):
2845
+ if self._logscale[1]:
2846
+ return self._logticks(*args)
2847
+ else:
2848
+ attr = {'numticks': self._ySpec}
2849
+ return self._ticks(*args, **attr)
2850
+
2851
+ def _logticks(self, lower, upper):
2852
+ #lower,upper = map(np.log10,[lower,upper])
2853
+ # print('logticks',lower,upper)
2854
+ ticks = []
2855
+ mag = np.power(10, np.floor(lower))
2856
+ if upper - lower > 6:
2857
+ t = np.power(10, np.ceil(lower))
2858
+ base = np.power(10, np.floor((upper - lower) / 6))
2859
+
2860
+ def inc(t):
2861
+ return t * base - t
2862
+ else:
2863
+ t = np.ceil(np.power(10, lower) / mag) * mag
2864
+
2865
+ def inc(t):
2866
+ return 10 ** int(np.floor(np.log10(t) + 1e-16))
2867
+ majortick = int(np.log10(mag))
2868
+ while t <= pow(10, upper):
2869
+ if majortick != int(np.floor(np.log10(t) + 1e-16)):
2870
+ majortick = int(np.floor(np.log10(t) + 1e-16))
2871
+ ticklabel = '1e%d' % majortick
2872
+ else:
2873
+ if upper - lower < 2:
2874
+ minortick = int(t / pow(10, majortick) + .5)
2875
+ ticklabel = '%de%d' % (minortick, majortick)
2876
+ else:
2877
+ ticklabel = ''
2878
+ ticks.append((np.log10(t), ticklabel))
2879
+ t += inc(t)
2880
+ if len(ticks) == 0:
2881
+ ticks = [(0, '')]
2882
+ return ticks
2883
+
2884
+ def _ticks(self, lower, upper, numticks=None):
2885
+ if isinstance(numticks, (float, int)):
2886
+ ideal = (upper - lower) / float(numticks)
2887
+ else:
2888
+ ideal = (upper - lower) / 7.
2889
+ log = np.log10(ideal)
2890
+ power = np.floor(log)
2891
+ if isinstance(numticks, (float, int)):
2892
+ grid = ideal
2893
+ else:
2894
+ fraction = log - power
2895
+ factor = 1.
2896
+ error = fraction
2897
+ for f, lf in self._multiples:
2898
+ e = np.fabs(fraction - lf)
2899
+ if e < error:
2900
+ error = e
2901
+ factor = f
2902
+ grid = factor * 10. ** power
2903
+ if self._useScientificNotation and (power > 4 or power < -4):
2904
+ format = '%+7.1e'
2905
+ elif power >= 0:
2906
+ digits = max(1, int(power))
2907
+ format = '%' + repr(digits) + '.0f'
2908
+ else:
2909
+ digits = -int(power)
2910
+ format = '%' + repr(digits + 2) + '.' + repr(digits) + 'f'
2911
+ ticks = []
2912
+ t = -grid * np.floor(-lower / grid)
2913
+ while t <= upper:
2914
+ if t == -0:
2915
+ t = 0
2916
+ ticks.append((t, format % (t,)))
2917
+ t = t + grid
2918
+ return ticks
2919
+
2920
+ _multiples = [(2., np.log10(2.)), (5., np.log10(5.))]
2921
+
2922
+
2923
+ def _adjustScrollbars(self):
2924
+ if self._sb_ignore:
2925
+ self._sb_ignore = False
2926
+ return
2927
+
2928
+ if not self.showScrollbars:
2929
+ return
2930
+
2931
+ self._adjustingSB = True
2932
+ needScrollbars = False
2933
+
2934
+ # horizontal scrollbar
2935
+ r_current = self._getXCurrentRange()
2936
+ r_max = list(self._getXMaxRange())
2937
+ sbfullrange = float(self.sb_hor.GetRange())
2938
+
2939
+ r_max[0] = min(r_max[0], r_current[0])
2940
+ r_max[1] = max(r_max[1], r_current[1])
2941
+
2942
+ self._sb_xfullrange = r_max
2943
+
2944
+ unit = (r_max[1] - r_max[0]) / float(self.sb_hor.GetRange())
2945
+ pos = int((r_current[0] - r_max[0]) / unit)
2946
+
2947
+ if pos >= 0:
2948
+ pagesize = int((r_current[1] - r_current[0]) / unit)
2949
+ args = pos, pagesize, sbfullrange, pagesize
2950
+ self.sb_hor.SetScrollbar(*np.array(args, dtype = int))
2951
+ self._sb_xunit = unit
2952
+ needScrollbars = needScrollbars or (pagesize != sbfullrange)
2953
+ else:
2954
+ self.sb_hor.SetScrollbar(0, 1000, 1000, 1000)
2955
+
2956
+ # vertical scrollbar
2957
+ r_current = self._getYCurrentRange()
2958
+ r_max = list(self._getYMaxRange())
2959
+ sbfullrange = float(self.sb_vert.GetRange())
2960
+
2961
+ r_max[0] = min(r_max[0], r_current[0])
2962
+ r_max[1] = max(r_max[1], r_current[1])
2963
+
2964
+ self._sb_yfullrange = r_max
2965
+
2966
+ unit = (r_max[1] - r_max[0]) / sbfullrange
2967
+ pos = int((r_current[0] - r_max[0]) / unit)
2968
+
2969
+ if pos >= 0:
2970
+ pagesize = int((r_current[1] - r_current[0]) / unit)
2971
+ pos = (sbfullrange - 1 - pos - pagesize)
2972
+ args = pos, pagesize, sbfullrange, pagesize
2973
+ self.sb_vert.SetScrollbar(*np.array(args, dtype = int))
2974
+ self._sb_yunit = unit
2975
+ needScrollbars = needScrollbars or (pagesize != sbfullrange)
2976
+ else:
2977
+ self.sb_vert.SetScrollbar(0, 1000, 1000, 1000)
2978
+
2979
+ self.sb_hor.Show(needScrollbars)
2980
+ self.sb_vert.Show(needScrollbars)
2981
+ self._adjustingSB = False