wxPython 4.3.2__cp315-cp315-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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_amd64.pyd +0 -0
- wx/_aui.cp315-win_amd64.pyd +0 -0
- wx/_core.cp315-win_amd64.pyd +0 -0
- wx/_dataview.cp315-win_amd64.pyd +0 -0
- wx/_glcanvas.cp315-win_amd64.pyd +0 -0
- wx/_grid.cp315-win_amd64.pyd +0 -0
- wx/_html.cp315-win_amd64.pyd +0 -0
- wx/_html2.cp315-win_amd64.pyd +0 -0
- wx/_media.cp315-win_amd64.pyd +0 -0
- wx/_msw.cp315-win_amd64.pyd +0 -0
- wx/_propgrid.cp315-win_amd64.pyd +0 -0
- wx/_ribbon.cp315-win_amd64.pyd +0 -0
- wx/_richtext.cp315-win_amd64.pyd +0 -0
- wx/_stc.cp315-win_amd64.pyd +0 -0
- wx/_xml.cp315-win_amd64.pyd +0 -0
- wx/_xrc.cp315-win_amd64.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/libcairo-2.dll +0 -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_amd64.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_amd64.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_x64.dll +0 -0
- wx/wxbase334u_vc140_x64.dll +0 -0
- wx/wxbase334u_xml_vc140_x64.dll +0 -0
- wx/wxmsw334u_adv_vc140_x64.dll +0 -0
- wx/wxmsw334u_aui_vc140_x64.dll +0 -0
- wx/wxmsw334u_core_vc140_x64.dll +0 -0
- wx/wxmsw334u_gl_vc140_x64.dll +0 -0
- wx/wxmsw334u_html_vc140_x64.dll +0 -0
- wx/wxmsw334u_media_vc140_x64.dll +0 -0
- wx/wxmsw334u_propgrid_vc140_x64.dll +0 -0
- wx/wxmsw334u_qa_vc140_x64.dll +0 -0
- wx/wxmsw334u_ribbon_vc140_x64.dll +0 -0
- wx/wxmsw334u_richtext_vc140_x64.dll +0 -0
- wx/wxmsw334u_stc_vc140_x64.dll +0 -0
- wx/wxmsw334u_webview_vc140_x64.dll +0 -0
- wx/wxmsw334u_xrc_vc140_x64.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 +472 -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/buffer.py
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""Buffer class."""
|
|
2
|
+
|
|
3
|
+
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
4
|
+
|
|
5
|
+
from .interpreter import Interpreter
|
|
6
|
+
import types
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
|
|
10
|
+
from . import document
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Buffer:
|
|
14
|
+
"""Buffer class."""
|
|
15
|
+
|
|
16
|
+
id = 0
|
|
17
|
+
|
|
18
|
+
def __init__(self, filename=None):
|
|
19
|
+
"""Create a Buffer instance."""
|
|
20
|
+
Buffer.id += 1
|
|
21
|
+
self.id = Buffer.id
|
|
22
|
+
self.interp = Interpreter(locals={})
|
|
23
|
+
self.name = ''
|
|
24
|
+
self.editors = {}
|
|
25
|
+
self.editor = None
|
|
26
|
+
self.modules = list(sys.modules)
|
|
27
|
+
self.syspath = sys.path[:]
|
|
28
|
+
while True:
|
|
29
|
+
try:
|
|
30
|
+
self.syspath.remove('')
|
|
31
|
+
except ValueError:
|
|
32
|
+
break
|
|
33
|
+
while True:
|
|
34
|
+
try:
|
|
35
|
+
self.syspath.remove('.')
|
|
36
|
+
except ValueError:
|
|
37
|
+
break
|
|
38
|
+
self.open(filename)
|
|
39
|
+
|
|
40
|
+
def addEditor(self, editor):
|
|
41
|
+
"""Add an editor."""
|
|
42
|
+
self.editor = editor
|
|
43
|
+
self.editors[editor.id] = editor
|
|
44
|
+
|
|
45
|
+
def hasChanged(self):
|
|
46
|
+
"""Return True if text in editor has changed since last save."""
|
|
47
|
+
if self.editor:
|
|
48
|
+
return self.editor.hasChanged()
|
|
49
|
+
else:
|
|
50
|
+
return False
|
|
51
|
+
|
|
52
|
+
def new(self, filepath):
|
|
53
|
+
"""New empty buffer."""
|
|
54
|
+
if not filepath:
|
|
55
|
+
return
|
|
56
|
+
if os.path.exists(filepath):
|
|
57
|
+
self.confirmed = self.overwriteConfirm(filepath)
|
|
58
|
+
else:
|
|
59
|
+
self.confirmed = True
|
|
60
|
+
|
|
61
|
+
def open(self, filename):
|
|
62
|
+
"""Open file into buffer."""
|
|
63
|
+
self.doc = document.Document(filename)
|
|
64
|
+
self.name = self.doc.filename or ('Untitled:' + str(self.id))
|
|
65
|
+
self.modulename = self.doc.filebase
|
|
66
|
+
# XXX This should really make sure filedir is first item in syspath.
|
|
67
|
+
# XXX Or maybe this should be moved to the update namespace method.
|
|
68
|
+
if self.doc.filedir and self.doc.filedir not in self.syspath:
|
|
69
|
+
# To create the proper context for updateNamespace.
|
|
70
|
+
self.syspath.insert(0, self.doc.filedir)
|
|
71
|
+
if self.doc.filepath and os.path.exists(self.doc.filepath):
|
|
72
|
+
self.confirmed = True
|
|
73
|
+
if self.editor:
|
|
74
|
+
text = self.doc.read()
|
|
75
|
+
self.editor._setBuffer(buffer=self, text=text)
|
|
76
|
+
|
|
77
|
+
def overwriteConfirm(self, filepath):
|
|
78
|
+
"""Confirm overwriting an existing file."""
|
|
79
|
+
return False
|
|
80
|
+
|
|
81
|
+
def save(self):
|
|
82
|
+
"""Save buffer."""
|
|
83
|
+
filepath = self.doc.filepath
|
|
84
|
+
if not filepath:
|
|
85
|
+
return # XXX Get filename
|
|
86
|
+
if not os.path.exists(filepath):
|
|
87
|
+
self.confirmed = True
|
|
88
|
+
if not self.confirmed:
|
|
89
|
+
self.confirmed = self.overwriteConfirm(filepath)
|
|
90
|
+
if self.confirmed:
|
|
91
|
+
self.doc.write(self.editor.getText())
|
|
92
|
+
if self.editor:
|
|
93
|
+
self.editor.setSavePoint()
|
|
94
|
+
|
|
95
|
+
def saveAs(self, filename):
|
|
96
|
+
"""Save buffer."""
|
|
97
|
+
self.doc = document.Document(filename)
|
|
98
|
+
self.name = self.doc.filename
|
|
99
|
+
self.modulename = self.doc.filebase
|
|
100
|
+
self.save()
|
|
101
|
+
|
|
102
|
+
def updateNamespace(self):
|
|
103
|
+
"""Update the namespace for autocompletion and calltips.
|
|
104
|
+
|
|
105
|
+
Return True if updated, False if there was an error."""
|
|
106
|
+
if not self.interp or not hasattr(self.editor, 'getText'):
|
|
107
|
+
return False
|
|
108
|
+
syspath = sys.path
|
|
109
|
+
sys.path = self.syspath
|
|
110
|
+
text = self.editor.getText()
|
|
111
|
+
text = text.replace('\r\n', '\n')
|
|
112
|
+
text = text.replace('\r', '\n')
|
|
113
|
+
name = self.modulename or self.name
|
|
114
|
+
module = types.ModuleType(name)
|
|
115
|
+
newspace = module.__dict__.copy()
|
|
116
|
+
try:
|
|
117
|
+
try:
|
|
118
|
+
code = compile(text, name, 'exec')
|
|
119
|
+
except:
|
|
120
|
+
raise
|
|
121
|
+
# return False
|
|
122
|
+
try:
|
|
123
|
+
exec(code, newspace)
|
|
124
|
+
except:
|
|
125
|
+
raise
|
|
126
|
+
# return False
|
|
127
|
+
else:
|
|
128
|
+
# No problems, so update the namespace.
|
|
129
|
+
self.interp.locals.clear()
|
|
130
|
+
self.interp.locals.update(newspace)
|
|
131
|
+
return True
|
|
132
|
+
finally:
|
|
133
|
+
sys.path = syspath
|
|
134
|
+
for m in sys.modules:
|
|
135
|
+
if m not in self.modules:
|
|
136
|
+
del sys.modules[m]
|
wx/py/crust.py
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
"""Crust combines the shell and filling into one control."""
|
|
2
|
+
|
|
3
|
+
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
4
|
+
|
|
5
|
+
import wx
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import pprint
|
|
9
|
+
import re
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
from . import dispatcher
|
|
13
|
+
from . import editwindow
|
|
14
|
+
from .filling import Filling
|
|
15
|
+
from . import frame
|
|
16
|
+
from .shell import Shell
|
|
17
|
+
from .version import VERSION
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Crust(wx.SplitterWindow):
|
|
21
|
+
"""Crust based on SplitterWindow."""
|
|
22
|
+
|
|
23
|
+
name = 'Crust'
|
|
24
|
+
sashoffset = 300
|
|
25
|
+
|
|
26
|
+
def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
|
|
27
|
+
size=wx.DefaultSize, style=wx.SP_3D|wx.SP_LIVE_UPDATE,
|
|
28
|
+
name='Crust Window', rootObject=None, rootLabel=None,
|
|
29
|
+
rootIsNamespace=True, intro='', locals=None,
|
|
30
|
+
InterpClass=None,
|
|
31
|
+
startupScript=None, execStartupScript=True,
|
|
32
|
+
*args, **kwds):
|
|
33
|
+
"""Create Crust instance."""
|
|
34
|
+
wx.SplitterWindow.__init__(self, parent, id, pos, size, style, name)
|
|
35
|
+
|
|
36
|
+
# Turn off the tab-traversal style that is automatically
|
|
37
|
+
# turned on by wx.SplitterWindow. We do this because on
|
|
38
|
+
# Windows the event for Ctrl-Enter is stolen and used as a
|
|
39
|
+
# navigation key, but the Shell window uses it to insert lines.
|
|
40
|
+
style = self.GetWindowStyle()
|
|
41
|
+
self.SetWindowStyle(style & ~wx.TAB_TRAVERSAL)
|
|
42
|
+
|
|
43
|
+
self.shell = Shell(parent=self, introText=intro,
|
|
44
|
+
locals=locals, InterpClass=InterpClass,
|
|
45
|
+
startupScript=startupScript,
|
|
46
|
+
execStartupScript=execStartupScript,
|
|
47
|
+
*args, **kwds)
|
|
48
|
+
|
|
49
|
+
self.editor = self.shell
|
|
50
|
+
if rootObject is None:
|
|
51
|
+
rootObject = self.shell.interp.locals
|
|
52
|
+
self.notebook = wx.Notebook(parent=self, id=-1)
|
|
53
|
+
self.shell.interp.locals['notebook'] = self.notebook
|
|
54
|
+
self.filling = Filling(parent=self.notebook,
|
|
55
|
+
rootObject=rootObject,
|
|
56
|
+
rootLabel=rootLabel,
|
|
57
|
+
rootIsNamespace=rootIsNamespace)
|
|
58
|
+
# Add 'filling' to the interpreter's locals.
|
|
59
|
+
self.shell.interp.locals['filling'] = self.filling
|
|
60
|
+
self.notebook.AddPage(page=self.filling, text='Namespace', select=True)
|
|
61
|
+
|
|
62
|
+
self.display = Display(parent=self.notebook)
|
|
63
|
+
self.notebook.AddPage(page=self.display, text='Display')
|
|
64
|
+
# Add 'pp' (pretty print) to the interpreter's locals.
|
|
65
|
+
self.shell.interp.locals['pp'] = self.display.setItem
|
|
66
|
+
self.display.nbTab = self.notebook.GetPageCount()-1
|
|
67
|
+
|
|
68
|
+
self.calltip = Calltip(parent=self.notebook)
|
|
69
|
+
self.notebook.AddPage(page=self.calltip, text='Calltip')
|
|
70
|
+
|
|
71
|
+
self.sessionlisting = SessionListing(parent=self.notebook)
|
|
72
|
+
self.notebook.AddPage(page=self.sessionlisting, text='History')
|
|
73
|
+
|
|
74
|
+
self.dispatcherlisting = DispatcherListing(parent=self.notebook)
|
|
75
|
+
self.notebook.AddPage(page=self.dispatcherlisting, text='Dispatcher')
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# Initialize in an unsplit mode, and check later after loading
|
|
79
|
+
# settings if we should split or not.
|
|
80
|
+
self.shell.Hide()
|
|
81
|
+
self.notebook.Hide()
|
|
82
|
+
self.Initialize(self.shell)
|
|
83
|
+
self._shouldsplit = True
|
|
84
|
+
wx.CallAfter(self._CheckShouldSplit)
|
|
85
|
+
self.SetMinimumPaneSize(100)
|
|
86
|
+
|
|
87
|
+
self.Bind(wx.EVT_SIZE, self.SplitterOnSize)
|
|
88
|
+
self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED, self.OnChanged)
|
|
89
|
+
self.Bind(wx.EVT_SPLITTER_DCLICK, self.OnSashDClick)
|
|
90
|
+
|
|
91
|
+
def _CheckShouldSplit(self):
|
|
92
|
+
if self._shouldsplit:
|
|
93
|
+
self.SplitHorizontally(self.shell, self.notebook, -self.sashoffset)
|
|
94
|
+
self.lastsashpos = self.GetSashPosition()
|
|
95
|
+
else:
|
|
96
|
+
self.lastsashpos = -1
|
|
97
|
+
self.issplit = self.IsSplit()
|
|
98
|
+
|
|
99
|
+
def ToggleTools(self):
|
|
100
|
+
"""Toggle the display of the filling and other tools"""
|
|
101
|
+
if self.issplit:
|
|
102
|
+
self.Unsplit()
|
|
103
|
+
else:
|
|
104
|
+
self.SplitHorizontally(self.shell, self.notebook, -self.sashoffset)
|
|
105
|
+
self.lastsashpos = self.GetSashPosition()
|
|
106
|
+
self.issplit = self.IsSplit()
|
|
107
|
+
|
|
108
|
+
def ToolsShown(self):
|
|
109
|
+
return self.issplit
|
|
110
|
+
|
|
111
|
+
def OnChanged(self, event):
|
|
112
|
+
"""update sash offset from the bottom of the window"""
|
|
113
|
+
self.sashoffset = self.GetSize().height - event.GetSashPosition()
|
|
114
|
+
self.lastsashpos = event.GetSashPosition()
|
|
115
|
+
event.Skip()
|
|
116
|
+
|
|
117
|
+
def OnSashDClick(self, event):
|
|
118
|
+
self.Unsplit()
|
|
119
|
+
self.issplit = False
|
|
120
|
+
|
|
121
|
+
# Make the splitter expand the top window when resized
|
|
122
|
+
def SplitterOnSize(self, event):
|
|
123
|
+
splitter = event.GetEventObject()
|
|
124
|
+
sz = splitter.GetSize()
|
|
125
|
+
splitter.SetSashPosition(sz.height - self.sashoffset, True)
|
|
126
|
+
event.Skip()
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def LoadSettings(self, config):
|
|
130
|
+
self.shell.LoadSettings(config)
|
|
131
|
+
self.filling.LoadSettings(config)
|
|
132
|
+
|
|
133
|
+
pos = config.ReadInt('Sash/CrustPos', 400)
|
|
134
|
+
wx.CallAfter(self.SetSashPosition, pos)
|
|
135
|
+
def _updateSashPosValue():
|
|
136
|
+
sz = self.GetSize()
|
|
137
|
+
self.sashoffset = sz.height - self.GetSashPosition()
|
|
138
|
+
wx.CallAfter(_updateSashPosValue)
|
|
139
|
+
zoom = config.ReadInt('View/Zoom/Display', -99)
|
|
140
|
+
if zoom != -99:
|
|
141
|
+
self.display.SetZoom(zoom)
|
|
142
|
+
self.issplit = config.ReadInt('Sash/IsSplit', True)
|
|
143
|
+
if not self.issplit:
|
|
144
|
+
self._shouldsplit = False
|
|
145
|
+
|
|
146
|
+
def SaveSettings(self, config):
|
|
147
|
+
self.shell.SaveSettings(config)
|
|
148
|
+
self.filling.SaveSettings(config)
|
|
149
|
+
|
|
150
|
+
if self.lastsashpos != -1:
|
|
151
|
+
config.WriteInt('Sash/CrustPos', self.lastsashpos)
|
|
152
|
+
config.WriteInt('Sash/IsSplit', self.issplit)
|
|
153
|
+
config.WriteInt('View/Zoom/Display', self.display.GetZoom())
|
|
154
|
+
|
|
155
|
+
class Display(editwindow.EditWindow):
|
|
156
|
+
"""STC used to display an object using Pretty Print."""
|
|
157
|
+
|
|
158
|
+
def __init__(self, parent, id=-1, pos=wx.DefaultPosition,
|
|
159
|
+
size=wx.DefaultSize,
|
|
160
|
+
style=wx.CLIP_CHILDREN | wx.SUNKEN_BORDER,
|
|
161
|
+
static=False):
|
|
162
|
+
"""Create Display instance."""
|
|
163
|
+
editwindow.EditWindow.__init__(self, parent, id, pos, size, style)
|
|
164
|
+
# Configure various defaults and user preferences.
|
|
165
|
+
self.SetReadOnly(True)
|
|
166
|
+
self.SetWrapMode(False)
|
|
167
|
+
if not static:
|
|
168
|
+
dispatcher.connect(receiver=self.push, signal='Interpreter.push')
|
|
169
|
+
|
|
170
|
+
def push(self, command, more):
|
|
171
|
+
"""Receiver for Interpreter.push signal."""
|
|
172
|
+
if not self:
|
|
173
|
+
dispatcher.disconnect(receiver=self.push, signal='Interpreter.push')
|
|
174
|
+
return
|
|
175
|
+
self.Refresh()
|
|
176
|
+
|
|
177
|
+
def Refresh(self):
|
|
178
|
+
if not hasattr(self, "item"):
|
|
179
|
+
return
|
|
180
|
+
self.SetReadOnly(False)
|
|
181
|
+
text = pprint.pformat(self.item)
|
|
182
|
+
self.SetText(text)
|
|
183
|
+
self.SetReadOnly(True)
|
|
184
|
+
|
|
185
|
+
def setItem(self, item):
|
|
186
|
+
"""Set item to pretty print in the notebook Display tab."""
|
|
187
|
+
self.item = item
|
|
188
|
+
self.Refresh()
|
|
189
|
+
if self.GetParent().GetSelection() != self.nbTab:
|
|
190
|
+
focus = wx.Window.FindFocus()
|
|
191
|
+
self.GetParent().SetSelection(self.nbTab)
|
|
192
|
+
wx.CallAfter(focus.SetFocus)
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
# TODO: Switch this to a editwindow.EditWindow
|
|
196
|
+
class Calltip(wx.TextCtrl):
|
|
197
|
+
"""Text control containing the most recent shell calltip."""
|
|
198
|
+
|
|
199
|
+
def __init__(self, parent=None, id=-1,ShellClassName='Shell'):
|
|
200
|
+
style = (wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RICH2)
|
|
201
|
+
wx.TextCtrl.__init__(self, parent, id, style=style)
|
|
202
|
+
self.SetBackgroundColour(wx.Colour(255, 255, 208))
|
|
203
|
+
self.ShellClassName=ShellClassName
|
|
204
|
+
dispatcher.connect(receiver=self.display, signal=self.ShellClassName+'.calltip')
|
|
205
|
+
|
|
206
|
+
df = self.GetFont()
|
|
207
|
+
font = wx.Font(df.GetPointSize(), wx.FONTFAMILY_TELETYPE, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
|
|
208
|
+
self.SetFont(font)
|
|
209
|
+
|
|
210
|
+
def display(self, calltip):
|
|
211
|
+
"""Receiver for this.calltip signal."""
|
|
212
|
+
if not self:
|
|
213
|
+
dispatcher.disconnect(receiver=self.display, signal=self.ShellClassName+'.calltip')
|
|
214
|
+
return
|
|
215
|
+
|
|
216
|
+
## self.SetValue(calltip) # Caused refresh problem on Windows.
|
|
217
|
+
self.Clear()
|
|
218
|
+
self.AppendText(calltip)
|
|
219
|
+
self.SetInsertionPoint(0)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
# TODO: Switch this to a editwindow.EditWindow
|
|
223
|
+
class SessionListing(wx.TextCtrl):
|
|
224
|
+
"""Text control containing all commands for session."""
|
|
225
|
+
|
|
226
|
+
def __init__(self, parent=None, id=-1,ShellClassName='Shell'):
|
|
227
|
+
style = (wx.TE_MULTILINE | wx.TE_READONLY |
|
|
228
|
+
wx.TE_RICH2 | wx.TE_DONTWRAP)
|
|
229
|
+
wx.TextCtrl.__init__(self, parent, id, style=style)
|
|
230
|
+
self.ShellClassName = ShellClassName
|
|
231
|
+
dispatcher.connect(receiver=self.addHistory,
|
|
232
|
+
signal=self.ShellClassName+".addHistory")
|
|
233
|
+
dispatcher.connect(receiver=self.clearHistory,
|
|
234
|
+
signal=self.ShellClassName+".clearHistory")
|
|
235
|
+
dispatcher.connect(receiver=self.loadHistory,
|
|
236
|
+
signal=self.ShellClassName+".loadHistory")
|
|
237
|
+
|
|
238
|
+
df = self.GetFont()
|
|
239
|
+
font = wx.Font(df.GetPointSize(), wx.FONTFAMILY_TELETYPE, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
|
|
240
|
+
self.SetFont(font)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def _disconnect(self):
|
|
244
|
+
dispatcher.disconnect(receiver=self.addHistory,
|
|
245
|
+
signal=self.ShellClassName+".addHistory")
|
|
246
|
+
dispatcher.disconnect(receiver=self.clearHistory,
|
|
247
|
+
signal=self.ShellClassName+".clearHistory")
|
|
248
|
+
dispatcher.disconnect(receiver=self.loadHistory,
|
|
249
|
+
signal=self.ShellClassName+".loadHistory")
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def loadHistory(self, history):
|
|
253
|
+
# preload the existing history, if any
|
|
254
|
+
if not self:
|
|
255
|
+
self._disconnect()
|
|
256
|
+
return
|
|
257
|
+
hist = history[:]
|
|
258
|
+
hist.reverse()
|
|
259
|
+
self.SetValue('\n'.join(hist) + '\n')
|
|
260
|
+
self.SetInsertionPointEnd()
|
|
261
|
+
|
|
262
|
+
def addHistory(self, command):
|
|
263
|
+
if not self:
|
|
264
|
+
self._disconnect()
|
|
265
|
+
return
|
|
266
|
+
if command:
|
|
267
|
+
self.SetInsertionPointEnd()
|
|
268
|
+
self.AppendText(command + '\n')
|
|
269
|
+
|
|
270
|
+
def clearHistory(self):
|
|
271
|
+
if not self:
|
|
272
|
+
self._disconnect()
|
|
273
|
+
return
|
|
274
|
+
self.SetValue("")
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class DispatcherListing(wx.TextCtrl):
|
|
278
|
+
"""Text control containing all dispatches for session."""
|
|
279
|
+
|
|
280
|
+
def __init__(self, parent=None, id=-1):
|
|
281
|
+
style = (wx.TE_MULTILINE | wx.TE_READONLY |
|
|
282
|
+
wx.TE_RICH2 | wx.TE_DONTWRAP)
|
|
283
|
+
wx.TextCtrl.__init__(self, parent, id, style=style)
|
|
284
|
+
dispatcher.connect(receiver=self.spy)
|
|
285
|
+
|
|
286
|
+
df = self.GetFont()
|
|
287
|
+
font = wx.Font(df.GetPointSize(), wx.FONTFAMILY_TELETYPE, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
|
|
288
|
+
self.SetFont(font)
|
|
289
|
+
|
|
290
|
+
def spy(self, signal, sender):
|
|
291
|
+
"""Receiver for Any signal from Any sender."""
|
|
292
|
+
if not self:
|
|
293
|
+
dispatcher.disconnect(receiver=self.spy)
|
|
294
|
+
return
|
|
295
|
+
text = '%r from %s' % (signal, sender)
|
|
296
|
+
self.SetInsertionPointEnd()
|
|
297
|
+
start, end = self.GetSelection()
|
|
298
|
+
if start != end:
|
|
299
|
+
self.SetSelection(0, 0)
|
|
300
|
+
self.AppendText(text + '\n')
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
class CrustFrame(frame.Frame, frame.ShellFrameMixin):
|
|
305
|
+
"""Frame containing all the PyCrust components."""
|
|
306
|
+
|
|
307
|
+
name = 'CrustFrame'
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
def __init__(self, parent=None, id=-1, title='PyCrust',
|
|
311
|
+
pos=wx.DefaultPosition, size=wx.DefaultSize,
|
|
312
|
+
style=wx.DEFAULT_FRAME_STYLE,
|
|
313
|
+
rootObject=None, rootLabel=None, rootIsNamespace=True,
|
|
314
|
+
locals=None, InterpClass=None,
|
|
315
|
+
config=None, dataDir=None,
|
|
316
|
+
*args, **kwds):
|
|
317
|
+
"""Create CrustFrame instance."""
|
|
318
|
+
frame.Frame.__init__(self, parent, id, title, pos, size, style,
|
|
319
|
+
shellName='PyCrust')
|
|
320
|
+
frame.ShellFrameMixin.__init__(self, config, dataDir)
|
|
321
|
+
|
|
322
|
+
if size == wx.DefaultSize:
|
|
323
|
+
self.SetSize((800, 600))
|
|
324
|
+
|
|
325
|
+
intro = 'PyCrust %s - The Flakiest Python Shell' % VERSION
|
|
326
|
+
|
|
327
|
+
self.SetStatusText(intro.replace('\n', ', '))
|
|
328
|
+
self.crust = Crust(parent=self, intro=intro,
|
|
329
|
+
rootObject=rootObject,
|
|
330
|
+
rootLabel=rootLabel,
|
|
331
|
+
rootIsNamespace=rootIsNamespace,
|
|
332
|
+
locals=locals,
|
|
333
|
+
InterpClass=InterpClass,
|
|
334
|
+
startupScript=self.startupScript,
|
|
335
|
+
execStartupScript=self.execStartupScript,
|
|
336
|
+
*args, **kwds)
|
|
337
|
+
self.shell = self.crust.shell
|
|
338
|
+
|
|
339
|
+
# Override the filling so that status messages go to the status bar.
|
|
340
|
+
self.crust.filling.tree.setStatusText = self.SetStatusText
|
|
341
|
+
|
|
342
|
+
# Override the shell so that status messages go to the status bar.
|
|
343
|
+
self.shell.setStatusText = self.SetStatusText
|
|
344
|
+
|
|
345
|
+
self.shell.SetFocus()
|
|
346
|
+
self.LoadSettings()
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def OnClose(self, event):
|
|
350
|
+
"""Event handler for closing."""
|
|
351
|
+
self.SaveSettings()
|
|
352
|
+
self.crust.shell.destroy()
|
|
353
|
+
self.Destroy()
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
def OnAbout(self, event):
|
|
357
|
+
"""Display an About window."""
|
|
358
|
+
title = 'About PyCrust'
|
|
359
|
+
text = 'PyCrust %s\n\n' % VERSION + \
|
|
360
|
+
'Yet another Python shell, only flakier.\n\n' + \
|
|
361
|
+
'Half-baked by Patrick K. O\'Brien,\n' + \
|
|
362
|
+
'the other half is still in the oven.\n\n' + \
|
|
363
|
+
'Platform: %s\n' % sys.platform + \
|
|
364
|
+
'Python Version: %s\n' % sys.version.split()[0] + \
|
|
365
|
+
'wxPython Version: %s\n' % wx.VERSION_STRING + \
|
|
366
|
+
('\t(%s)\n' % ", ".join(wx.PlatformInfo[1:]))
|
|
367
|
+
dialog = wx.MessageDialog(self, text, title,
|
|
368
|
+
wx.OK | wx.ICON_INFORMATION)
|
|
369
|
+
dialog.ShowModal()
|
|
370
|
+
dialog.Destroy()
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def ToggleTools(self):
|
|
374
|
+
"""Toggle the display of the filling and other tools"""
|
|
375
|
+
return self.crust.ToggleTools()
|
|
376
|
+
|
|
377
|
+
def ToolsShown(self):
|
|
378
|
+
return self.crust.ToolsShown()
|
|
379
|
+
|
|
380
|
+
def OnHelp(self, event):
|
|
381
|
+
"""Show a help dialog."""
|
|
382
|
+
frame.ShellFrameMixin.OnHelp(self, event)
|
|
383
|
+
|
|
384
|
+
def LoadSettings(self):
|
|
385
|
+
if self.config is not None:
|
|
386
|
+
frame.ShellFrameMixin.LoadSettings(self)
|
|
387
|
+
frame.Frame.LoadSettings(self, self.config)
|
|
388
|
+
self.crust.LoadSettings(self.config)
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def SaveSettings(self, force=False):
|
|
392
|
+
if self.config is not None:
|
|
393
|
+
frame.ShellFrameMixin.SaveSettings(self,force)
|
|
394
|
+
if self.autoSaveSettings or force:
|
|
395
|
+
frame.Frame.SaveSettings(self, self.config)
|
|
396
|
+
self.crust.SaveSettings(self.config)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def DoSaveSettings(self):
|
|
400
|
+
if self.config is not None:
|
|
401
|
+
self.SaveSettings(force=True)
|
|
402
|
+
self.config.Flush()
|
|
403
|
+
|