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/lib/ogl/oglmisc.py
ADDED
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#----------------------------------------------------------------------------
|
|
3
|
+
# Name: oglmisc.py
|
|
4
|
+
# Purpose: Miscellaneous OGL support functions
|
|
5
|
+
#
|
|
6
|
+
# Author: Pierre Hjälm (from C++ original by Julian Smart)
|
|
7
|
+
#
|
|
8
|
+
# Created: 2004-05-08
|
|
9
|
+
# Copyright: (c) 2004 Pierre Hjälm - 1998 Julian Smart
|
|
10
|
+
# Licence: wxWindows license
|
|
11
|
+
# Tags: phoenix-port, unittest, py3-port, documented
|
|
12
|
+
#----------------------------------------------------------------------------
|
|
13
|
+
"""
|
|
14
|
+
Miscellaneous support functions for OGL.
|
|
15
|
+
|
|
16
|
+
params marked with '???' need review!
|
|
17
|
+
"""
|
|
18
|
+
import math
|
|
19
|
+
|
|
20
|
+
import wx
|
|
21
|
+
|
|
22
|
+
# Control point types
|
|
23
|
+
# Rectangle and most other shapes
|
|
24
|
+
CONTROL_POINT_VERTICAL = 1
|
|
25
|
+
CONTROL_POINT_HORIZONTAL = 2
|
|
26
|
+
CONTROL_POINT_DIAGONAL = 3
|
|
27
|
+
|
|
28
|
+
# Line
|
|
29
|
+
CONTROL_POINT_ENDPOINT_TO = 4
|
|
30
|
+
CONTROL_POINT_ENDPOINT_FROM = 5
|
|
31
|
+
CONTROL_POINT_LINE = 6
|
|
32
|
+
|
|
33
|
+
# Types of formatting: can be combined in a bit list
|
|
34
|
+
FORMAT_NONE = 0 # Left justification
|
|
35
|
+
FORMAT_CENTRE_HORIZ = 1 # Centre horizontally
|
|
36
|
+
FORMAT_CENTRE_VERT = 2 # Centre vertically
|
|
37
|
+
FORMAT_SIZE_TO_CONTENTS = 4 # Resize shape to contents
|
|
38
|
+
|
|
39
|
+
# Attachment modes
|
|
40
|
+
ATTACHMENT_MODE_NONE, ATTACHMENT_MODE_EDGE, ATTACHMENT_MODE_BRANCHING = 0, 1, 2
|
|
41
|
+
|
|
42
|
+
# Shadow mode
|
|
43
|
+
SHADOW_NONE, SHADOW_LEFT, SHADOW_RIGHT = 0, 1, 2
|
|
44
|
+
|
|
45
|
+
OP_CLICK_LEFT, OP_CLICK_RIGHT, OP_DRAG_LEFT, OP_DRAG_RIGHT = 1, 2, 4, 8
|
|
46
|
+
OP_ALL = OP_CLICK_LEFT | OP_CLICK_RIGHT | OP_DRAG_LEFT | OP_DRAG_RIGHT
|
|
47
|
+
|
|
48
|
+
# Sub-modes for branching attachment mode
|
|
49
|
+
BRANCHING_ATTACHMENT_NORMAL = 1
|
|
50
|
+
BRANCHING_ATTACHMENT_BLOB = 2
|
|
51
|
+
|
|
52
|
+
# logical function to use when drawing rubberband boxes, etc.
|
|
53
|
+
OGLRBLF = wx.INVERT
|
|
54
|
+
|
|
55
|
+
CONTROL_POINT_SIZE = 6
|
|
56
|
+
|
|
57
|
+
# Types of arrowhead
|
|
58
|
+
# (i) Built-in
|
|
59
|
+
ARROW_HOLLOW_CIRCLE = 1
|
|
60
|
+
ARROW_FILLED_CIRCLE = 2
|
|
61
|
+
ARROW_ARROW = 3
|
|
62
|
+
ARROW_SINGLE_OBLIQUE = 4
|
|
63
|
+
ARROW_DOUBLE_OBLIQUE = 5
|
|
64
|
+
# (ii) Custom
|
|
65
|
+
ARROW_METAFILE = 20
|
|
66
|
+
|
|
67
|
+
# Position of arrow on line
|
|
68
|
+
ARROW_POSITION_START = 0
|
|
69
|
+
ARROW_POSITION_END = 1
|
|
70
|
+
ARROW_POSITION_MIDDLE = 2
|
|
71
|
+
|
|
72
|
+
# Line alignment flags
|
|
73
|
+
# Vertical by default
|
|
74
|
+
LINE_ALIGNMENT_HORIZ = 1
|
|
75
|
+
LINE_ALIGNMENT_VERT = 0
|
|
76
|
+
LINE_ALIGNMENT_TO_NEXT_HANDLE = 2
|
|
77
|
+
LINE_ALIGNMENT_NONE = 0
|
|
78
|
+
|
|
79
|
+
# was defined in canvas and in composit
|
|
80
|
+
KEY_SHIFT = 1
|
|
81
|
+
KEY_CTRL = 2
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def FormatText(dc, text, width, height, formatMode):
|
|
86
|
+
"""
|
|
87
|
+
Format a text
|
|
88
|
+
|
|
89
|
+
:param `dc`: the :class:`wx.MemoryDC`
|
|
90
|
+
:param `text`: the text to format
|
|
91
|
+
:param `width`: the width of the box???
|
|
92
|
+
:param `height`: the height of the box??? it is not used in the code!
|
|
93
|
+
:param `formatMode`: one of the format modes, can be combined in a bit list
|
|
94
|
+
|
|
95
|
+
======================================== ==================================
|
|
96
|
+
Format mode name Description
|
|
97
|
+
======================================== ==================================
|
|
98
|
+
`FORMAT_NONE` Left justification
|
|
99
|
+
`FORMAT_CENTRE_HORIZ` Centre horizontally
|
|
100
|
+
`FORMAT_CENTRE_VERT` Centre vertically
|
|
101
|
+
`FORMAT_SIZE_TO_CONTENTS` Resize shape to contents
|
|
102
|
+
======================================== ==================================
|
|
103
|
+
|
|
104
|
+
:returns: a list of strings fitting in the box
|
|
105
|
+
|
|
106
|
+
"""
|
|
107
|
+
i = 0
|
|
108
|
+
word = ""
|
|
109
|
+
word_list = []
|
|
110
|
+
end_word = False
|
|
111
|
+
new_line = False
|
|
112
|
+
while i < len(text):
|
|
113
|
+
if text[i] == "%":
|
|
114
|
+
i += 1
|
|
115
|
+
if i == len(text):
|
|
116
|
+
word += "%"
|
|
117
|
+
else:
|
|
118
|
+
if text[i] == "n":
|
|
119
|
+
new_line = True
|
|
120
|
+
end_word = True
|
|
121
|
+
i += 1
|
|
122
|
+
else:
|
|
123
|
+
word += "%" + text[i]
|
|
124
|
+
i += 1
|
|
125
|
+
elif text[i] in ["\012","\015"]:
|
|
126
|
+
new_line = True
|
|
127
|
+
end_word = True
|
|
128
|
+
i += 1
|
|
129
|
+
elif text[i] == " ":
|
|
130
|
+
end_word = True
|
|
131
|
+
i += 1
|
|
132
|
+
else:
|
|
133
|
+
word += text[i]
|
|
134
|
+
i += 1
|
|
135
|
+
|
|
136
|
+
if i == len(text):
|
|
137
|
+
end_word = True
|
|
138
|
+
|
|
139
|
+
if end_word:
|
|
140
|
+
word_list.append(word)
|
|
141
|
+
word = ""
|
|
142
|
+
end_word = False
|
|
143
|
+
if new_line:
|
|
144
|
+
word_list.append(None)
|
|
145
|
+
new_line = False
|
|
146
|
+
|
|
147
|
+
# Now, make a list of strings which can fit in the box
|
|
148
|
+
string_list = []
|
|
149
|
+
buffer = ""
|
|
150
|
+
for s in word_list:
|
|
151
|
+
oldBuffer = buffer
|
|
152
|
+
if s is None:
|
|
153
|
+
# FORCE NEW LINE
|
|
154
|
+
if len(buffer) > 0:
|
|
155
|
+
string_list.append(buffer)
|
|
156
|
+
buffer = ""
|
|
157
|
+
else:
|
|
158
|
+
if len(buffer):
|
|
159
|
+
buffer += " "
|
|
160
|
+
buffer += s
|
|
161
|
+
x, y = dc.GetTextExtent(buffer)
|
|
162
|
+
|
|
163
|
+
# Don't fit within the bounding box if we're fitting
|
|
164
|
+
# shape to contents
|
|
165
|
+
if (x > width) and not (formatMode & FORMAT_SIZE_TO_CONTENTS):
|
|
166
|
+
# Deal with first word being wider than box
|
|
167
|
+
if len(oldBuffer):
|
|
168
|
+
string_list.append(oldBuffer)
|
|
169
|
+
buffer = s
|
|
170
|
+
if len(buffer):
|
|
171
|
+
string_list.append(buffer)
|
|
172
|
+
|
|
173
|
+
return string_list
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def GetCentredTextExtent(dc, text_list, xpos=0, ypos=0, width=0, height=0):
|
|
177
|
+
"""
|
|
178
|
+
Get the centred text extend
|
|
179
|
+
|
|
180
|
+
:param `dc`: the :class:`wx.MemoryDC`
|
|
181
|
+
:param `text_list`: a list of text lines
|
|
182
|
+
:param `xpos`: unused
|
|
183
|
+
:param `ypos`: unused
|
|
184
|
+
:param `width`: unused
|
|
185
|
+
:param `height`: unused
|
|
186
|
+
|
|
187
|
+
:returns: maximum width and the height
|
|
188
|
+
|
|
189
|
+
"""
|
|
190
|
+
if not text_list:
|
|
191
|
+
return 0, 0
|
|
192
|
+
|
|
193
|
+
max_width = 0
|
|
194
|
+
for line in text_list:
|
|
195
|
+
current_width, char_height = dc.GetTextExtent(line.GetText())
|
|
196
|
+
if current_width > max_width:
|
|
197
|
+
max_width = current_width
|
|
198
|
+
|
|
199
|
+
return max_width, len(text_list) * char_height
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def CentreText(dc, text_list, xpos, ypos, width, height, formatMode):
|
|
203
|
+
"""
|
|
204
|
+
Centre a text
|
|
205
|
+
|
|
206
|
+
:param `dc`: the :class:`wx.MemoryDC`
|
|
207
|
+
:param `text_list`: a list of texts
|
|
208
|
+
:param `xpos`: the x position
|
|
209
|
+
:param `ypos`: the y position
|
|
210
|
+
:param `width`: the width of the box???
|
|
211
|
+
:param `height`: the height of the box???
|
|
212
|
+
:param `formatMode`: one of the format modes, can be combined in a bit list
|
|
213
|
+
|
|
214
|
+
======================================== ==================================
|
|
215
|
+
Format mode name Description
|
|
216
|
+
======================================== ==================================
|
|
217
|
+
`FORMAT_NONE` Left justification
|
|
218
|
+
`FORMAT_CENTRE_HORIZ` Centre horizontally
|
|
219
|
+
`FORMAT_CENTRE_VERT` Centre vertically
|
|
220
|
+
`FORMAT_SIZE_TO_CONTENTS` Resize shape to contents
|
|
221
|
+
======================================== ==================================
|
|
222
|
+
|
|
223
|
+
"""
|
|
224
|
+
if not text_list:
|
|
225
|
+
return
|
|
226
|
+
|
|
227
|
+
# First, get maximum dimensions of box enclosing text
|
|
228
|
+
char_height = 0
|
|
229
|
+
max_width = 0
|
|
230
|
+
current_width = 0
|
|
231
|
+
|
|
232
|
+
# Store text extents for speed
|
|
233
|
+
widths = []
|
|
234
|
+
for line in text_list:
|
|
235
|
+
current_width, char_height = dc.GetTextExtent(line.GetText())
|
|
236
|
+
widths.append(current_width)
|
|
237
|
+
if current_width > max_width:
|
|
238
|
+
max_width = current_width
|
|
239
|
+
|
|
240
|
+
max_height = len(text_list) * char_height
|
|
241
|
+
|
|
242
|
+
if formatMode & FORMAT_CENTRE_VERT:
|
|
243
|
+
if max_height < height:
|
|
244
|
+
yoffset = ypos - height / 2.0 + (height - max_height) / 2.0
|
|
245
|
+
else:
|
|
246
|
+
yoffset = ypos - height / 2.0
|
|
247
|
+
yOffset = ypos
|
|
248
|
+
else:
|
|
249
|
+
yoffset = 0.0
|
|
250
|
+
yOffset = 0.0
|
|
251
|
+
|
|
252
|
+
if formatMode & FORMAT_CENTRE_HORIZ:
|
|
253
|
+
xoffset = xpos - width / 2.0
|
|
254
|
+
xOffset = xpos
|
|
255
|
+
else:
|
|
256
|
+
xoffset = 0.0
|
|
257
|
+
xOffset = 0.0
|
|
258
|
+
|
|
259
|
+
for i, line in enumerate(text_list):
|
|
260
|
+
if formatMode & FORMAT_CENTRE_HORIZ and widths[i] < width:
|
|
261
|
+
x = (width - widths[i]) / 2.0 + xoffset
|
|
262
|
+
else:
|
|
263
|
+
x = xoffset
|
|
264
|
+
y = i * char_height + yoffset
|
|
265
|
+
|
|
266
|
+
line.SetX(x - xOffset)
|
|
267
|
+
line.SetY(y - yOffset)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def DrawFormattedText(dc, text_list, xpos, ypos, width, height, formatMode):
|
|
271
|
+
"""
|
|
272
|
+
Draw formatted text
|
|
273
|
+
|
|
274
|
+
:param `dc`: the :class:`wx.MemoryDC`
|
|
275
|
+
:param `text_list`: a list of texts
|
|
276
|
+
:param `xpos`: the x position
|
|
277
|
+
:param `ypos`: the y position
|
|
278
|
+
:param `width`: the width of the box???
|
|
279
|
+
:param `height`: the height of the box???
|
|
280
|
+
:param `formatMode`: one of the format modes, can be combined in a bit list
|
|
281
|
+
|
|
282
|
+
======================================== ==================================
|
|
283
|
+
Format mode name Description
|
|
284
|
+
======================================== ==================================
|
|
285
|
+
`FORMAT_NONE` Left justification
|
|
286
|
+
`FORMAT_CENTRE_HORIZ` Centre horizontally
|
|
287
|
+
`FORMAT_CENTRE_VERT` Centre vertically
|
|
288
|
+
`FORMAT_SIZE_TO_CONTENTS` Resize shape to contents
|
|
289
|
+
======================================== ==================================
|
|
290
|
+
|
|
291
|
+
"""
|
|
292
|
+
if formatMode & FORMAT_CENTRE_HORIZ:
|
|
293
|
+
xoffset = xpos
|
|
294
|
+
else:
|
|
295
|
+
xoffset = xpos - width / 2.0
|
|
296
|
+
|
|
297
|
+
if formatMode & FORMAT_CENTRE_VERT:
|
|
298
|
+
yoffset = ypos
|
|
299
|
+
else:
|
|
300
|
+
yoffset = ypos - height / 2.0
|
|
301
|
+
|
|
302
|
+
# +1 to allow for rounding errors
|
|
303
|
+
dc.SetClippingRegion(int(xpos - width / 2.0), int(ypos - height / 2.0), int(width + 1), int(height + 1))
|
|
304
|
+
|
|
305
|
+
for line in text_list:
|
|
306
|
+
dc.DrawText(line.GetText(), int(xoffset + line.GetX()), int(yoffset + line.GetY()))
|
|
307
|
+
|
|
308
|
+
dc.DestroyClippingRegion()
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def RoughlyEqual(val1, val2, tol=0.00001):
|
|
312
|
+
"""
|
|
313
|
+
Check if values are roughly equal
|
|
314
|
+
|
|
315
|
+
:param `val1`: the first value to check
|
|
316
|
+
:param `val2`: the second value to check
|
|
317
|
+
:param `tol`: the tolerance, defaults to 0.00001
|
|
318
|
+
|
|
319
|
+
:returns: True or False
|
|
320
|
+
|
|
321
|
+
"""
|
|
322
|
+
return val1 < (val2 + tol) and val1 > (val2 - tol) and \
|
|
323
|
+
val2 < (val1 + tol) and val2 > (val1 - tol)
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
def FindEndForBox(width, height, x1, y1, x2, y2):
|
|
327
|
+
"""
|
|
328
|
+
Find the end for a box
|
|
329
|
+
|
|
330
|
+
:param `width`: the width of the box
|
|
331
|
+
:param `height`: the height of the box
|
|
332
|
+
:param `x1`: x1 position
|
|
333
|
+
:param `y1`: y1 position
|
|
334
|
+
:param `x2`: x2 position
|
|
335
|
+
:param `y2`: y2 position
|
|
336
|
+
|
|
337
|
+
:returns: the end position
|
|
338
|
+
|
|
339
|
+
"""
|
|
340
|
+
xvec = [x1 - width / 2.0, x1 - width / 2.0, x1 + width / 2.0, x1 + width / 2.0, x1 - width / 2.0]
|
|
341
|
+
yvec = [y1 - height / 2.0, y1 + height / 2.0, y1 + height / 2.0, y1 - height / 2.0, y1 - height / 2.0]
|
|
342
|
+
|
|
343
|
+
return FindEndForPolyline(xvec, yvec, x2, y2, x1, y1)
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
def CheckLineIntersection(x1, y1, x2, y2, x3, y3, x4, y4):
|
|
347
|
+
"""
|
|
348
|
+
Check for line intersection
|
|
349
|
+
|
|
350
|
+
:param `x1`: x1 position
|
|
351
|
+
:param `y1`: y1 position
|
|
352
|
+
:param `x2`: x2 position
|
|
353
|
+
:param `y2`: y2 position
|
|
354
|
+
:param `x3`: x3 position
|
|
355
|
+
:param `y3`: y3 position
|
|
356
|
+
:param `x4`: x4 position
|
|
357
|
+
:param `y4`: y4 position
|
|
358
|
+
|
|
359
|
+
:returns: a length ratio and a k line???
|
|
360
|
+
|
|
361
|
+
"""
|
|
362
|
+
denominator_term = (y4 - y3) * (x2 - x1) - (y2 - y1) * (x4 - x3)
|
|
363
|
+
numerator_term = (x3 - x1) * (y4 - y3) + (x4 - x3) * (y1 - y3)
|
|
364
|
+
|
|
365
|
+
length_ratio = 1.0
|
|
366
|
+
k_line = 1.0
|
|
367
|
+
|
|
368
|
+
# Check for parallel lines
|
|
369
|
+
if denominator_term < 0.005 and denominator_term > -0.005:
|
|
370
|
+
line_constant = -1.0
|
|
371
|
+
else:
|
|
372
|
+
line_constant = float(numerator_term) / denominator_term
|
|
373
|
+
|
|
374
|
+
# Check for intersection
|
|
375
|
+
if line_constant < 1.0 and line_constant > 0.0:
|
|
376
|
+
# Now must check that other line hits
|
|
377
|
+
if (y4 - y3) < 0.005 and (y4 - y3) > -0.005:
|
|
378
|
+
k_line = (x1 - x3 + line_constant * (x2 - x1)) / (x4 - x3)
|
|
379
|
+
else:
|
|
380
|
+
k_line = (y1 - y3 + line_constant * (y2 - y1)) / (y4 - y3)
|
|
381
|
+
if k_line >= 0 and k_line < 1:
|
|
382
|
+
length_ratio = line_constant
|
|
383
|
+
else:
|
|
384
|
+
k_line = 1
|
|
385
|
+
|
|
386
|
+
return length_ratio, k_line
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def FindEndForPolyline(xvec, yvec, x1, y1, x2, y2):
|
|
390
|
+
"""
|
|
391
|
+
Find the end for a polyline
|
|
392
|
+
|
|
393
|
+
:param `xvec`: x vector ???
|
|
394
|
+
:param `yvec`: y vector ???
|
|
395
|
+
:param `x1`: x1 position
|
|
396
|
+
:param `y1`: y1 position
|
|
397
|
+
:param `x2`: x2 position
|
|
398
|
+
:param `y2`: y2 position
|
|
399
|
+
|
|
400
|
+
:returns: the end position
|
|
401
|
+
|
|
402
|
+
"""
|
|
403
|
+
lastx = xvec[0]
|
|
404
|
+
lasty = yvec[0]
|
|
405
|
+
|
|
406
|
+
min_ratio = 1.0
|
|
407
|
+
|
|
408
|
+
for i in range(1, len(xvec)):
|
|
409
|
+
line_ratio, other_ratio = CheckLineIntersection(x1, y1, x2, y2, lastx, lasty, xvec[i], yvec[i])
|
|
410
|
+
lastx = xvec[i]
|
|
411
|
+
lasty = yvec[i]
|
|
412
|
+
|
|
413
|
+
if line_ratio < min_ratio:
|
|
414
|
+
min_ratio = line_ratio
|
|
415
|
+
|
|
416
|
+
# Do last (implicit) line if last and first doubles are not identical
|
|
417
|
+
if not (xvec[0] == lastx and yvec[0] == lasty):
|
|
418
|
+
line_ratio, other_ratio = CheckLineIntersection(x1, y1, x2, y2, lastx, lasty, xvec[0], yvec[0])
|
|
419
|
+
if line_ratio < min_ratio:
|
|
420
|
+
min_ratio = line_ratio
|
|
421
|
+
|
|
422
|
+
return x1 + (x2 - x1) * min_ratio, y1 + (y2 - y1) * min_ratio
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def PolylineHitTest(xvec, yvec, x1, y1, x2, y2):
|
|
426
|
+
"""
|
|
427
|
+
Hittest for a polyline
|
|
428
|
+
|
|
429
|
+
:param `xvec`: x vector ???
|
|
430
|
+
:param `yvec`: y vector ???
|
|
431
|
+
:param `x1`: x1 position
|
|
432
|
+
:param `y1`: y1 position
|
|
433
|
+
:param `x2`: x2 position
|
|
434
|
+
:param `y2`: y2 position
|
|
435
|
+
|
|
436
|
+
:returns: True or False
|
|
437
|
+
|
|
438
|
+
"""
|
|
439
|
+
isAHit = False
|
|
440
|
+
lastx = xvec[0]
|
|
441
|
+
lasty = yvec[0]
|
|
442
|
+
|
|
443
|
+
min_ratio = 1.0
|
|
444
|
+
|
|
445
|
+
for i in range(1, len(xvec)):
|
|
446
|
+
line_ratio, other_ratio = CheckLineIntersection(x1, y1, x2, y2, lastx, lasty, xvec[i], yvec[i])
|
|
447
|
+
if line_ratio != 1.0:
|
|
448
|
+
isAHit = True
|
|
449
|
+
lastx = xvec[i]
|
|
450
|
+
lasty = yvec[i]
|
|
451
|
+
|
|
452
|
+
if line_ratio < min_ratio:
|
|
453
|
+
min_ratio = line_ratio
|
|
454
|
+
|
|
455
|
+
# Do last (implicit) line if last and first doubles are not identical
|
|
456
|
+
if not (xvec[0] == lastx and yvec[0] == lasty):
|
|
457
|
+
line_ratio, other_ratio = CheckLineIntersection(x1, y1, x2, y2, lastx, lasty, xvec[0], yvec[0])
|
|
458
|
+
if line_ratio != 1.0:
|
|
459
|
+
isAHit = True
|
|
460
|
+
|
|
461
|
+
return isAHit
|
|
462
|
+
|
|
463
|
+
|
|
464
|
+
def GraphicsStraightenLine(point1, point2):
|
|
465
|
+
"""
|
|
466
|
+
Straighten a line in graphics
|
|
467
|
+
|
|
468
|
+
:param `point1`: a point list???
|
|
469
|
+
:param `point2`: a point list???
|
|
470
|
+
|
|
471
|
+
"""
|
|
472
|
+
dx = point2[0] - point1[0]
|
|
473
|
+
dy = point2[1] - point1[1]
|
|
474
|
+
|
|
475
|
+
if dx == 0:
|
|
476
|
+
return
|
|
477
|
+
elif abs(float(dy) / dx) > 1:
|
|
478
|
+
point2[0] = point1[0]
|
|
479
|
+
else:
|
|
480
|
+
point2[1] = point1[1]
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
def GetPointOnLine(x1, y1, x2, y2, length):
|
|
484
|
+
"""
|
|
485
|
+
Get point on a line
|
|
486
|
+
|
|
487
|
+
:param `x1`: x1 position
|
|
488
|
+
:param `y1`: y1 position
|
|
489
|
+
:param `x2`: x2 position
|
|
490
|
+
:param `y2`: y2 position
|
|
491
|
+
:param `length`: length ???
|
|
492
|
+
|
|
493
|
+
:returns: point on line
|
|
494
|
+
|
|
495
|
+
"""
|
|
496
|
+
l = math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))
|
|
497
|
+
if l < 0.01:
|
|
498
|
+
l = 0.01
|
|
499
|
+
|
|
500
|
+
i_bar = (x2 - x1) / l
|
|
501
|
+
j_bar = (y2 - y1) / l
|
|
502
|
+
|
|
503
|
+
return -length * i_bar + x2, -length * j_bar + y2
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
def GetArrowPoints(x1, y1, x2, y2, length, width):
|
|
507
|
+
"""
|
|
508
|
+
Get point on arrow
|
|
509
|
+
|
|
510
|
+
:param `x1`: x1 position
|
|
511
|
+
:param `y1`: y1 position
|
|
512
|
+
:param `x2`: x2 position
|
|
513
|
+
:param `y2`: y2 position
|
|
514
|
+
:param `length`: length ???
|
|
515
|
+
:param `width`: width ???
|
|
516
|
+
|
|
517
|
+
:returns: point on line
|
|
518
|
+
|
|
519
|
+
"""
|
|
520
|
+
l = math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))
|
|
521
|
+
|
|
522
|
+
if l < 0.01:
|
|
523
|
+
l = 0.01
|
|
524
|
+
|
|
525
|
+
i_bar = (x2 - x1) / l
|
|
526
|
+
j_bar = (y2 - y1) / l
|
|
527
|
+
|
|
528
|
+
x3 = -length * i_bar + x2
|
|
529
|
+
y3 = -length * j_bar + y2
|
|
530
|
+
|
|
531
|
+
return int(x2), int(y2), int(width * -j_bar + x3), int(width * i_bar + y3), int(-width * -j_bar + x3), int(-width * i_bar + y3)
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
def DrawArcToEllipse(x1, y1, width1, height1, x2, y2, x3, y3):
|
|
535
|
+
"""
|
|
536
|
+
Draw arc to ellipse
|
|
537
|
+
|
|
538
|
+
:param `x1`: x1 position
|
|
539
|
+
:param `y1`: y1 position
|
|
540
|
+
:param `width1`: width
|
|
541
|
+
:param `height1`: height
|
|
542
|
+
:param `x2`: x2 position
|
|
543
|
+
:param `y2`: y2 position
|
|
544
|
+
:param `x3`: x3 position
|
|
545
|
+
:param `y3`: y3 position
|
|
546
|
+
|
|
547
|
+
:returns: ellipse points ???
|
|
548
|
+
|
|
549
|
+
"""
|
|
550
|
+
a1 = width1 / 2.0
|
|
551
|
+
b1 = height1 / 2.0
|
|
552
|
+
|
|
553
|
+
# Check that x2 != x3
|
|
554
|
+
if abs(x2 - x3) < 0.05:
|
|
555
|
+
x4 = x2
|
|
556
|
+
if y3 > y2:
|
|
557
|
+
y4 = y1 - math.sqrt((b1 * b1 - (((x2 - x1) * (x2 - x1)) * (b1 * b1) / (a1 * a1))))
|
|
558
|
+
else:
|
|
559
|
+
y4 = y1 + math.sqrt((b1 * b1 - (((x2 - x1) * (x2 - x1)) * (b1 * b1) / (a1 * a1))))
|
|
560
|
+
return x4, y4
|
|
561
|
+
|
|
562
|
+
# Calculate the x and y coordinates of the point where arc intersects ellipse
|
|
563
|
+
A = (1 / (a1 * a1))
|
|
564
|
+
B = ((y3 - y2) * (y3 - y2)) / ((x3 - x2) * (x3 - x2) * b1 * b1)
|
|
565
|
+
C = (2 * (y3 - y2) * (y2 - y1)) / ((x3 - x2) * b1 * b1)
|
|
566
|
+
D = ((y2 - y1) * (y2 - y1)) / (b1 * b1)
|
|
567
|
+
E = (A + B)
|
|
568
|
+
F = (C - (2 * A * x1) - (2 * B * x2))
|
|
569
|
+
G = ((A * x1 * x1) + (B * x2 * x2) - (C * x2) + D - 1)
|
|
570
|
+
H = (float(y3 - y2) / (x3 - x2))
|
|
571
|
+
K = ((F * F) - (4 * E * G))
|
|
572
|
+
|
|
573
|
+
if K >= 0:
|
|
574
|
+
# In this case the line intersects the ellipse, so calculate intersection
|
|
575
|
+
if x2 >= x1:
|
|
576
|
+
ellipse1_x = ((F * -1) + math.sqrt(K)) / (2 * E)
|
|
577
|
+
ellipse1_y = ((H * (ellipse1_x - x2)) + y2)
|
|
578
|
+
else:
|
|
579
|
+
ellipse1_x = (((F * -1) - math.sqrt(K)) / (2 * E))
|
|
580
|
+
ellipse1_y = ((H * (ellipse1_x - x2)) + y2)
|
|
581
|
+
else:
|
|
582
|
+
# in this case, arc does not intersect ellipse, so just draw arc
|
|
583
|
+
ellipse1_x = x3
|
|
584
|
+
ellipse1_y = y3
|
|
585
|
+
|
|
586
|
+
return ellipse1_x, ellipse1_y
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
def FindEndForCircle(radius, x1, y1, x2, y2):
|
|
590
|
+
"""
|
|
591
|
+
Find end for a circle
|
|
592
|
+
|
|
593
|
+
:param `radius`: radius
|
|
594
|
+
:param `x1`: x1 position
|
|
595
|
+
:param `y1`: y1 position
|
|
596
|
+
:param `x2`: x2 position
|
|
597
|
+
:param `y2`: y2 position
|
|
598
|
+
|
|
599
|
+
:returns: end position
|
|
600
|
+
|
|
601
|
+
"""
|
|
602
|
+
H = math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))
|
|
603
|
+
|
|
604
|
+
if H == 0:
|
|
605
|
+
return x1, y1
|
|
606
|
+
else:
|
|
607
|
+
return radius * (x2 - x1) / H + x1, radius * (y2 - y1) / H + y1
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Name: __init__.py
|
|
2
|
+
# Package: wx.lib.pdfviewer
|
|
3
|
+
#
|
|
4
|
+
# Purpose: A PDF file viewer
|
|
5
|
+
#
|
|
6
|
+
# Author: David Hughes dfh@forestfield.co.uk
|
|
7
|
+
# Copyright: Forestfield Software Ltd
|
|
8
|
+
# Licence: Same as wxPython host
|
|
9
|
+
|
|
10
|
+
# History: Created 17 Aug 2009
|
|
11
|
+
#
|
|
12
|
+
# Tags: phoenix-port, documented
|
|
13
|
+
#
|
|
14
|
+
#----------------------------------------------------------------------------
|
|
15
|
+
"""
|
|
16
|
+
:class:`~wx.lib.pdfviewer.viewer.pdfViewer` class is derived from :class:`wx.ScrolledWindow` class
|
|
17
|
+
and can display and print PDF files.
|
|
18
|
+
|
|
19
|
+
Description
|
|
20
|
+
===========
|
|
21
|
+
|
|
22
|
+
The :class:`~wx.lib.pdfviewer.viewer.pdfViewer` class is derived from :class:`wx.ScrolledWindow`
|
|
23
|
+
and can display and print PDF files. The whole file can be scrolled from
|
|
24
|
+
end to end at whatever magnification (zoom-level) is specified.
|
|
25
|
+
|
|
26
|
+
The viewer uses PyMuPDF (version 1.9.2 or later) or PyPDF2.
|
|
27
|
+
If neither of them are installed an import error exception will be raised.
|
|
28
|
+
|
|
29
|
+
PyMuPDF contains the Python bindings for the underlying MuPDF library, a cross platform,
|
|
30
|
+
complete PDF rendering library that is GPL licenced.
|
|
31
|
+
|
|
32
|
+
Further details on PyMuPDF can be found via https://pymupdf.readthedocs.io/en/latest/
|
|
33
|
+
|
|
34
|
+
PyPDF2 provides a PdfFileReader class that is used to read the content stream of a PDF
|
|
35
|
+
file which is subsequently rendered by :class:`~wx.lib.pdfviewer.viewer.pdfViewer` itself.
|
|
36
|
+
Please note that this is not a complete implementation of the pdf specification and
|
|
37
|
+
will probably fail to display any random file you supply. However it does seem to
|
|
38
|
+
satisfactorily render files typically produced by ReportLab using Western languages.
|
|
39
|
+
The main limitation is that it doesn't currently support embedded fonts.
|
|
40
|
+
|
|
41
|
+
Additional details on PyPDF2 can be found via http://pythonhosted.org/PyPDF2
|
|
42
|
+
|
|
43
|
+
There is an optional :class:`~wx.lib.pdfviewer.buttonpanel.pdfButtonPanel` class, derived from
|
|
44
|
+
:class:`~wx.lib.agw.buttonpanel`, that can be placed, for example, at the top of the
|
|
45
|
+
scrolled viewer window, and which contains navigation and zoom controls.
|
|
46
|
+
|
|
47
|
+
Usage
|
|
48
|
+
=====
|
|
49
|
+
|
|
50
|
+
Sample usage::
|
|
51
|
+
|
|
52
|
+
import wx
|
|
53
|
+
import wx.lib.sized_controls as sc
|
|
54
|
+
|
|
55
|
+
from wx.lib.pdfviewer import pdfViewer, pdfButtonPanel
|
|
56
|
+
|
|
57
|
+
class PDFViewer(sc.SizedFrame):
|
|
58
|
+
def __init__(self, parent, **kwds):
|
|
59
|
+
super(PDFViewer, self).__init__(parent, **kwds)
|
|
60
|
+
|
|
61
|
+
paneCont = self.GetContentsPane()
|
|
62
|
+
self.buttonpanel = pdfButtonPanel(paneCont, wx.ID_ANY,
|
|
63
|
+
wx.DefaultPosition, wx.DefaultSize, 0)
|
|
64
|
+
self.buttonpanel.SetSizerProps(expand=True)
|
|
65
|
+
self.viewer = pdfViewer(paneCont, wx.ID_ANY, wx.DefaultPosition,
|
|
66
|
+
wx.DefaultSize,
|
|
67
|
+
wx.HSCROLL|wx.VSCROLL|wx.SUNKEN_BORDER)
|
|
68
|
+
|
|
69
|
+
self.viewer.SetSizerProps(expand=True, proportion=1)
|
|
70
|
+
|
|
71
|
+
# introduce buttonpanel and viewer to each other
|
|
72
|
+
self.buttonpanel.viewer = self.viewer
|
|
73
|
+
self.viewer.buttonpanel = self.buttonpanel
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if __name__ == '__main__':
|
|
77
|
+
import wx.lib.mixins.inspection as WIT
|
|
78
|
+
app = WIT.InspectableApp(redirect=False)
|
|
79
|
+
|
|
80
|
+
pdfV = PDFViewer(None, size=(800, 600))
|
|
81
|
+
pdfV.viewer.LoadFile(r'a path to a .pdf file')
|
|
82
|
+
pdfV.Show()
|
|
83
|
+
|
|
84
|
+
app.MainLoop()
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
Alternatively you can drive the viewer from controls in your own application.
|
|
88
|
+
|
|
89
|
+
Externally callable methods are:
|
|
90
|
+
|
|
91
|
+
:meth:`~wx.lib.pdfviewer.viewer.pdfViewer.LoadFile`
|
|
92
|
+
|
|
93
|
+
:meth:`~wx.lib.pdfviewer.viewer.pdfViewer.Save`
|
|
94
|
+
|
|
95
|
+
:meth:`~wx.lib.pdfviewer.viewer.pdfViewer.Print`
|
|
96
|
+
|
|
97
|
+
:meth:`~wx.lib.pdfviewer.viewer.pdfViewer.SetZoom`
|
|
98
|
+
|
|
99
|
+
:meth:`~wx.lib.pdfviewer.viewer.pdfViewer.GoPage`
|
|
100
|
+
|
|
101
|
+
The viewer renders the pdf file content using Cairo if installed,
|
|
102
|
+
otherwise :class:`wx.GraphicsContext` is used. Printing is achieved by writing
|
|
103
|
+
directly to a :class:`wx.PrinterDC` and using :class:`wx.Printer`.
|
|
104
|
+
|
|
105
|
+
The icons used in :class:`~wx.lib.pdfviewer.buttonpanel.pdfButtonPanel` are Free Icons
|
|
106
|
+
by Axialis Software: http://www.axialis.com. You can freely use them in any project,
|
|
107
|
+
commercially or not, but you must keep the credits of the authors:
|
|
108
|
+
"Axialis Team", even if you modify them. See ./bitmaps/ReadMe.txt for further details.
|
|
109
|
+
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
from .viewer import pdfViewer
|
|
113
|
+
from .buttonpanel import pdfButtonPanel
|
|
Binary file
|