wxPython 4.3.2__cp315-cp315-win_arm64.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.
- wx/WebView2Loader.dll +0 -0
- wx/__init__.py +22 -0
- wx/__init__.pyi +10 -0
- wx/__version__.py +9 -0
- wx/__version__.pyi +15 -0
- wx/_adv.cp315-win_arm64.pyd +0 -0
- wx/_aui.cp315-win_arm64.pyd +0 -0
- wx/_core.cp315-win_arm64.pyd +0 -0
- wx/_dataview.cp315-win_arm64.pyd +0 -0
- wx/_glcanvas.cp315-win_arm64.pyd +0 -0
- wx/_grid.cp315-win_arm64.pyd +0 -0
- wx/_html.cp315-win_arm64.pyd +0 -0
- wx/_html2.cp315-win_arm64.pyd +0 -0
- wx/_media.cp315-win_arm64.pyd +0 -0
- wx/_msw.cp315-win_arm64.pyd +0 -0
- wx/_propgrid.cp315-win_arm64.pyd +0 -0
- wx/_ribbon.cp315-win_arm64.pyd +0 -0
- wx/_richtext.cp315-win_arm64.pyd +0 -0
- wx/_stc.cp315-win_arm64.pyd +0 -0
- wx/_xml.cp315-win_arm64.pyd +0 -0
- wx/_xrc.cp315-win_arm64.pyd +0 -0
- wx/adv.py +127 -0
- wx/adv.pyi +5931 -0
- wx/aui.py +70 -0
- wx/aui.pyi +4805 -0
- wx/core.py +3417 -0
- wx/core.pyi +62949 -0
- wx/dataview.py +176 -0
- wx/dataview.pyi +3828 -0
- wx/gizmos.py +18 -0
- wx/glcanvas.py +13 -0
- wx/glcanvas.pyi +544 -0
- wx/grid.py +237 -0
- wx/grid.pyi +5678 -0
- wx/html.py +38 -0
- wx/html.pyi +3283 -0
- wx/html2.py +46 -0
- wx/html2.pyi +1301 -0
- wx/include/wxPython/sip.h +1938 -0
- wx/include/wxPython/wxpy_api.h +418 -0
- wx/lib/CDate.py +201 -0
- wx/lib/ClickableHtmlWindow.py +57 -0
- wx/lib/__init__.py +0 -0
- wx/lib/activex.py +178 -0
- wx/lib/activexwrapper.py +153 -0
- wx/lib/agw/__init__.py +128 -0
- wx/lib/agw/advancedsplash.py +563 -0
- wx/lib/agw/aquabutton.py +1127 -0
- wx/lib/agw/artmanager.py +2110 -0
- wx/lib/agw/aui/__init__.py +295 -0
- wx/lib/agw/aui/aui_constants.py +2616 -0
- wx/lib/agw/aui/aui_switcherdialog.py +1232 -0
- wx/lib/agw/aui/aui_utilities.py +648 -0
- wx/lib/agw/aui/auibar.py +4045 -0
- wx/lib/agw/aui/auibook.py +6288 -0
- wx/lib/agw/aui/dockart.py +1198 -0
- wx/lib/agw/aui/framemanager.py +10485 -0
- wx/lib/agw/aui/tabart.py +2749 -0
- wx/lib/agw/aui/tabmdi.py +679 -0
- wx/lib/agw/balloontip.py +1157 -0
- wx/lib/agw/buttonpanel.py +2787 -0
- wx/lib/agw/cubecolourdialog.py +3529 -0
- wx/lib/agw/customtreectrl.py +9908 -0
- wx/lib/agw/data/ShortcutEditor_1.png +0 -0
- wx/lib/agw/data/ShortcutEditor_1_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_2.png +0 -0
- wx/lib/agw/data/ShortcutEditor_2_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_3.png +0 -0
- wx/lib/agw/data/ShortcutEditor_3_thumb.png +0 -0
- wx/lib/agw/data/ShortcutEditor_4.png +0 -0
- wx/lib/agw/data/ShortcutEditor_4_thumb.png +0 -0
- wx/lib/agw/data/default_help_text.html +105 -0
- wx/lib/agw/flatmenu.py +7392 -0
- wx/lib/agw/flatnotebook.py +6669 -0
- wx/lib/agw/floatspin.py +1820 -0
- wx/lib/agw/fmcustomizedlg.py +535 -0
- wx/lib/agw/fmresources.py +407 -0
- wx/lib/agw/foldpanelbar.py +2282 -0
- wx/lib/agw/fourwaysplitter.py +1130 -0
- wx/lib/agw/genericmessagedialog.py +1549 -0
- wx/lib/agw/gradientbutton.py +731 -0
- wx/lib/agw/hyperlink.py +664 -0
- wx/lib/agw/hypertreelist.py +5756 -0
- wx/lib/agw/infobar.py +885 -0
- wx/lib/agw/knobctrl.py +944 -0
- wx/lib/agw/labelbook.py +3028 -0
- wx/lib/agw/multidirdialog.py +581 -0
- wx/lib/agw/peakmeter.py +1028 -0
- wx/lib/agw/persist/__init__.py +188 -0
- wx/lib/agw/persist/persist_constants.py +283 -0
- wx/lib/agw/persist/persist_handlers.py +2614 -0
- wx/lib/agw/persist/persistencemanager.py +863 -0
- wx/lib/agw/piectrl.py +1082 -0
- wx/lib/agw/pybusyinfo.py +399 -0
- wx/lib/agw/pycollapsiblepane.py +940 -0
- wx/lib/agw/pygauge.py +570 -0
- wx/lib/agw/pyprogress.py +916 -0
- wx/lib/agw/ribbon/__init__.py +198 -0
- wx/lib/agw/ribbon/art.py +219 -0
- wx/lib/agw/ribbon/art_aui.py +1283 -0
- wx/lib/agw/ribbon/art_default.py +81 -0
- wx/lib/agw/ribbon/art_internal.py +248 -0
- wx/lib/agw/ribbon/art_msw.py +2735 -0
- wx/lib/agw/ribbon/art_osx.py +52 -0
- wx/lib/agw/ribbon/bar.py +1259 -0
- wx/lib/agw/ribbon/buttonbar.py +1317 -0
- wx/lib/agw/ribbon/control.py +205 -0
- wx/lib/agw/ribbon/gallery.py +973 -0
- wx/lib/agw/ribbon/page.py +946 -0
- wx/lib/agw/ribbon/panel.py +1170 -0
- wx/lib/agw/ribbon/toolbar.py +1441 -0
- wx/lib/agw/rulerctrl.py +1885 -0
- wx/lib/agw/scrolledthumbnail.py +2116 -0
- wx/lib/agw/shapedbutton.py +1809 -0
- wx/lib/agw/shortcuteditor.py +2642 -0
- wx/lib/agw/speedmeter.py +1800 -0
- wx/lib/agw/supertooltip.py +1443 -0
- wx/lib/agw/thumbnailctrl.py +529 -0
- wx/lib/agw/toasterbox.py +1327 -0
- wx/lib/agw/ultimatelistctrl.py +13671 -0
- wx/lib/agw/xlsgrid.py +2111 -0
- wx/lib/agw/zoombar.py +1336 -0
- wx/lib/analogclock/__init__.py +140 -0
- wx/lib/analogclock/analogclock.py +630 -0
- wx/lib/analogclock/helpers.py +986 -0
- wx/lib/analogclock/lib_setup/__init__.py +0 -0
- wx/lib/analogclock/lib_setup/buttontreectrlpanel.py +297 -0
- wx/lib/analogclock/lib_setup/fontselect.py +57 -0
- wx/lib/analogclock/setup.py +490 -0
- wx/lib/analogclock/styles.py +47 -0
- wx/lib/anchors.py +103 -0
- wx/lib/art/__init__.py +4 -0
- wx/lib/art/flagart.py +1583 -0
- wx/lib/art/img2pyartprov.py +56 -0
- wx/lib/busy.py +152 -0
- wx/lib/buttons.py +1140 -0
- wx/lib/calendar.py +1596 -0
- wx/lib/checkbox.py +837 -0
- wx/lib/colourchooser/__init__.py +36 -0
- wx/lib/colourchooser/canvas.py +145 -0
- wx/lib/colourchooser/intl.py +24 -0
- wx/lib/colourchooser/pycolourbox.py +89 -0
- wx/lib/colourchooser/pycolourchooser.py +626 -0
- wx/lib/colourchooser/pycolourslider.py +98 -0
- wx/lib/colourchooser/pypalette.py +208 -0
- wx/lib/colourdb.py +740 -0
- wx/lib/colourselect.py +385 -0
- wx/lib/colourutils.py +118 -0
- wx/lib/combotreebox.py +944 -0
- wx/lib/delayedresult.py +420 -0
- wx/lib/dialogs.py +510 -0
- wx/lib/docview.py +3210 -0
- wx/lib/dragscroller.py +79 -0
- wx/lib/editor/README.txt +77 -0
- wx/lib/editor/__init__.py +24 -0
- wx/lib/editor/editor.py +974 -0
- wx/lib/editor/images.py +15 -0
- wx/lib/editor/selection.py +44 -0
- wx/lib/embeddedimage.py +76 -0
- wx/lib/eventStack.py +136 -0
- wx/lib/eventwatcher.py +440 -0
- wx/lib/evtmgr.py +521 -0
- wx/lib/expando.py +393 -0
- wx/lib/fancytext.py +494 -0
- wx/lib/filebrowsebutton.py +461 -0
- wx/lib/flashwin.py +262 -0
- wx/lib/flashwin_old.py +651 -0
- wx/lib/floatcanvas/FCEvents.py +53 -0
- wx/lib/floatcanvas/FCObjects.py +2910 -0
- wx/lib/floatcanvas/FloatCanvas.py +1025 -0
- wx/lib/floatcanvas/GUIMode.py +396 -0
- wx/lib/floatcanvas/NavCanvas.py +162 -0
- wx/lib/floatcanvas/Resources.py +319 -0
- wx/lib/floatcanvas/ScreenShot.py +1788 -0
- wx/lib/floatcanvas/Utilities/BBox.py +313 -0
- wx/lib/floatcanvas/Utilities/Colors.py +137 -0
- wx/lib/floatcanvas/Utilities/GUI.py +91 -0
- wx/lib/floatcanvas/Utilities/__init__.py +7 -0
- wx/lib/floatcanvas/__init__.py +124 -0
- wx/lib/foldmenu.py +89 -0
- wx/lib/gestures.py +310 -0
- wx/lib/gizmos/__init__.py +18 -0
- wx/lib/gizmos/dynamicsash.py +1202 -0
- wx/lib/gizmos/ledctrl.py +299 -0
- wx/lib/gizmos/treelistctrl.py +87 -0
- wx/lib/graphics.py +1942 -0
- wx/lib/gridmovers.py +516 -0
- wx/lib/iewin.py +249 -0
- wx/lib/iewin_old.py +894 -0
- wx/lib/imagebrowser.py +853 -0
- wx/lib/imageutils.py +163 -0
- wx/lib/infoframe.py +490 -0
- wx/lib/inspection.py +1254 -0
- wx/lib/intctrl.py +990 -0
- wx/lib/itemspicker.py +256 -0
- wx/lib/langlistctrl.py +480 -0
- wx/lib/layoutf.py +271 -0
- wx/lib/masked/__init__.py +27 -0
- wx/lib/masked/combobox.py +839 -0
- wx/lib/masked/ctrl.py +108 -0
- wx/lib/masked/ipaddrctrl.py +241 -0
- wx/lib/masked/maskededit.py +7262 -0
- wx/lib/masked/numctrl.py +2000 -0
- wx/lib/masked/textctrl.py +465 -0
- wx/lib/masked/timectrl.py +1465 -0
- wx/lib/mixins/__init__.py +17 -0
- wx/lib/mixins/grid.py +47 -0
- wx/lib/mixins/gridlabelrenderer.py +277 -0
- wx/lib/mixins/imagelist.py +77 -0
- wx/lib/mixins/inspection.py +184 -0
- wx/lib/mixins/listctrl.py +893 -0
- wx/lib/mixins/rubberband.py +403 -0
- wx/lib/mixins/treemixin.py +678 -0
- wx/lib/msgpanel.py +95 -0
- wx/lib/multisash.py +746 -0
- wx/lib/myole4ax.idl +178 -0
- wx/lib/myole4ax.tlb +0 -0
- wx/lib/newevent.py +229 -0
- wx/lib/newevent.pyi +25 -0
- wx/lib/nvdlg.py +156 -0
- wx/lib/ogl/__init__.py +13 -0
- wx/lib/ogl/basic.py +3989 -0
- wx/lib/ogl/bmpshape.py +86 -0
- wx/lib/ogl/canvas.py +467 -0
- wx/lib/ogl/composit.py +1576 -0
- wx/lib/ogl/diagram.py +230 -0
- wx/lib/ogl/divided.py +482 -0
- wx/lib/ogl/drawn.py +898 -0
- wx/lib/ogl/lines.py +1809 -0
- wx/lib/ogl/oglmisc.py +607 -0
- wx/lib/pdfviewer/__init__.py +113 -0
- wx/lib/pdfviewer/bitmaps/ArrowLeft.png +0 -0
- wx/lib/pdfviewer/bitmaps/ArrowRight.png +0 -0
- wx/lib/pdfviewer/bitmaps/DirectionH.png +0 -0
- wx/lib/pdfviewer/bitmaps/DirectionV.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerFirst.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerLast.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerNext.png +0 -0
- wx/lib/pdfviewer/bitmaps/PlayerPrev.png +0 -0
- wx/lib/pdfviewer/bitmaps/Printer.png +0 -0
- wx/lib/pdfviewer/bitmaps/ReadMe.txt +28 -0
- wx/lib/pdfviewer/bitmaps/Save.png +0 -0
- wx/lib/pdfviewer/bitmaps/ZoomIn.png +0 -0
- wx/lib/pdfviewer/bitmaps/ZoomOut.png +0 -0
- wx/lib/pdfviewer/bitmaps/encode_bitmaps.py +37 -0
- wx/lib/pdfviewer/buttonpanel.py +285 -0
- wx/lib/pdfviewer/images.py +240 -0
- wx/lib/pdfviewer/viewer.py +1118 -0
- wx/lib/pdfwin.py +295 -0
- wx/lib/pdfwin_old.py +789 -0
- wx/lib/platebtn.py +789 -0
- wx/lib/plot/CHANGELOG.md +150 -0
- wx/lib/plot/README.md +16 -0
- wx/lib/plot/__init__.py +46 -0
- wx/lib/plot/__main__.py +5 -0
- wx/lib/plot/examples/__init__.py +0 -0
- wx/lib/plot/examples/demo.py +1010 -0
- wx/lib/plot/examples/simple_example.py +56 -0
- wx/lib/plot/plotcanvas.py +2985 -0
- wx/lib/plot/polyobjects.py +1524 -0
- wx/lib/plot/utils.py +334 -0
- wx/lib/popupctl.py +251 -0
- wx/lib/printout.py +1155 -0
- wx/lib/progressindicator.py +151 -0
- wx/lib/pubsub/LICENSE_BSD_Simple.txt +23 -0
- wx/lib/pubsub/README_WxPython.txt +22 -0
- wx/lib/pubsub/RELEASE_NOTES.txt +71 -0
- wx/lib/pubsub/__init__.py +25 -0
- wx/lib/pubsub/core/__init__.py +92 -0
- wx/lib/pubsub/core/arg1/__init__.py +16 -0
- wx/lib/pubsub/core/arg1/listenerimpl.py +97 -0
- wx/lib/pubsub/core/arg1/publisher.py +40 -0
- wx/lib/pubsub/core/arg1/publishermixin.py +34 -0
- wx/lib/pubsub/core/arg1/topicargspecimpl.py +66 -0
- wx/lib/pubsub/core/arg1/topicmgrimpl.py +19 -0
- wx/lib/pubsub/core/callables.py +198 -0
- wx/lib/pubsub/core/imp2.py +62 -0
- wx/lib/pubsub/core/itopicdefnprovider.py +0 -0
- wx/lib/pubsub/core/kwargs/__init__.py +16 -0
- wx/lib/pubsub/core/kwargs/datamsg.py +27 -0
- wx/lib/pubsub/core/kwargs/listenerimpl.py +93 -0
- wx/lib/pubsub/core/kwargs/publisher.py +77 -0
- wx/lib/pubsub/core/kwargs/publishermixin.py +65 -0
- wx/lib/pubsub/core/kwargs/topicargspecimpl.py +216 -0
- wx/lib/pubsub/core/kwargs/topicmgrimpl.py +13 -0
- wx/lib/pubsub/core/listener.py +40 -0
- wx/lib/pubsub/core/listenerbase.py +185 -0
- wx/lib/pubsub/core/notificationmgr.py +185 -0
- wx/lib/pubsub/core/publisherbase.py +189 -0
- wx/lib/pubsub/core/topicargspec.py +77 -0
- wx/lib/pubsub/core/topicdefnprovider.py +631 -0
- wx/lib/pubsub/core/topicexc.py +72 -0
- wx/lib/pubsub/core/topicmgr.py +454 -0
- wx/lib/pubsub/core/topicobj.py +472 -0
- wx/lib/pubsub/core/topictreetraverser.py +143 -0
- wx/lib/pubsub/core/topicutils.py +119 -0
- wx/lib/pubsub/core/treeconfig.py +21 -0
- wx/lib/pubsub/core/validatedefnargs.py +29 -0
- wx/lib/pubsub/core/weakmethod.py +102 -0
- wx/lib/pubsub/policies.py +24 -0
- wx/lib/pubsub/pub.py +199 -0
- wx/lib/pubsub/setuparg1.py +47 -0
- wx/lib/pubsub/setupkwargs.py +29 -0
- wx/lib/pubsub/utils/__init__.py +27 -0
- wx/lib/pubsub/utils/exchandling.py +100 -0
- wx/lib/pubsub/utils/misc.py +99 -0
- wx/lib/pubsub/utils/notification.py +331 -0
- wx/lib/pubsub/utils/topictreeprinter.py +195 -0
- wx/lib/pubsub/utils/xmltopicdefnprovider.py +286 -0
- wx/lib/pydocview.py +3300 -0
- wx/lib/rcsizer.py +227 -0
- wx/lib/resizewidget.py +357 -0
- wx/lib/scrolledpanel.py +243 -0
- wx/lib/sheet.py +350 -0
- wx/lib/sized_controls.py +691 -0
- wx/lib/softwareupdate.py +355 -0
- wx/lib/splitter.py +925 -0
- wx/lib/statbmp.py +199 -0
- wx/lib/stattext.py +321 -0
- wx/lib/throbber.py +424 -0
- wx/lib/ticker.py +306 -0
- wx/lib/ticker_xrc.py +48 -0
- wx/lib/utils.py +89 -0
- wx/lib/wordwrap.py +97 -0
- wx/lib/wxcairo/__init__.py +139 -0
- wx/lib/wxcairo/wx_cairocffi.py +200 -0
- wx/lib/wxcairo/wx_pycairo.py +455 -0
- wx/lib/wxpTag.py +274 -0
- wx/locale/af/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/an/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ar/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ca/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ca@valencia/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/co/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/cs/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/da/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/de/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/el/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/es/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/eu/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fa_IR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/fr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/gl_ES/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/hu/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/id/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/it/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ja/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ka/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ko_KR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/lt/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/lv/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ms/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/nb/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ne/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/nl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pt/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/pt_BR/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ro/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ru/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sk/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sl/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sq/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/sv/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/ta/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/tr/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/uk/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/vi/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/zh_CN/LC_MESSAGES/wxstd.mo +0 -0
- wx/locale/zh_TW/LC_MESSAGES/wxstd.mo +0 -0
- wx/media.py +30 -0
- wx/media.pyi +272 -0
- wx/msw.py +16 -0
- wx/msw.pyi +91 -0
- wx/propgrid.py +498 -0
- wx/propgrid.pyi +7427 -0
- wx/py/CHANGES.txt +796 -0
- wx/py/Py.ico +0 -0
- wx/py/PyAlaCarte.py +34 -0
- wx/py/PyAlaMode.py +34 -0
- wx/py/PyAlaModeTest.py +33 -0
- wx/py/PyCrust.ico +0 -0
- wx/py/PyCrust.py +78 -0
- wx/py/PyCrust_16.png +0 -0
- wx/py/PyCrust_32.png +0 -0
- wx/py/PyFilling.py +35 -0
- wx/py/PyShell.py +78 -0
- wx/py/PySlices.ico +0 -0
- wx/py/PySlices.py +98 -0
- wx/py/PySlicesShell.py +94 -0
- wx/py/PySlices_16.png +0 -0
- wx/py/PySlices_32.png +0 -0
- wx/py/PyWrap.py +52 -0
- wx/py/README.txt +77 -0
- wx/py/__init__.py +20 -0
- wx/py/buffer.py +136 -0
- wx/py/crust.py +403 -0
- wx/py/crustslices.py +403 -0
- wx/py/dispatcher.py +259 -0
- wx/py/document.py +37 -0
- wx/py/editor.py +844 -0
- wx/py/editwindow.py +316 -0
- wx/py/filling.py +358 -0
- wx/py/frame.py +976 -0
- wx/py/images.py +212 -0
- wx/py/interpreter.py +161 -0
- wx/py/introspect.py +402 -0
- wx/py/magic.py +98 -0
- wx/py/parse.py +134 -0
- wx/py/path.py +36 -0
- wx/py/pseudo.py +99 -0
- wx/py/shell.py +1579 -0
- wx/py/sliceshell.py +3805 -0
- wx/py/tests/test_interpreter.py +71 -0
- wx/py/tests/test_introspect.py +810 -0
- wx/py/tests/test_pseudo.py +70 -0
- wx/py/tests/test_version.py +36 -0
- wx/py/tests/testall.py +22 -0
- wx/py/version.py +7 -0
- wx/py.typed +0 -0
- wx/ribbon.py +48 -0
- wx/ribbon.pyi +3099 -0
- wx/richtext.py +141 -0
- wx/richtext.pyi +13581 -0
- wx/siplib.cp315-win_arm64.pyd +0 -0
- wx/siplib.pyi +19 -0
- wx/stc.py +59 -0
- wx/stc.pyi +9918 -0
- wx/svg/__init__.py +363 -0
- wx/svg/_nanosvg.cp315-win_arm64.pyd +0 -0
- wx/tools/__init__.py +18 -0
- wx/tools/dbg.py +268 -0
- wx/tools/genaxmodule.py +50 -0
- wx/tools/helpviewer.py +92 -0
- wx/tools/img2img.py +85 -0
- wx/tools/img2png.py +54 -0
- wx/tools/img2py.py +306 -0
- wx/tools/img2xpm.py +54 -0
- wx/tools/pywxrc.py +951 -0
- wx/tools/wxget.py +254 -0
- wx/tools/wxget_docs_demo.py +183 -0
- wx/wxbase334u_net_vc140_arm64.dll +0 -0
- wx/wxbase334u_vc140_arm64.dll +0 -0
- wx/wxbase334u_xml_vc140_arm64.dll +0 -0
- wx/wxmsw334u_adv_vc140_arm64.dll +0 -0
- wx/wxmsw334u_aui_vc140_arm64.dll +0 -0
- wx/wxmsw334u_core_vc140_arm64.dll +0 -0
- wx/wxmsw334u_gl_vc140_arm64.dll +0 -0
- wx/wxmsw334u_html_vc140_arm64.dll +0 -0
- wx/wxmsw334u_media_vc140_arm64.dll +0 -0
- wx/wxmsw334u_propgrid_vc140_arm64.dll +0 -0
- wx/wxmsw334u_qa_vc140_arm64.dll +0 -0
- wx/wxmsw334u_ribbon_vc140_arm64.dll +0 -0
- wx/wxmsw334u_richtext_vc140_arm64.dll +0 -0
- wx/wxmsw334u_stc_vc140_arm64.dll +0 -0
- wx/wxmsw334u_webview_vc140_arm64.dll +0 -0
- wx/wxmsw334u_xrc_vc140_arm64.dll +0 -0
- wx/xml.py +18 -0
- wx/xml.pyi +728 -0
- wx/xrc.py +68 -0
- wx/xrc.pyi +896 -0
- wxpython-4.3.2.dist-info/METADATA +71 -0
- wxpython-4.3.2.dist-info/RECORD +471 -0
- wxpython-4.3.2.dist-info/WHEEL +5 -0
- wxpython-4.3.2.dist-info/entry_points.txt +13 -0
- wxpython-4.3.2.dist-info/licenses/LICENSE.txt +610 -0
- wxpython-4.3.2.dist-info/top_level.txt +1 -0
wx/py/editwindow.py
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
"""EditWindow class."""
|
|
2
|
+
|
|
3
|
+
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
4
|
+
|
|
5
|
+
import wx
|
|
6
|
+
from wx import stc
|
|
7
|
+
|
|
8
|
+
import keyword
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
import time
|
|
12
|
+
|
|
13
|
+
from . import dispatcher
|
|
14
|
+
from .version import VERSION
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_faces():
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
is_dark = wx.SystemSettings.GetAppearance().IsDark()
|
|
21
|
+
except wx.PyNoAppError:
|
|
22
|
+
is_dark = False
|
|
23
|
+
|
|
24
|
+
if 'wxMSW' in wx.PlatformInfo:
|
|
25
|
+
# Safely evaluate IsDark() inside a try-except fallback block
|
|
26
|
+
return {
|
|
27
|
+
'times' : 'Times New Roman',
|
|
28
|
+
'mono' : 'Courier New',
|
|
29
|
+
'helv' : 'Arial',
|
|
30
|
+
'lucida' : 'Lucida Console',
|
|
31
|
+
'other' : 'Comic Sans MS',
|
|
32
|
+
'size' : 10,
|
|
33
|
+
'lnsize' : 8,
|
|
34
|
+
'backcol' : '#202020' if is_dark else '#FFFFFF',
|
|
35
|
+
'calltipbg' : '#2D2D2D' if is_dark else '#FFFFB8',
|
|
36
|
+
'calltipfg' : '#E0E0E0' if is_dark else '#404040',
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
elif 'wxGTK' in wx.PlatformInfo and ('gtk2' in wx.PlatformInfo or 'gtk3' in wx.PlatformInfo):
|
|
40
|
+
return {
|
|
41
|
+
'times' : 'Serif',
|
|
42
|
+
'mono' : 'Monospace',
|
|
43
|
+
'helv' : 'Sans',
|
|
44
|
+
'other' : 'new century schoolbook',
|
|
45
|
+
'size' : 10,
|
|
46
|
+
'lnsize' : 9,
|
|
47
|
+
'backcol' : '#202020' if is_dark else '#FFFFFF',
|
|
48
|
+
'calltipbg' : '#2D2D2D' if is_dark else '#FFFFB8',
|
|
49
|
+
'calltipfg' : '#E0E0E0' if is_dark else '#404040',
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
elif 'wxMac' in wx.PlatformInfo:
|
|
53
|
+
return {
|
|
54
|
+
'times' : 'Lucida Grande',
|
|
55
|
+
'mono' : 'Monaco',
|
|
56
|
+
'helv' : 'Geneva',
|
|
57
|
+
'other' : 'new century schoolbook',
|
|
58
|
+
'size' : 12,
|
|
59
|
+
'lnsize' : 10,
|
|
60
|
+
'backcol' : '#202020' if is_dark else '#FFFFFF',
|
|
61
|
+
'calltipbg' : '#2D2D2D' if is_dark else '#FFFFB8',
|
|
62
|
+
'calltipfg' : '#E0E0E0' if is_dark else '#404040',
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
else: # GTK1, etc.
|
|
66
|
+
return {
|
|
67
|
+
'times' : 'Times',
|
|
68
|
+
'mono' : 'Courier',
|
|
69
|
+
'helv' : 'Helvetica',
|
|
70
|
+
'other' : 'new century schoolbook',
|
|
71
|
+
'size' : 12,
|
|
72
|
+
'lnsize' : 10,
|
|
73
|
+
'backcol' : '#FFFFFF',
|
|
74
|
+
'calltipbg' : '#FFFFB8',
|
|
75
|
+
'calltipfg' : '#404040',
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class EditWindow(stc.StyledTextCtrl):
|
|
80
|
+
"""EditWindow based on StyledTextCtrl."""
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
|
|
84
|
+
size=wx.DefaultSize, style=wx.CLIP_CHILDREN | wx.SUNKEN_BORDER):
|
|
85
|
+
"""Create EditWindow instance."""
|
|
86
|
+
self.FACES = get_faces()
|
|
87
|
+
stc.StyledTextCtrl.__init__(self, parent, id, pos, size, style)
|
|
88
|
+
self.__config()
|
|
89
|
+
self.Bind(stc.EVT_STC_UPDATEUI, self.OnUpdateUI)
|
|
90
|
+
dispatcher.connect(receiver=self._fontsizer, signal='FontIncrease')
|
|
91
|
+
dispatcher.connect(receiver=self._fontsizer, signal='FontDecrease')
|
|
92
|
+
dispatcher.connect(receiver=self._fontsizer, signal='FontDefault')
|
|
93
|
+
|
|
94
|
+
def _fontsizer(self, signal):
|
|
95
|
+
"""Receiver for Font* signals."""
|
|
96
|
+
if not self:
|
|
97
|
+
dispatcher.disconnect(receiver=self._fontsizer, signal='FontIncrease')
|
|
98
|
+
dispatcher.disconnect(receiver=self._fontsizer, signal='FontDecrease')
|
|
99
|
+
dispatcher.disconnect(receiver=self._fontsizer, signal='FontDefault')
|
|
100
|
+
return
|
|
101
|
+
size = self.GetZoom()
|
|
102
|
+
if signal == 'FontIncrease':
|
|
103
|
+
size += 1
|
|
104
|
+
elif signal == 'FontDecrease':
|
|
105
|
+
size -= 1
|
|
106
|
+
elif signal == 'FontDefault':
|
|
107
|
+
size = 0
|
|
108
|
+
self.SetZoom(size)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def __config(self):
|
|
112
|
+
self.setDisplayLineNumbers(False)
|
|
113
|
+
|
|
114
|
+
self.SetLexer(stc.STC_LEX_PYTHON)
|
|
115
|
+
self.SetKeyWords(0, ' '.join(keyword.kwlist))
|
|
116
|
+
|
|
117
|
+
self.setStyles(self.FACES)
|
|
118
|
+
self.SetViewWhiteSpace(False)
|
|
119
|
+
self.SetTabWidth(4)
|
|
120
|
+
self.SetUseTabs(False)
|
|
121
|
+
# Do we want to automatically pop up command completion options?
|
|
122
|
+
self.autoComplete = True
|
|
123
|
+
self.autoCompleteIncludeMagic = True
|
|
124
|
+
self.autoCompleteIncludeSingle = True
|
|
125
|
+
self.autoCompleteIncludeDouble = True
|
|
126
|
+
self.autoCompleteCaseInsensitive = True
|
|
127
|
+
self.AutoCompSetIgnoreCase(self.autoCompleteCaseInsensitive)
|
|
128
|
+
self.autoCompleteAutoHide = False
|
|
129
|
+
self.AutoCompSetAutoHide(self.autoCompleteAutoHide)
|
|
130
|
+
self.AutoCompStops(' .,;:([)]}\'"\\<>%^&+-=*/|`')
|
|
131
|
+
# Do we want to automatically pop up command argument help?
|
|
132
|
+
self.autoCallTip = True
|
|
133
|
+
self.callTipInsert = True
|
|
134
|
+
self.CallTipSetBackground(self.FACES['calltipbg'])
|
|
135
|
+
self.CallTipSetForeground(self.FACES['calltipfg'])
|
|
136
|
+
self.SetWrapMode(False)
|
|
137
|
+
try:
|
|
138
|
+
self.SetEndAtLastLine(False)
|
|
139
|
+
except AttributeError:
|
|
140
|
+
pass
|
|
141
|
+
|
|
142
|
+
def setDisplayLineNumbers(self, state):
|
|
143
|
+
self.lineNumbers = state
|
|
144
|
+
if state:
|
|
145
|
+
self.SetMarginType(1, stc.STC_MARGIN_NUMBER)
|
|
146
|
+
self.SetMarginWidth(1, 40)
|
|
147
|
+
else:
|
|
148
|
+
# Leave a small margin so the feature hidden lines marker can be seen
|
|
149
|
+
self.SetMarginType(1, 0)
|
|
150
|
+
self.SetMarginWidth(1, 10)
|
|
151
|
+
|
|
152
|
+
def setStyles(self, faces):
|
|
153
|
+
"""Configure font size, typeface and color for lexer."""
|
|
154
|
+
|
|
155
|
+
# Default style
|
|
156
|
+
self.StyleSetSpec(stc.STC_STYLE_DEFAULT,
|
|
157
|
+
"face:%(mono)s,size:%(size)d,back:%(backcol)s" % \
|
|
158
|
+
faces)
|
|
159
|
+
|
|
160
|
+
self.StyleClearAll()
|
|
161
|
+
self.SetSelForeground(True, wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT))
|
|
162
|
+
self.SetSelBackground(True, wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT))
|
|
163
|
+
|
|
164
|
+
# Built in styles
|
|
165
|
+
self.StyleSetSpec(stc.STC_STYLE_LINENUMBER,
|
|
166
|
+
"back:#C0C0C0,face:%(mono)s,size:%(lnsize)d" % faces)
|
|
167
|
+
self.StyleSetSpec(stc.STC_STYLE_CONTROLCHAR,
|
|
168
|
+
"face:%(mono)s" % faces)
|
|
169
|
+
self.StyleSetSpec(stc.STC_STYLE_BRACELIGHT,
|
|
170
|
+
"fore:#0000FF,back:#FFFF88")
|
|
171
|
+
self.StyleSetSpec(stc.STC_STYLE_BRACEBAD,
|
|
172
|
+
"fore:#FF0000,back:#FFFF88")
|
|
173
|
+
|
|
174
|
+
# Python styles
|
|
175
|
+
self.StyleSetSpec(stc.STC_P_DEFAULT,
|
|
176
|
+
"face:%(mono)s" % faces)
|
|
177
|
+
self.StyleSetSpec(stc.STC_P_COMMENTLINE,
|
|
178
|
+
"fore:#007F00,face:%(mono)s" % faces)
|
|
179
|
+
self.StyleSetSpec(stc.STC_P_NUMBER,
|
|
180
|
+
"")
|
|
181
|
+
self.StyleSetSpec(stc.STC_P_STRING,
|
|
182
|
+
"fore:#7F007F,face:%(mono)s" % faces)
|
|
183
|
+
self.StyleSetSpec(stc.STC_P_CHARACTER,
|
|
184
|
+
"fore:#7F007F,face:%(mono)s" % faces)
|
|
185
|
+
self.StyleSetSpec(stc.STC_P_WORD,
|
|
186
|
+
"fore:#00007F,bold")
|
|
187
|
+
self.StyleSetSpec(stc.STC_P_TRIPLE,
|
|
188
|
+
"fore:#7F0000")
|
|
189
|
+
self.StyleSetSpec(stc.STC_P_TRIPLEDOUBLE,
|
|
190
|
+
"fore:#000033,back:#FFFFE8")
|
|
191
|
+
self.StyleSetSpec(stc.STC_P_CLASSNAME,
|
|
192
|
+
"fore:#0000FF,bold")
|
|
193
|
+
self.StyleSetSpec(stc.STC_P_DEFNAME,
|
|
194
|
+
"fore:#007F7F,bold")
|
|
195
|
+
self.StyleSetSpec(stc.STC_P_OPERATOR,
|
|
196
|
+
"")
|
|
197
|
+
self.StyleSetSpec(stc.STC_P_IDENTIFIER,
|
|
198
|
+
"")
|
|
199
|
+
self.StyleSetSpec(stc.STC_P_COMMENTBLOCK,
|
|
200
|
+
"fore:#7F7F7F")
|
|
201
|
+
self.StyleSetSpec(stc.STC_P_STRINGEOL,
|
|
202
|
+
"fore:#000000,face:%(mono)s,back:#E0C0E0,eol" % faces)
|
|
203
|
+
|
|
204
|
+
def OnUpdateUI(self, event):
|
|
205
|
+
"""Check for matching braces."""
|
|
206
|
+
# If the auto-complete window is up let it do its thing.
|
|
207
|
+
if self.AutoCompActive() or self.CallTipActive():
|
|
208
|
+
return
|
|
209
|
+
braceAtCaret = -1
|
|
210
|
+
braceOpposite = -1
|
|
211
|
+
charBefore = None
|
|
212
|
+
caretPos = self.GetCurrentPos()
|
|
213
|
+
if caretPos > 0:
|
|
214
|
+
charBefore = self.GetCharAt(caretPos - 1)
|
|
215
|
+
styleBefore = self.GetStyleAt(caretPos - 1)
|
|
216
|
+
|
|
217
|
+
# Check before.
|
|
218
|
+
if charBefore and chr(charBefore) in '[]{}()' \
|
|
219
|
+
and styleBefore == stc.STC_P_OPERATOR:
|
|
220
|
+
braceAtCaret = caretPos - 1
|
|
221
|
+
|
|
222
|
+
# Check after.
|
|
223
|
+
if braceAtCaret < 0:
|
|
224
|
+
charAfter = self.GetCharAt(caretPos)
|
|
225
|
+
styleAfter = self.GetStyleAt(caretPos)
|
|
226
|
+
if charAfter and chr(charAfter) in '[]{}()' \
|
|
227
|
+
and styleAfter == stc.STC_P_OPERATOR:
|
|
228
|
+
braceAtCaret = caretPos
|
|
229
|
+
|
|
230
|
+
if braceAtCaret >= 0:
|
|
231
|
+
braceOpposite = self.BraceMatch(braceAtCaret)
|
|
232
|
+
|
|
233
|
+
if braceAtCaret != -1 and braceOpposite == -1:
|
|
234
|
+
self.BraceBadLight(braceAtCaret)
|
|
235
|
+
else:
|
|
236
|
+
self.BraceHighlight(braceAtCaret, braceOpposite)
|
|
237
|
+
|
|
238
|
+
def CanCopy(self):
|
|
239
|
+
"""Return True if text is selected and can be copied."""
|
|
240
|
+
return self.GetSelectionStart() != self.GetSelectionEnd()
|
|
241
|
+
|
|
242
|
+
def CanCut(self):
|
|
243
|
+
"""Return True if text is selected and can be cut."""
|
|
244
|
+
return self.CanCopy() and self.CanEdit()
|
|
245
|
+
|
|
246
|
+
def CanEdit(self):
|
|
247
|
+
"""Return True if editing should succeed."""
|
|
248
|
+
return not self.GetReadOnly()
|
|
249
|
+
|
|
250
|
+
def CanPaste(self):
|
|
251
|
+
"""Return True if pasting should succeed."""
|
|
252
|
+
return stc.StyledTextCtrl.CanPaste(self) and self.CanEdit()
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def GetLastPosition(self):
|
|
256
|
+
return self.GetLength()
|
|
257
|
+
|
|
258
|
+
def GetRange(self, start, end):
|
|
259
|
+
return self.GetTextRange(start, end)
|
|
260
|
+
|
|
261
|
+
def GetSelection(self):
|
|
262
|
+
return self.GetAnchor(), self.GetCurrentPos()
|
|
263
|
+
|
|
264
|
+
def ShowPosition(self, pos):
|
|
265
|
+
line = self.LineFromPosition(pos)
|
|
266
|
+
self.EnsureVisible(line) # Expand the line if folded.
|
|
267
|
+
self.GotoLine(line)
|
|
268
|
+
|
|
269
|
+
def DoFindNext(self, findData, findDlg=None):
|
|
270
|
+
backward = not (findData.GetFlags() & wx.FR_DOWN)
|
|
271
|
+
matchcase = findData.GetFlags() & wx.FR_MATCHCASE
|
|
272
|
+
wholeword = findData.GetFlags() & wx.FR_WHOLEWORD
|
|
273
|
+
findstring = findData.GetFindString().encode()
|
|
274
|
+
self.SetSearchFlags(0
|
|
275
|
+
| (wx.stc.STC_FIND_MATCHCASE if matchcase else 0)
|
|
276
|
+
| (wx.stc.STC_FIND_WHOLEWORD if wholeword else 0)
|
|
277
|
+
)
|
|
278
|
+
if backward:
|
|
279
|
+
self.TargetStart = self.GetAnchor() # backward anchor
|
|
280
|
+
self.TargetEnd = 0
|
|
281
|
+
else:
|
|
282
|
+
self.TargetStart = self.GetCurrentPos() # forward anchor
|
|
283
|
+
self.TargetEnd = self.TextLength
|
|
284
|
+
loc = self.SearchInTarget(findstring)
|
|
285
|
+
|
|
286
|
+
# if it wasn't found then restart at beginning
|
|
287
|
+
if loc == -1:
|
|
288
|
+
self.TargetStart = self.TextLength if backward else 0
|
|
289
|
+
loc = self.SearchInTarget(findstring)
|
|
290
|
+
|
|
291
|
+
# was it still not found?
|
|
292
|
+
if loc == -1:
|
|
293
|
+
dlg = wx.MessageDialog(self, 'Unable to find the search text.',
|
|
294
|
+
'Not found!',
|
|
295
|
+
wx.OK | wx.ICON_INFORMATION)
|
|
296
|
+
dlg.ShowModal()
|
|
297
|
+
dlg.Destroy()
|
|
298
|
+
if findDlg:
|
|
299
|
+
if loc == -1:
|
|
300
|
+
wx.CallAfter(findDlg.SetFocus)
|
|
301
|
+
return
|
|
302
|
+
else:
|
|
303
|
+
findDlg.Close()
|
|
304
|
+
|
|
305
|
+
# show and select the found text
|
|
306
|
+
self.ShowPosition(loc)
|
|
307
|
+
self.SetSelection(loc, loc + len(findstring))
|
|
308
|
+
|
|
309
|
+
def SetSelection(self, from_, to_):
|
|
310
|
+
"""Selects the text starting at the first position up to
|
|
311
|
+
(but not including) the character at the last position.
|
|
312
|
+
"""
|
|
313
|
+
# (override) Patch for miss-insertion position when from_ > to_.
|
|
314
|
+
# Note: This is needed until the stc SetSelection bug is fixed.
|
|
315
|
+
self.SetAnchor(from_)
|
|
316
|
+
self.SetCurrentPos(to_)
|
wx/py/filling.py
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"""Filling is the gui tree control through which a user can navigate
|
|
2
|
+
the local namespace or any object."""
|
|
3
|
+
|
|
4
|
+
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
5
|
+
|
|
6
|
+
import wx
|
|
7
|
+
|
|
8
|
+
from . import dispatcher
|
|
9
|
+
from . import editwindow
|
|
10
|
+
from . import images
|
|
11
|
+
import inspect
|
|
12
|
+
from . import introspect
|
|
13
|
+
import types
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
COMMONTYPES = [getattr(types, t) for t in dir(types) \
|
|
17
|
+
if not t.startswith('_') \
|
|
18
|
+
and t not in ('ClassType', 'InstanceType', 'ModuleType')]
|
|
19
|
+
|
|
20
|
+
DOCTYPES = ('BuiltinFunctionType', 'BuiltinMethodType', 'ClassType',
|
|
21
|
+
'FunctionType', 'GeneratorType', 'InstanceType',
|
|
22
|
+
'LambdaType', 'MethodType', 'ModuleType',
|
|
23
|
+
'UnboundMethodType', 'method-wrapper')
|
|
24
|
+
|
|
25
|
+
SIMPLETYPES = [getattr(types, t) for t in dir(types) \
|
|
26
|
+
if not t.startswith('_') and t not in DOCTYPES]
|
|
27
|
+
|
|
28
|
+
#del t
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
COMMONTYPES.append(type(''.__repr__)) # Method-wrapper in version 2.2.x.
|
|
32
|
+
except AttributeError:
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class FillingTree(wx.TreeCtrl):
|
|
37
|
+
"""FillingTree based on TreeCtrl."""
|
|
38
|
+
|
|
39
|
+
name = 'Filling Tree'
|
|
40
|
+
|
|
41
|
+
def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
|
|
42
|
+
size=wx.DefaultSize, style=wx.TR_DEFAULT_STYLE,
|
|
43
|
+
rootObject=None, rootLabel=None, rootIsNamespace=False,
|
|
44
|
+
static=False):
|
|
45
|
+
"""Create FillingTree instance."""
|
|
46
|
+
wx.TreeCtrl.__init__(self, parent, id, pos, size, style)
|
|
47
|
+
self.rootIsNamespace = rootIsNamespace
|
|
48
|
+
import __main__
|
|
49
|
+
if rootObject is None:
|
|
50
|
+
rootObject = __main__.__dict__
|
|
51
|
+
self.rootIsNamespace = True
|
|
52
|
+
if rootObject is __main__.__dict__ and rootLabel is None:
|
|
53
|
+
rootLabel = 'locals()'
|
|
54
|
+
if not rootLabel:
|
|
55
|
+
rootLabel = 'Ingredients'
|
|
56
|
+
self.item = self.root = self.AddRoot(rootLabel, -1, -1, rootObject)
|
|
57
|
+
self.SetItemHasChildren(self.root, self.objHasChildren(rootObject))
|
|
58
|
+
self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.OnItemExpanding, id=self.GetId())
|
|
59
|
+
self.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed, id=self.GetId())
|
|
60
|
+
self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, id=self.GetId())
|
|
61
|
+
self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnItemActivated, id=self.GetId())
|
|
62
|
+
if not static:
|
|
63
|
+
dispatcher.connect(receiver=self.push, signal='Interpreter.push')
|
|
64
|
+
|
|
65
|
+
def push(self, command, more):
|
|
66
|
+
"""Receiver for Interpreter.push signal."""
|
|
67
|
+
if not self:
|
|
68
|
+
dispatcher.disconnect(receiver=self.push, signal='Interpreter.push')
|
|
69
|
+
return
|
|
70
|
+
self.display()
|
|
71
|
+
|
|
72
|
+
def OnItemExpanding(self, event):
|
|
73
|
+
"""Add children to the item."""
|
|
74
|
+
busy = wx.BusyCursor()
|
|
75
|
+
item = event.GetItem()
|
|
76
|
+
if self.IsExpanded(item):
|
|
77
|
+
return
|
|
78
|
+
self.addChildren(item)
|
|
79
|
+
# self.SelectItem(item)
|
|
80
|
+
|
|
81
|
+
def OnItemCollapsed(self, event):
|
|
82
|
+
"""Remove all children from the item."""
|
|
83
|
+
busy = wx.BusyCursor()
|
|
84
|
+
item = event.GetItem()
|
|
85
|
+
# self.CollapseAndReset(item)
|
|
86
|
+
# self.DeleteChildren(item)
|
|
87
|
+
# self.SelectItem(item)
|
|
88
|
+
|
|
89
|
+
def OnSelChanged(self, event):
|
|
90
|
+
"""Display information about the item."""
|
|
91
|
+
busy = wx.BusyCursor()
|
|
92
|
+
self.item = event.GetItem()
|
|
93
|
+
self.display()
|
|
94
|
+
|
|
95
|
+
def OnItemActivated(self, event):
|
|
96
|
+
"""Launch a DirFrame."""
|
|
97
|
+
item = event.GetItem()
|
|
98
|
+
text = self.getFullName(item)
|
|
99
|
+
obj = self.GetItemData(item)
|
|
100
|
+
frame = FillingFrame(parent=self, size=(600, 100), rootObject=obj,
|
|
101
|
+
rootLabel=text, rootIsNamespace=False)
|
|
102
|
+
frame.Show()
|
|
103
|
+
|
|
104
|
+
def objHasChildren(self, obj):
|
|
105
|
+
"""Return true if object has children."""
|
|
106
|
+
if self.objGetChildren(obj):
|
|
107
|
+
return True
|
|
108
|
+
else:
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
def objGetChildren(self, obj):
|
|
112
|
+
"""Return dictionary with attributes or contents of object."""
|
|
113
|
+
busy = wx.BusyCursor()
|
|
114
|
+
otype = type(obj)
|
|
115
|
+
if (isinstance(obj, dict)
|
|
116
|
+
or 'BTrees' in str(otype)
|
|
117
|
+
and hasattr(obj, 'keys')):
|
|
118
|
+
return obj
|
|
119
|
+
d = {}
|
|
120
|
+
if isinstance(obj, (list, tuple)):
|
|
121
|
+
for n in range(len(obj)):
|
|
122
|
+
key = '[' + str(n) + ']'
|
|
123
|
+
d[key] = obj[n]
|
|
124
|
+
if otype not in COMMONTYPES:
|
|
125
|
+
for key in introspect.getAttributeNames(obj):
|
|
126
|
+
if wx.Platform == '__WXMSW__':
|
|
127
|
+
if key == 'DropTarget': # Windows bug fix.
|
|
128
|
+
continue
|
|
129
|
+
# Believe it or not, some attributes can disappear,
|
|
130
|
+
# such as the exc_traceback attribute of the sys
|
|
131
|
+
# module. So this is nested in a try block.
|
|
132
|
+
try:
|
|
133
|
+
d[key] = getattr(obj, key)
|
|
134
|
+
except Exception:
|
|
135
|
+
pass
|
|
136
|
+
return d
|
|
137
|
+
|
|
138
|
+
def addChildren(self, item):
|
|
139
|
+
self.DeleteChildren(item)
|
|
140
|
+
obj = self.GetItemData(item)
|
|
141
|
+
children = self.objGetChildren(obj)
|
|
142
|
+
if not children:
|
|
143
|
+
return
|
|
144
|
+
keys = sorted(children, key=lambda x: str(x).lower())
|
|
145
|
+
for key in keys:
|
|
146
|
+
itemtext = str(key)
|
|
147
|
+
# Show string dictionary items with single quotes, except
|
|
148
|
+
# for the first level of items, if they represent a
|
|
149
|
+
# namespace.
|
|
150
|
+
if isinstance(obj, dict) \
|
|
151
|
+
and isinstance(key, str) \
|
|
152
|
+
and (item != self.root
|
|
153
|
+
or (item == self.root and not self.rootIsNamespace)):
|
|
154
|
+
itemtext = repr(key)
|
|
155
|
+
child = children[key]
|
|
156
|
+
branch = self.AppendItem(parent=item, text=itemtext, data=child)
|
|
157
|
+
self.SetItemHasChildren(branch, self.objHasChildren(child))
|
|
158
|
+
|
|
159
|
+
def display(self):
|
|
160
|
+
item = self.item
|
|
161
|
+
if not item:
|
|
162
|
+
return
|
|
163
|
+
if self.IsExpanded(item):
|
|
164
|
+
self.addChildren(item)
|
|
165
|
+
self.setText('')
|
|
166
|
+
obj = self.GetItemData(item)
|
|
167
|
+
if wx.Platform == '__WXMSW__':
|
|
168
|
+
if obj is None: # Windows bug fix.
|
|
169
|
+
return
|
|
170
|
+
self.SetItemHasChildren(item, self.objHasChildren(obj))
|
|
171
|
+
otype = type(obj)
|
|
172
|
+
text = ''
|
|
173
|
+
text += self.getFullName(item)
|
|
174
|
+
text += '\n\nType: ' + str(otype)
|
|
175
|
+
try:
|
|
176
|
+
value = str(obj)
|
|
177
|
+
except Exception:
|
|
178
|
+
value = ''
|
|
179
|
+
if isinstance(obj, str):
|
|
180
|
+
value = repr(obj)
|
|
181
|
+
text += u'\n\nValue: ' + value
|
|
182
|
+
if otype not in SIMPLETYPES:
|
|
183
|
+
try:
|
|
184
|
+
text += '\n\nDocstring:\n\n"""' + \
|
|
185
|
+
inspect.getdoc(obj).strip() + '"""'
|
|
186
|
+
except Exception:
|
|
187
|
+
pass
|
|
188
|
+
if isinstance(obj, type):
|
|
189
|
+
try:
|
|
190
|
+
text += '\n\nClass Definition:\n\n' + \
|
|
191
|
+
inspect.getsource(obj.__class__)
|
|
192
|
+
except Exception:
|
|
193
|
+
pass
|
|
194
|
+
else:
|
|
195
|
+
try:
|
|
196
|
+
text += '\n\nSource Code:\n\n' + \
|
|
197
|
+
inspect.getsource(obj)
|
|
198
|
+
except Exception:
|
|
199
|
+
pass
|
|
200
|
+
self.setText(text)
|
|
201
|
+
|
|
202
|
+
def getFullName(self, item, partial=''):
|
|
203
|
+
"""Return a syntactically proper name for item."""
|
|
204
|
+
name = self.GetItemText(item)
|
|
205
|
+
parent = None
|
|
206
|
+
obj = None
|
|
207
|
+
if item != self.root:
|
|
208
|
+
parent = self.GetItemParent(item)
|
|
209
|
+
obj = self.GetItemData(parent)
|
|
210
|
+
# Apply dictionary syntax to dictionary items, except the root
|
|
211
|
+
# and first level children of a namespace.
|
|
212
|
+
if ((isinstance(obj, dict)
|
|
213
|
+
or 'BTrees' in str(type(obj))
|
|
214
|
+
and hasattr(obj, 'keys'))
|
|
215
|
+
and ((item != self.root and parent != self.root)
|
|
216
|
+
or (parent == self.root and not self.rootIsNamespace))):
|
|
217
|
+
name = '[' + name + ']'
|
|
218
|
+
# Apply dot syntax to multipart names.
|
|
219
|
+
if partial:
|
|
220
|
+
if partial[0] == '[':
|
|
221
|
+
name += partial
|
|
222
|
+
else:
|
|
223
|
+
name += '.' + partial
|
|
224
|
+
# Repeat for everything but the root item
|
|
225
|
+
# and first level children of a namespace.
|
|
226
|
+
if (item != self.root and parent != self.root) \
|
|
227
|
+
or (parent == self.root and not self.rootIsNamespace):
|
|
228
|
+
name = self.getFullName(parent, partial=name)
|
|
229
|
+
return name
|
|
230
|
+
|
|
231
|
+
def setText(self, text):
|
|
232
|
+
"""Display information about the current selection."""
|
|
233
|
+
|
|
234
|
+
# This method will likely be replaced by the enclosing app to
|
|
235
|
+
# do something more interesting, like write to a text control.
|
|
236
|
+
print(text)
|
|
237
|
+
|
|
238
|
+
def setStatusText(self, text):
|
|
239
|
+
"""Display status information."""
|
|
240
|
+
|
|
241
|
+
# This method will likely be replaced by the enclosing app to
|
|
242
|
+
# do something more interesting, like write to a status bar.
|
|
243
|
+
print(text)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
class FillingText(editwindow.EditWindow):
|
|
247
|
+
"""FillingText based on StyledTextCtrl."""
|
|
248
|
+
|
|
249
|
+
name = 'Filling Text'
|
|
250
|
+
|
|
251
|
+
def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
|
|
252
|
+
size=wx.DefaultSize, style=wx.CLIP_CHILDREN,
|
|
253
|
+
static=False):
|
|
254
|
+
"""Create FillingText instance."""
|
|
255
|
+
editwindow.EditWindow.__init__(self, parent, id, pos, size, style)
|
|
256
|
+
# Configure various defaults and user preferences.
|
|
257
|
+
self.SetReadOnly(True)
|
|
258
|
+
self.SetWrapMode(True)
|
|
259
|
+
self.SetMarginWidth(1, 0)
|
|
260
|
+
if not static:
|
|
261
|
+
dispatcher.connect(receiver=self.push, signal='Interpreter.push')
|
|
262
|
+
|
|
263
|
+
def push(self, command, more):
|
|
264
|
+
"""Receiver for Interpreter.push signal."""
|
|
265
|
+
if not self:
|
|
266
|
+
dispatcher.disconnect(receiver=self.push, signal='Interpreter.push')
|
|
267
|
+
return
|
|
268
|
+
self.Refresh()
|
|
269
|
+
|
|
270
|
+
def SetText(self, *args, **kwds):
|
|
271
|
+
self.SetReadOnly(False)
|
|
272
|
+
editwindow.EditWindow.SetText(self, *args, **kwds)
|
|
273
|
+
self.SetReadOnly(True)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
class Filling(wx.SplitterWindow):
|
|
277
|
+
"""Filling based on wxSplitterWindow."""
|
|
278
|
+
|
|
279
|
+
name = 'Filling'
|
|
280
|
+
|
|
281
|
+
def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
|
|
282
|
+
size=wx.DefaultSize, style=wx.SP_3D|wx.SP_LIVE_UPDATE,
|
|
283
|
+
name='Filling Window', rootObject=None,
|
|
284
|
+
rootLabel=None, rootIsNamespace=False, static=False):
|
|
285
|
+
"""Create a Filling instance."""
|
|
286
|
+
wx.SplitterWindow.__init__(self, parent, id, pos, size, style, name)
|
|
287
|
+
|
|
288
|
+
self.tree = FillingTree(parent=self, rootObject=rootObject,
|
|
289
|
+
rootLabel=rootLabel,
|
|
290
|
+
rootIsNamespace=rootIsNamespace,
|
|
291
|
+
static=static)
|
|
292
|
+
self.text = FillingText(parent=self, static=static)
|
|
293
|
+
|
|
294
|
+
wx.CallLater(25, self.SplitVertically, self.tree, self.text, 200)
|
|
295
|
+
|
|
296
|
+
self.SetMinimumPaneSize(1)
|
|
297
|
+
|
|
298
|
+
# Override the filling so that descriptions go to FillingText.
|
|
299
|
+
self.tree.setText = self.text.SetText
|
|
300
|
+
|
|
301
|
+
# Display the root item.
|
|
302
|
+
self.tree.SelectItem(self.tree.root)
|
|
303
|
+
self.tree.display()
|
|
304
|
+
|
|
305
|
+
self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED, self.OnChanged)
|
|
306
|
+
|
|
307
|
+
def OnChanged(self, event):
|
|
308
|
+
#this is important: do not evaluate this event=> otherwise,
|
|
309
|
+
# splitterwindow behaves strangely
|
|
310
|
+
#event.Skip()
|
|
311
|
+
pass
|
|
312
|
+
|
|
313
|
+
def LoadSettings(self, config):
|
|
314
|
+
pos = config.ReadInt('Sash/FillingPos', 200)
|
|
315
|
+
if not self.IsSplit():
|
|
316
|
+
self.SplitVertically(self.tree, self.text)
|
|
317
|
+
wx.CallLater(250, self.SetSashPosition, pos)
|
|
318
|
+
zoom = config.ReadInt('View/Zoom/Filling', -99)
|
|
319
|
+
if zoom != -99:
|
|
320
|
+
self.text.SetZoom(zoom)
|
|
321
|
+
|
|
322
|
+
def SaveSettings(self, config):
|
|
323
|
+
config.WriteInt('Sash/FillingPos', self.GetSashPosition())
|
|
324
|
+
config.WriteInt('View/Zoom/Filling', self.text.GetZoom())
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
class FillingFrame(wx.Frame):
|
|
329
|
+
"""Frame containing the namespace tree component."""
|
|
330
|
+
|
|
331
|
+
name = 'Filling Frame'
|
|
332
|
+
|
|
333
|
+
def __init__(self, parent=None, id=-1, title='PyFilling',
|
|
334
|
+
pos=wx.DefaultPosition, size=(600, 400),
|
|
335
|
+
style=wx.DEFAULT_FRAME_STYLE, rootObject=None,
|
|
336
|
+
rootLabel=None, rootIsNamespace=False, static=False):
|
|
337
|
+
"""Create FillingFrame instance."""
|
|
338
|
+
wx.Frame.__init__(self, parent, id, title, pos, size, style)
|
|
339
|
+
intro = 'PyFilling - The Tastiest Namespace Inspector'
|
|
340
|
+
self.CreateStatusBar()
|
|
341
|
+
self.SetStatusText(intro)
|
|
342
|
+
self.SetIcon(images.getPyIcon())
|
|
343
|
+
self.filling = Filling(parent=self, rootObject=rootObject,
|
|
344
|
+
rootLabel=rootLabel,
|
|
345
|
+
rootIsNamespace=rootIsNamespace,
|
|
346
|
+
static=static)
|
|
347
|
+
# Override so that status messages go to the status bar.
|
|
348
|
+
self.filling.tree.setStatusText = self.SetStatusText
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
class App(wx.App):
|
|
352
|
+
"""PyFilling standalone application."""
|
|
353
|
+
|
|
354
|
+
def OnInit(self):
|
|
355
|
+
self.fillingFrame = FillingFrame()
|
|
356
|
+
self.fillingFrame.Show(True)
|
|
357
|
+
self.SetTopWindow(self.fillingFrame)
|
|
358
|
+
return True
|