wxPython-zombie 3.1.5.8__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wx/__init__.py +22 -0
- wx/__version__.py +9 -0
- wx/_adv.cp313-win_amd64.pyd +0 -0
- wx/_aui.cp313-win_amd64.pyd +0 -0
- wx/_core.cp313-win_amd64.pyd +0 -0
- wx/_dataview.cp313-win_amd64.pyd +0 -0
- wx/_glcanvas.cp313-win_amd64.pyd +0 -0
- wx/_grid.cp313-win_amd64.pyd +0 -0
- wx/_html.cp313-win_amd64.pyd +0 -0
- wx/_html2.cp313-win_amd64.pyd +0 -0
- wx/_media.cp313-win_amd64.pyd +0 -0
- wx/_msw.cp313-win_amd64.pyd +0 -0
- wx/_propgrid.cp313-win_amd64.pyd +0 -0
- wx/_ribbon.cp313-win_amd64.pyd +0 -0
- wx/_richtext.cp313-win_amd64.pyd +0 -0
- wx/_stc.cp313-win_amd64.pyd +0 -0
- wx/_xml.cp313-win_amd64.pyd +0 -0
- wx/_xrc.cp313-win_amd64.pyd +0 -0
- wx/adv.py +124 -0
- wx/adv.pyi +5182 -0
- wx/aui.py +77 -0
- wx/aui.pyi +3655 -0
- wx/core.py +3540 -0
- wx/core.pyi +50592 -0
- wx/dataview.py +173 -0
- wx/dataview.pyi +3491 -0
- wx/demo/AUI_DockingWindowMgr.py +1154 -0
- wx/demo/AUI_MDI.py +117 -0
- wx/demo/AUI_Notebook.py +58 -0
- wx/demo/About.py +75 -0
- wx/demo/AboutBox.py +75 -0
- wx/demo/ActiveXWrapper_Acrobat.py +132 -0
- wx/demo/ActiveXWrapper_IE.py +187 -0
- wx/demo/ActiveX_FlashWindow.py +107 -0
- wx/demo/ActiveX_IEHtmlWindow.py +242 -0
- wx/demo/ActiveX_PDFWindow.py +204 -0
- wx/demo/ActivityIndicator.py +80 -0
- wx/demo/AddPrivateFont.py +116 -0
- wx/demo/AdjustChannels.py +178 -0
- wx/demo/AlphaDrawing.py +77 -0
- wx/demo/AnalogClock.py +144 -0
- wx/demo/AnimationCtrl.py +104 -0
- wx/demo/ArtProvider.py +893 -0
- wx/demo/BannerWindow.py +1 -0
- wx/demo/BitmapButton.py +87 -0
- wx/demo/BitmapComboBox.py +63 -0
- wx/demo/BitmapFromBuffer.py +140 -0
- wx/demo/Button.py +77 -0
- wx/demo/Cairo.py +197 -0
- wx/demo/Cairo_Snippets.py +135 -0
- wx/demo/Calendar.py +660 -0
- wx/demo/CalendarCtrl.py +122 -0
- wx/demo/CheckBox.py +74 -0
- wx/demo/CheckListBox.py +79 -0
- wx/demo/CheckListCtrl.py +99 -0
- wx/demo/Choice.py +55 -0
- wx/demo/Choicebook.py +80 -0
- wx/demo/CollapsibleHeaderCtrl.py +85 -0
- wx/demo/CollapsiblePane.py +126 -0
- wx/demo/ColorPanel.py +19 -0
- wx/demo/ColourDB.py +203 -0
- wx/demo/ColourDialog.py +76 -0
- wx/demo/ColourSelect.py +119 -0
- wx/demo/ComboBox.py +111 -0
- wx/demo/ComboCtrl.py +153 -0
- wx/demo/ComboTreeBox.py +71 -0
- wx/demo/CommandLinkButton.py +50 -0
- wx/demo/ContextHelp.py +112 -0
- wx/demo/Cursor.py +336 -0
- wx/demo/CustomDragAndDrop.py +353 -0
- wx/demo/DVC_CustomRenderer.py +204 -0
- wx/demo/DVC_DataViewModel.py +365 -0
- wx/demo/DVC_IndexListModel.py +257 -0
- wx/demo/DVC_ListCtrl.py +69 -0
- wx/demo/DVC_TreeCtrl.py +76 -0
- wx/demo/DatePickerCtrl.py +68 -0
- wx/demo/DelayedResult.py +239 -0
- wx/demo/Dialog.py +169 -0
- wx/demo/DialogUnits.py +128 -0
- wx/demo/DirDialog.py +58 -0
- wx/demo/DragAndDrop.py +265 -0
- wx/demo/DragImage.py +316 -0
- wx/demo/DragScroller.py +59 -0
- wx/demo/DrawXXXList.py +436 -0
- wx/demo/DynamicSashWindow.py +177 -0
- wx/demo/EditableListBox.py +101 -0
- wx/demo/Editor.py +70 -0
- wx/demo/EventManager.py +291 -0
- wx/demo/ExpandoTextCtrl.py +164 -0
- wx/demo/FancyText.py +83 -0
- wx/demo/FileBrowseButton.py +100 -0
- wx/demo/FileCtrl.py +97 -0
- wx/demo/FileDialog.py +144 -0
- wx/demo/FileHistory.py +140 -0
- wx/demo/FindReplaceDialog.py +123 -0
- wx/demo/FloatCanvas.py +1959 -0
- wx/demo/FontDialog.py +142 -0
- wx/demo/FontEnumerator.py +82 -0
- wx/demo/Frame.py +85 -0
- wx/demo/GLCanvas.py +371 -0
- wx/demo/Gauge.py +66 -0
- wx/demo/GenericButtons.py +185 -0
- wx/demo/GenericCheckBox.py +65 -0
- wx/demo/GenericDirCtrl.py +74 -0
- wx/demo/GetMouseState.py +159 -0
- wx/demo/GraphicsContext.py +236 -0
- wx/demo/GraphicsGradient.py +281 -0
- wx/demo/Grid.py +95 -0
- wx/demo/GridBagSizer.py +170 -0
- wx/demo/GridCustEditor.py +247 -0
- wx/demo/GridCustTable.py +170 -0
- wx/demo/GridDragAndDrop.py +102 -0
- wx/demo/GridDragable.py +206 -0
- wx/demo/GridEnterHandler.py +66 -0
- wx/demo/GridHugeTable.py +89 -0
- wx/demo/GridLabelRenderer.py +114 -0
- wx/demo/GridSimple.py +270 -0
- wx/demo/GridStdEdRend.py +186 -0
- wx/demo/Grid_MegaExample.py +490 -0
- wx/demo/HTML2_WebView.py +183 -0
- wx/demo/HtmlWindow.py +232 -0
- wx/demo/I18N.py +237 -0
- wx/demo/Image.py +338 -0
- wx/demo/ImageAlpha.py +87 -0
- wx/demo/ImageBrowser.py +70 -0
- wx/demo/ImageFromStream.py +49 -0
- wx/demo/Img2PyArtProvider.py +99 -0
- wx/demo/InfoBar.py +127 -0
- wx/demo/IntCtrl.py +343 -0
- wx/demo/ItemsPicker.py +108 -0
- wx/demo/Joystick.py +1083 -0
- wx/demo/KeyEvents.py +428 -0
- wx/demo/LEDNumberCtrl.py +121 -0
- wx/demo/LayoutAnchors.py +258 -0
- wx/demo/LayoutConstraints.py +149 -0
- wx/demo/Layoutf.py +69 -0
- wx/demo/ListBox.py +164 -0
- wx/demo/ListCtrl.py +538 -0
- wx/demo/ListCtrl_edit.py +155 -0
- wx/demo/ListCtrl_virtual.py +145 -0
- wx/demo/Listbook.py +104 -0
- wx/demo/MDIDemo.py +86 -0
- wx/demo/MDISashDemo.py +152 -0
- wx/demo/MDIWindows.py +66 -0
- wx/demo/Main.py +2768 -0
- wx/demo/Mask.py +137 -0
- wx/demo/MaskedEditControls.py +648 -0
- wx/demo/MaskedNumCtrl.py +359 -0
- wx/demo/MediaCtrl.py +190 -0
- wx/demo/Menu.py +322 -0
- wx/demo/MessageDialog.py +54 -0
- wx/demo/MimeTypesManager.py +354 -0
- wx/demo/MiniFrame.py +67 -0
- wx/demo/MouseGestures.py +198 -0
- wx/demo/MultiChoiceDialog.py +59 -0
- wx/demo/MultiSash.py +95 -0
- wx/demo/MultiSplitterWindow.py +168 -0
- wx/demo/MultipleChoiceDialog.py +101 -0
- wx/demo/Notebook.py +134 -0
- wx/demo/NotificationMessage.py +61 -0
- wx/demo/OGL.py +433 -0
- wx/demo/Overlay.py +209 -0
- wx/demo/OwnerDrawnComboBox.py +152 -0
- wx/demo/PDFViewer.py +109 -0
- wx/demo/PageSetupDialog.py +70 -0
- wx/demo/PenAndBrushStyles.py +208 -0
- wx/demo/Pickers.py +120 -0
- wx/demo/PlateButton.py +430 -0
- wx/demo/PopupControl.py +99 -0
- wx/demo/PopupMenu.py +156 -0
- wx/demo/PopupWindow.py +227 -0
- wx/demo/PrintDialog.py +60 -0
- wx/demo/PrintFramework.py +227 -0
- wx/demo/Process.py +168 -0
- wx/demo/ProgressDialog.py +87 -0
- wx/demo/PropertyGrid.py +1045 -0
- wx/demo/PropertySheetDialog.py +231 -0
- wx/demo/PseudoDC.py +350 -0
- wx/demo/PyColourChooser.py +60 -0
- wx/demo/PyCrust.py +21 -0
- wx/demo/PyPlot.py +83 -0
- wx/demo/PyShell.py +22 -0
- wx/demo/PythonEvents.py +109 -0
- wx/demo/README.txt +7 -0
- wx/demo/RadioBox.py +67 -0
- wx/demo/RadioButton.py +127 -0
- wx/demo/RawBitmapAccess.py +208 -0
- wx/demo/RearrangeDialog.py +160 -0
- wx/demo/RendererNative.py +170 -0
- wx/demo/ResizeWidget.py +76 -0
- wx/demo/RichMessageDialog.py +85 -0
- wx/demo/RichTextCtrl.py +732 -0
- wx/demo/RichToolTip.py +145 -0
- wx/demo/SVGImage_Bitmap.py +130 -0
- wx/demo/SVGImage_Render.py +138 -0
- wx/demo/SashWindow.py +151 -0
- wx/demo/ScrolledMessageDialog.py +52 -0
- wx/demo/ScrolledPanel.py +124 -0
- wx/demo/ScrolledWindow.py +260 -0
- wx/demo/SearchCtrl.py +115 -0
- wx/demo/ShapedWindow.py +145 -0
- wx/demo/Simplebook.py +202 -0
- wx/demo/SingleChoiceDialog.py +56 -0
- wx/demo/SizedControls.py +433 -0
- wx/demo/Sizers.py +609 -0
- wx/demo/Slider.py +52 -0
- wx/demo/Sound.py +95 -0
- wx/demo/SpinButton.py +63 -0
- wx/demo/SpinCtrl.py +56 -0
- wx/demo/SpinCtrlDouble.py +42 -0
- wx/demo/SplitTree.py +146 -0
- wx/demo/SplitterWindow.py +62 -0
- wx/demo/StandardPaths.py +113 -0
- wx/demo/StaticBitmap.py +55 -0
- wx/demo/StaticBox.py +62 -0
- wx/demo/StaticText.py +69 -0
- wx/demo/StatusBar.py +144 -0
- wx/demo/StockButtons.py +113 -0
- wx/demo/StyledTextCtrl_1.py +303 -0
- wx/demo/StyledTextCtrl_2.py +410 -0
- wx/demo/SystemSettings.py +333 -0
- wx/demo/TablePrint.py +215 -0
- wx/demo/TestTable.txt +38 -0
- wx/demo/TextCtrl.py +187 -0
- wx/demo/TextEntryDialog.py +57 -0
- wx/demo/Threads.py +258 -0
- wx/demo/Throbber.py +250 -0
- wx/demo/Ticker.py +147 -0
- wx/demo/TimeCtrl.py +240 -0
- wx/demo/TimePickerCtrl.py +60 -0
- wx/demo/Timer.py +275 -0
- wx/demo/ToggleButton.py +54 -0
- wx/demo/ToolBar.py +249 -0
- wx/demo/ToolTip.py +71 -0
- wx/demo/Toolbook.py +111 -0
- wx/demo/TreeCtrl.py +199 -0
- wx/demo/TreeListCtrl.py +121 -0
- wx/demo/TreeMixin.py +269 -0
- wx/demo/Treebook.py +117 -0
- wx/demo/UIActionSimulator.py +151 -0
- wx/demo/URLDragAndDrop.py +130 -0
- wx/demo/Unicode.py +146 -0
- wx/demo/VListBox.py +176 -0
- wx/demo/Validator.py +237 -0
- wx/demo/Wizard.py +248 -0
- wx/demo/WrapSizer.py +115 -0
- wx/demo/XmlResource.py +80 -0
- wx/demo/XmlResourceHandler.py +199 -0
- wx/demo/XmlResourceSubclass.py +119 -0
- wx/demo/__init__.py +9 -0
- wx/demo/agw/AGWInfoBar.py +175 -0
- wx/demo/agw/AUI.py +3058 -0
- wx/demo/agw/AdvancedSplash.py +59 -0
- wx/demo/agw/AquaButton.py +146 -0
- wx/demo/agw/BalloonTip.py +378 -0
- wx/demo/agw/ButtonPanel.py +890 -0
- wx/demo/agw/CubeColourDialog.py +83 -0
- wx/demo/agw/CustomTreeCtrl.py +2167 -0
- wx/demo/agw/Example1 +67 -0
- wx/demo/agw/Example2 +49 -0
- wx/demo/agw/FlatMenu.py +876 -0
- wx/demo/agw/FlatNotebook.py +994 -0
- wx/demo/agw/FloatSpin.py +475 -0
- wx/demo/agw/FoldPanelBar.py +953 -0
- wx/demo/agw/FourWaySplitter.py +300 -0
- wx/demo/agw/GenericMessageDialog.py +207 -0
- wx/demo/agw/GradientButton.py +156 -0
- wx/demo/agw/HyperLinkCtrl.py +144 -0
- wx/demo/agw/HyperTreeList.py +2660 -0
- wx/demo/agw/KnobCtrl.py +186 -0
- wx/demo/agw/LabelBook.py +567 -0
- wx/demo/agw/MacLargeDemo.py +360 -0
- wx/demo/agw/MultiDirDialog.py +117 -0
- wx/demo/agw/PeakMeter.py +194 -0
- wx/demo/agw/PersistentControls.py +589 -0
- wx/demo/agw/PieCtrl.py +206 -0
- wx/demo/agw/PyBusyInfo.py +64 -0
- wx/demo/agw/PyCollapsiblePane.py +308 -0
- wx/demo/agw/PyGauge.py +162 -0
- wx/demo/agw/PyProgress.py +155 -0
- wx/demo/agw/RibbonBar.py +925 -0
- wx/demo/agw/RulerCtrl.py +454 -0
- wx/demo/agw/ScrolledThumbnail.py +128 -0
- wx/demo/agw/ShapedButton.py +603 -0
- wx/demo/agw/ShortcutEditor.py +397 -0
- wx/demo/agw/SpeedMeter.py +668 -0
- wx/demo/agw/SuperToolTip.py +396 -0
- wx/demo/agw/ThumbDemoConfig.py +603 -0
- wx/demo/agw/ThumbnailCtrl.py +149 -0
- wx/demo/agw/ToasterBox.py +410 -0
- wx/demo/agw/UltimateListCtrl.py +80 -0
- wx/demo/agw/UltimateListIconDemo.py +908 -0
- wx/demo/agw/UltimateListListDemo.py +124 -0
- wx/demo/agw/UltimateReportDemo.py +1146 -0
- wx/demo/agw/UltimateVirtualDemo.py +207 -0
- wx/demo/agw/Windows7Explorer_Contents.py +368 -0
- wx/demo/agw/XLSGrid.py +238 -0
- wx/demo/agw/ZoomBar.py +230 -0
- wx/demo/agw/__demo__.py +183 -0
- wx/demo/agw/bitmaps/Explorer96.png +0 -0
- wx/demo/agw/bitmaps/Explorer96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Folder96.png +0 -0
- wx/demo/agw/bitmaps/Folder96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Monitor96.png +0 -0
- wx/demo/agw/bitmaps/Monitor96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Music96.png +0 -0
- wx/demo/agw/bitmaps/Music96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Photo96.png +0 -0
- wx/demo/agw/bitmaps/Photo96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Search96.png +0 -0
- wx/demo/agw/bitmaps/Search96Flip40.png +0 -0
- wx/demo/agw/bitmaps/Wizard96.png +0 -0
- wx/demo/agw/bitmaps/Wizard96Flip40.png +0 -0
- wx/demo/agw/bitmaps/advancedsplash.png +0 -0
- wx/demo/agw/bitmaps/aquabutton.png +0 -0
- wx/demo/agw/bitmaps/aquachecked.ico +0 -0
- wx/demo/agw/bitmaps/aquaflagged.ico +0 -0
- wx/demo/agw/bitmaps/aquanotchecked.ico +0 -0
- wx/demo/agw/bitmaps/aquanotflagged.ico +0 -0
- wx/demo/agw/bitmaps/canada.gif +0 -0
- wx/demo/agw/bitmaps/checked.ico +0 -0
- wx/demo/agw/bitmaps/columns.png +0 -0
- wx/demo/agw/bitmaps/contexthelp-16.png +0 -0
- wx/demo/agw/bitmaps/contexthelp.png +0 -0
- wx/demo/agw/bitmaps/copy.png +0 -0
- wx/demo/agw/bitmaps/cut.png +0 -0
- wx/demo/agw/bitmaps/editcopy.png +0 -0
- wx/demo/agw/bitmaps/editcut.png +0 -0
- wx/demo/agw/bitmaps/editpaste.png +0 -0
- wx/demo/agw/bitmaps/empty_icon.png +0 -0
- wx/demo/agw/bitmaps/exit-16.png +0 -0
- wx/demo/agw/bitmaps/exit.ico +0 -0
- wx/demo/agw/bitmaps/ffwd.png +0 -0
- wx/demo/agw/bitmaps/ffwddisabled.png +0 -0
- wx/demo/agw/bitmaps/field-16.png +0 -0
- wx/demo/agw/bitmaps/filenew.png +0 -0
- wx/demo/agw/bitmaps/fileopen.png +0 -0
- wx/demo/agw/bitmaps/filesave.png +0 -0
- wx/demo/agw/bitmaps/flagged.ico +0 -0
- wx/demo/agw/bitmaps/folder.png +0 -0
- wx/demo/agw/bitmaps/folder_new.png +0 -0
- wx/demo/agw/bitmaps/ghost.png +0 -0
- wx/demo/agw/bitmaps/gradientbutton.png +0 -0
- wx/demo/agw/bitmaps/help-16.png +0 -0
- wx/demo/agw/bitmaps/help.ico +0 -0
- wx/demo/agw/bitmaps/italy.gif +0 -0
- wx/demo/agw/bitmaps/lbadd.png +0 -0
- wx/demo/agw/bitmaps/lbcharge.png +0 -0
- wx/demo/agw/bitmaps/lbdecrypted.png +0 -0
- wx/demo/agw/bitmaps/lbnews.png +0 -0
- wx/demo/agw/bitmaps/lbroll.png +0 -0
- wx/demo/agw/bitmaps/minus1.ico +0 -0
- wx/demo/agw/bitmaps/minus2.ico +0 -0
- wx/demo/agw/bitmaps/minus3.ico +0 -0
- wx/demo/agw/bitmaps/minus4.ico +0 -0
- wx/demo/agw/bitmaps/minus5.ico +0 -0
- wx/demo/agw/bitmaps/month-16.png +0 -0
- wx/demo/agw/bitmaps/new_file.png +0 -0
- wx/demo/agw/bitmaps/new_folder.png +0 -0
- wx/demo/agw/bitmaps/notchecked.ico +0 -0
- wx/demo/agw/bitmaps/notflagged.ico +0 -0
- wx/demo/agw/bitmaps/ok-16.png +0 -0
- wx/demo/agw/bitmaps/open_folder.png +0 -0
- wx/demo/agw/bitmaps/paste.png +0 -0
- wx/demo/agw/bitmaps/pause.png +0 -0
- wx/demo/agw/bitmaps/pausedisabled.png +0 -0
- wx/demo/agw/bitmaps/play.png +0 -0
- wx/demo/agw/bitmaps/playdisabled.png +0 -0
- wx/demo/agw/bitmaps/plus1.ico +0 -0
- wx/demo/agw/bitmaps/plus2.ico +0 -0
- wx/demo/agw/bitmaps/plus3.ico +0 -0
- wx/demo/agw/bitmaps/plus4.ico +0 -0
- wx/demo/agw/bitmaps/plus5.ico +0 -0
- wx/demo/agw/bitmaps/record.png +0 -0
- wx/demo/agw/bitmaps/recorddisabled.png +0 -0
- wx/demo/agw/bitmaps/recording.gif +0 -0
- wx/demo/agw/bitmaps/rewind.png +0 -0
- wx/demo/agw/bitmaps/rewinddisabled.png +0 -0
- wx/demo/agw/bitmaps/round.png +0 -0
- wx/demo/agw/bitmaps/save.png +0 -0
- wx/demo/agw/bitmaps/separator.gif +0 -0
- wx/demo/agw/bitmaps/separatorflip.png +0 -0
- wx/demo/agw/bitmaps/smfuel.ico +0 -0
- wx/demo/agw/bitmaps/smpi.ico +0 -0
- wx/demo/agw/bitmaps/smtemp.ico +0 -0
- wx/demo/agw/bitmaps/stop.png +0 -0
- wx/demo/agw/bitmaps/stopdisabled.png +0 -0
- wx/demo/agw/bitmaps/sttbutton.png +0 -0
- wx/demo/agw/bitmaps/sttfont.png +0 -0
- wx/demo/agw/bitmaps/sttheader.png +0 -0
- wx/demo/agw/bitmaps/stthelp.png +0 -0
- wx/demo/agw/bitmaps/view1.png +0 -0
- wx/demo/agw/bitmaps/view2.png +0 -0
- wx/demo/agw/bitmaps/view_choose.png +0 -0
- wx/demo/agw/bitmaps/view_detailed.png +0 -0
- wx/demo/agw/bitmaps/view_icon.png +0 -0
- wx/demo/agw/bitmaps/view_multicolumn.png +0 -0
- wx/demo/agw/bitmaps/viewmag-16.png +0 -0
- wx/demo/agw/bitmaps/viewmag-m-16.png +0 -0
- wx/demo/agw/bitmaps/viewmag-p-16.png +0 -0
- wx/demo/agw/bitmaps/viewmagfit-16.png +0 -0
- wx/demo/agw/data/Example_1.xls +0 -0
- wx/demo/agw/images.py +6714 -0
- wx/demo/bitmaps/AG00028_.gif +0 -0
- wx/demo/bitmaps/AG00039_.gif +0 -0
- wx/demo/bitmaps/AG00178_.gif +0 -0
- wx/demo/bitmaps/AG00183_.gif +0 -0
- wx/demo/bitmaps/AG00185_.gif +0 -0
- wx/demo/bitmaps/BD13656_.gif +0 -0
- wx/demo/bitmaps/advancedsplash.png +0 -0
- wx/demo/bitmaps/aquabutton.png +0 -0
- wx/demo/bitmaps/aquachecked.ico +0 -0
- wx/demo/bitmaps/aquaflagged.ico +0 -0
- wx/demo/bitmaps/aquanotchecked.ico +0 -0
- wx/demo/bitmaps/aquanotflagged.ico +0 -0
- wx/demo/bitmaps/canada.gif +0 -0
- wx/demo/bitmaps/checked.ico +0 -0
- wx/demo/bitmaps/columns.png +0 -0
- wx/demo/bitmaps/contexthelp-16.png +0 -0
- wx/demo/bitmaps/contexthelp.png +0 -0
- wx/demo/bitmaps/copy.png +0 -0
- wx/demo/bitmaps/cropshot24x20.png +0 -0
- wx/demo/bitmaps/cut.png +0 -0
- wx/demo/bitmaps/editcopy.png +0 -0
- wx/demo/bitmaps/editcut.png +0 -0
- wx/demo/bitmaps/editpaste.png +0 -0
- wx/demo/bitmaps/exit-16.png +0 -0
- wx/demo/bitmaps/exit.ico +0 -0
- wx/demo/bitmaps/ffwd.png +0 -0
- wx/demo/bitmaps/ffwddisabled.png +0 -0
- wx/demo/bitmaps/field-16.png +0 -0
- wx/demo/bitmaps/filenew.png +0 -0
- wx/demo/bitmaps/fileopen.png +0 -0
- wx/demo/bitmaps/filesave.png +0 -0
- wx/demo/bitmaps/flagged.ico +0 -0
- wx/demo/bitmaps/folder_new.png +0 -0
- wx/demo/bitmaps/ghost.png +0 -0
- wx/demo/bitmaps/gradientbutton.png +0 -0
- wx/demo/bitmaps/help-16.png +0 -0
- wx/demo/bitmaps/help.ico +0 -0
- wx/demo/bitmaps/honeycomb300.png +0 -0
- wx/demo/bitmaps/image.bmp +0 -0
- wx/demo/bitmaps/image.gif +0 -0
- wx/demo/bitmaps/image.ico +0 -0
- wx/demo/bitmaps/image.jpg +0 -0
- wx/demo/bitmaps/image.png +0 -0
- wx/demo/bitmaps/image.tif +0 -0
- wx/demo/bitmaps/italy.gif +0 -0
- wx/demo/bitmaps/lbadd.png +0 -0
- wx/demo/bitmaps/lbcharge.png +0 -0
- wx/demo/bitmaps/lbdecrypted.png +0 -0
- wx/demo/bitmaps/lbnews.png +0 -0
- wx/demo/bitmaps/lbroll.png +0 -0
- wx/demo/bitmaps/minus1.ico +0 -0
- wx/demo/bitmaps/minus2.ico +0 -0
- wx/demo/bitmaps/minus3.ico +0 -0
- wx/demo/bitmaps/minus4.ico +0 -0
- wx/demo/bitmaps/minus5.ico +0 -0
- wx/demo/bitmaps/month-16.png +0 -0
- wx/demo/bitmaps/new_file.png +0 -0
- wx/demo/bitmaps/new_folder.png +0 -0
- wx/demo/bitmaps/notchecked.ico +0 -0
- wx/demo/bitmaps/notflagged.ico +0 -0
- wx/demo/bitmaps/ok-16.png +0 -0
- wx/demo/bitmaps/open_folder.png +0 -0
- wx/demo/bitmaps/paste.png +0 -0
- wx/demo/bitmaps/pause.png +0 -0
- wx/demo/bitmaps/pausedisabled.png +0 -0
- wx/demo/bitmaps/phoenix_title.png +0 -0
- wx/demo/bitmaps/phoenix_top.png +0 -0
- wx/demo/bitmaps/play.png +0 -0
- wx/demo/bitmaps/playdisabled.png +0 -0
- wx/demo/bitmaps/plus1.ico +0 -0
- wx/demo/bitmaps/plus2.ico +0 -0
- wx/demo/bitmaps/plus3.ico +0 -0
- wx/demo/bitmaps/plus4.ico +0 -0
- wx/demo/bitmaps/plus5.ico +0 -0
- wx/demo/bitmaps/record.png +0 -0
- wx/demo/bitmaps/recorddisabled.png +0 -0
- wx/demo/bitmaps/rewind.png +0 -0
- wx/demo/bitmaps/rewinddisabled.png +0 -0
- wx/demo/bitmaps/round.png +0 -0
- wx/demo/bitmaps/save.png +0 -0
- wx/demo/bitmaps/smfuel.ico +0 -0
- wx/demo/bitmaps/smpi.ico +0 -0
- wx/demo/bitmaps/smtemp.ico +0 -0
- wx/demo/bitmaps/snakey_render.png +0 -0
- wx/demo/bitmaps/splash.png +0 -0
- wx/demo/bitmaps/stop.png +0 -0
- wx/demo/bitmaps/stopdisabled.png +0 -0
- wx/demo/bitmaps/sttbutton.png +0 -0
- wx/demo/bitmaps/sttfont.png +0 -0
- wx/demo/bitmaps/sttheader.png +0 -0
- wx/demo/bitmaps/stthelp.png +0 -0
- wx/demo/bitmaps/toucan.png +0 -0
- wx/demo/bitmaps/view1.png +0 -0
- wx/demo/bitmaps/view2.png +0 -0
- wx/demo/bitmaps/view_choose.png +0 -0
- wx/demo/bitmaps/view_detailed.png +0 -0
- wx/demo/bitmaps/view_icon.png +0 -0
- wx/demo/bitmaps/view_multicolumn.png +0 -0
- wx/demo/bitmaps/viewmag-16.png +0 -0
- wx/demo/bitmaps/viewmag-m-16.png +0 -0
- wx/demo/bitmaps/viewmag-p-16.png +0 -0
- wx/demo/bitmaps/viewmagfit-16.png +0 -0
- wx/demo/bmp_source/001.png +0 -0
- wx/demo/bmp_source/002.png +0 -0
- wx/demo/bmp_source/003.png +0 -0
- wx/demo/bmp_source/004.png +0 -0
- wx/demo/bmp_source/005.png +0 -0
- wx/demo/bmp_source/006.png +0 -0
- wx/demo/bmp_source/007.png +0 -0
- wx/demo/bmp_source/008.png +0 -0
- wx/demo/bmp_source/009.png +0 -0
- wx/demo/bmp_source/010.png +0 -0
- wx/demo/bmp_source/011.png +0 -0
- wx/demo/bmp_source/012.png +0 -0
- wx/demo/bmp_source/013.png +0 -0
- wx/demo/bmp_source/014.png +0 -0
- wx/demo/bmp_source/015.png +0 -0
- wx/demo/bmp_source/016.png +0 -0
- wx/demo/bmp_source/017.png +0 -0
- wx/demo/bmp_source/018.png +0 -0
- wx/demo/bmp_source/019.png +0 -0
- wx/demo/bmp_source/020.png +0 -0
- wx/demo/bmp_source/021.png +0 -0
- wx/demo/bmp_source/022.png +0 -0
- wx/demo/bmp_source/023.png +0 -0
- wx/demo/bmp_source/024.png +0 -0
- wx/demo/bmp_source/025.png +0 -0
- wx/demo/bmp_source/026.png +0 -0
- wx/demo/bmp_source/027.png +0 -0
- wx/demo/bmp_source/028.png +0 -0
- wx/demo/bmp_source/029.png +0 -0
- wx/demo/bmp_source/030.png +0 -0
- wx/demo/bmp_source/DbDec.bmp +0 -0
- wx/demo/bmp_source/DbInc.bmp +0 -0
- wx/demo/bmp_source/Dec.bmp +0 -0
- wx/demo/bmp_source/FRM_0.png +0 -0
- wx/demo/bmp_source/FRM_1.png +0 -0
- wx/demo/bmp_source/FRM_2.png +0 -0
- wx/demo/bmp_source/FRM_3.png +0 -0
- wx/demo/bmp_source/FRM_4.png +0 -0
- wx/demo/bmp_source/FRM_5.png +0 -0
- wx/demo/bmp_source/FRM_6.png +0 -0
- wx/demo/bmp_source/FRM_7.png +0 -0
- wx/demo/bmp_source/FRM_8.png +0 -0
- wx/demo/bmp_source/GridBG.gif +0 -0
- wx/demo/bmp_source/Inc.bmp +0 -0
- wx/demo/bmp_source/LB01.png +0 -0
- wx/demo/bmp_source/LB02.png +0 -0
- wx/demo/bmp_source/LB03.png +0 -0
- wx/demo/bmp_source/LB04.png +0 -0
- wx/demo/bmp_source/LB05.png +0 -0
- wx/demo/bmp_source/LB06.png +0 -0
- wx/demo/bmp_source/LB07.png +0 -0
- wx/demo/bmp_source/LB08.png +0 -0
- wx/demo/bmp_source/LB09.png +0 -0
- wx/demo/bmp_source/LB10.png +0 -0
- wx/demo/bmp_source/LB11.png +0 -0
- wx/demo/bmp_source/LB12.png +0 -0
- wx/demo/bmp_source/Pt.bmp +0 -0
- wx/demo/bmp_source/Vippi.png +0 -0
- wx/demo/bmp_source/backgrnd.png +0 -0
- wx/demo/bmp_source/book.png +0 -0
- wx/demo/bmp_source/book_blue.png +0 -0
- wx/demo/bmp_source/book_green.png +0 -0
- wx/demo/bmp_source/book_red.png +0 -0
- wx/demo/bmp_source/bp_btn1.png +0 -0
- wx/demo/bmp_source/bp_btn2.png +0 -0
- wx/demo/bmp_source/bp_btn3.png +0 -0
- wx/demo/bmp_source/bp_btn4.png +0 -0
- wx/demo/bmp_source/bulb1.bmp +0 -0
- wx/demo/bmp_source/bulb2.bmp +0 -0
- wx/demo/bmp_source/carrot.png +0 -0
- wx/demo/bmp_source/clipboard.png +0 -0
- wx/demo/bmp_source/code.png +0 -0
- wx/demo/bmp_source/core.png +0 -0
- wx/demo/bmp_source/custom.png +0 -0
- wx/demo/bmp_source/customcontrol.png +0 -0
- wx/demo/bmp_source/deletedocs.png +0 -0
- wx/demo/bmp_source/deleteperspective.png +0 -0
- wx/demo/bmp_source/demo.png +0 -0
- wx/demo/bmp_source/dialog.png +0 -0
- wx/demo/bmp_source/exit.png +0 -0
- wx/demo/bmp_source/expansion.png +0 -0
- wx/demo/bmp_source/find.png +0 -0
- wx/demo/bmp_source/findnext.png +0 -0
- wx/demo/bmp_source/floatcanvas.png +0 -0
- wx/demo/bmp_source/frame.png +0 -0
- wx/demo/bmp_source/images.png +0 -0
- wx/demo/bmp_source/inspect.png +0 -0
- wx/demo/bmp_source/layout.png +0 -0
- wx/demo/bmp_source/logo.png +0 -0
- wx/demo/bmp_source/miscellaneous.png +0 -0
- wx/demo/bmp_source/modifiedexists.png +0 -0
- wx/demo/bmp_source/mondrian.ico +0 -0
- wx/demo/bmp_source/morecontrols.png +0 -0
- wx/demo/bmp_source/moredialog.png +0 -0
- wx/demo/bmp_source/noicon.png +0 -0
- wx/demo/bmp_source/overview.png +0 -0
- wx/demo/bmp_source/pencil.png +0 -0
- wx/demo/bmp_source/pointy.png +0 -0
- wx/demo/bmp_source/process.png +0 -0
- wx/demo/bmp_source/pyshell.png +0 -0
- wx/demo/bmp_source/recent.png +0 -0
- wx/demo/bmp_source/rest.png +0 -0
- wx/demo/bmp_source/robin.jpg +0 -0
- wx/demo/bmp_source/rt_alignleft.xpm +24 -0
- wx/demo/bmp_source/rt_alignright.xpm +24 -0
- wx/demo/bmp_source/rt_bold.xpm +24 -0
- wx/demo/bmp_source/rt_centre.xpm +24 -0
- wx/demo/bmp_source/rt_colour.xpm +59 -0
- wx/demo/bmp_source/rt_copy.xpm +44 -0
- wx/demo/bmp_source/rt_cut.xpm +46 -0
- wx/demo/bmp_source/rt_font.xpm +25 -0
- wx/demo/bmp_source/rt_idea.xpm +47 -0
- wx/demo/bmp_source/rt_indentless.xpm +25 -0
- wx/demo/bmp_source/rt_indentmore.xpm +25 -0
- wx/demo/bmp_source/rt_italic.xpm +25 -0
- wx/demo/bmp_source/rt_open.xpm +57 -0
- wx/demo/bmp_source/rt_paste.xpm +46 -0
- wx/demo/bmp_source/rt_redo.xpm +58 -0
- wx/demo/bmp_source/rt_sample.xpm +44 -0
- wx/demo/bmp_source/rt_save.xpm +42 -0
- wx/demo/bmp_source/rt_smiley.xpm +42 -0
- wx/demo/bmp_source/rt_underline.xpm +25 -0
- wx/demo/bmp_source/rt_undo.xpm +58 -0
- wx/demo/bmp_source/rt_zebra.xpm +409 -0
- wx/demo/bmp_source/saveperspective.png +0 -0
- wx/demo/bmp_source/sm_down.bmp +0 -0
- wx/demo/bmp_source/sm_up.bmp +0 -0
- wx/demo/bmp_source/smiles2.bmp +0 -0
- wx/demo/bmp_source/test2.bmp +0 -0
- wx/demo/bmp_source/testmask.bmp +0 -0
- wx/demo/bmp_source/teststar.png +0 -0
- wx/demo/bmp_source/thekid.png +0 -0
- wx/demo/bmp_source/tog1.bmp +0 -0
- wx/demo/bmp_source/tog2.bmp +0 -0
- wx/demo/bmp_source/wiztest1.bmp +0 -0
- wx/demo/bmp_source/wiztest2.bmp +0 -0
- wx/demo/bmp_source/wxpdemo.ico +0 -0
- wx/demo/cursors/paperairplane_arrow_blue.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_blue_fadeout80.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_colorshift.ani +0 -0
- wx/demo/cursors/paperairplane_arrow_dark.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_grey.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_red.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_white.cur +0 -0
- wx/demo/cursors/paperairplane_arrow_white24.png +0 -0
- wx/demo/data/0-tiger.svg +725 -0
- wx/demo/data/Asteroid_blaster.swf +0 -0
- wx/demo/data/SIL_OPEN_FONT_LICENSE.txt +97 -0
- wx/demo/data/SourceCodePro-Regular.ttf +0 -0
- wx/demo/data/accessories-calculator.svg +636 -0
- wx/demo/data/accessories-text-editor.svg +554 -0
- wx/demo/data/anykey.wav +0 -0
- wx/demo/data/applications-internet.svg +623 -0
- wx/demo/data/desktop-accessibility.svg +245 -0
- wx/demo/data/desktop-keyboard-shortcuts.svg +839 -0
- wx/demo/data/desktop-locale.svg +878 -0
- wx/demo/data/desktop-remote-desktop.svg +1479 -0
- wx/demo/data/desktop-theme.svg +882 -0
- wx/demo/data/desktop-wallpaper.svg +747 -0
- wx/demo/data/echo.py +25 -0
- wx/demo/data/imagemap.htm +20 -0
- wx/demo/data/imagemap.png +0 -0
- wx/demo/data/internet-group-chat.svg +312 -0
- wx/demo/data/internet-mail.svg +440 -0
- wx/demo/data/locale/af/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale/de/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale/es/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale/fr/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale/it/LC_MESSAGES/wxpydemo.mo +0 -0
- wx/demo/data/locale-src/af.po +23 -0
- wx/demo/data/locale-src/de.po +23 -0
- wx/demo/data/locale-src/es.po +22 -0
- wx/demo/data/locale-src/fr.po +22 -0
- wx/demo/data/locale-src/install +15 -0
- wx/demo/data/locale-src/it.po +23 -0
- wx/demo/data/locale-src/wxpydemo.po +21 -0
- wx/demo/data/office-calendar.svg +316 -0
- wx/demo/data/pic.png +0 -0
- wx/demo/data/pic2.bmp +0 -0
- wx/demo/data/plan.wav +0 -0
- wx/demo/data/proclamation.txt +115 -0
- wx/demo/data/resource.wdr +0 -0
- wx/demo/data/resource_wdr.xrc +146 -0
- wx/demo/data/romedalen.png +0 -0
- wx/demo/data/stc.h.html +3544 -0
- wx/demo/data/system-session.svg +510 -0
- wx/demo/data/system-users.svg +539 -0
- wx/demo/data/tables.htm +116 -0
- wx/demo/data/test-gradient-pen.svg +14 -0
- wx/demo/data/test-opacity.svg +7 -0
- wx/demo/data/test.htm +253 -0
- wx/demo/data/testmovie.mpg +0 -0
- wx/demo/data/testtable.txt +38 -0
- wx/demo/data/tips.txt +73 -0
- wx/demo/data/utilities-system-monitor.svg +435 -0
- wx/demo/data/utilities-terminal.svg +500 -0
- wx/demo/data/widgetTest.htm +70 -0
- wx/demo/data/world.dat +24055 -0
- wx/demo/demo.py +4 -0
- wx/demo/demo.pyw +4 -0
- wx/demo/demodata.py +310 -0
- wx/demo/encode_bitmaps.py +181 -0
- wx/demo/images.py +6812 -0
- wx/demo/infoframe.py +149 -0
- wx/demo/run.py +171 -0
- wx/demo/snippets/__init__.py +13 -0
- wx/demo/snippets/arc.py +21 -0
- wx/demo/snippets/arc_negative.py +21 -0
- wx/demo/snippets/clip.py +13 -0
- wx/demo/snippets/clip_image.py +13 -0
- wx/demo/snippets/curve_rectangle.py +53 -0
- wx/demo/snippets/curve_to.py +17 -0
- wx/demo/snippets/dash.py +18 -0
- wx/demo/snippets/ellipse.py +33 -0
- wx/demo/snippets/fill_and_stroke.py +12 -0
- wx/demo/snippets/fill_and_stroke2.py +18 -0
- wx/demo/snippets/fill_style.py +31 -0
- wx/demo/snippets/glyph_path.py +21 -0
- wx/demo/snippets/gradient.py +16 -0
- wx/demo/snippets/gradient_mask.py +12 -0
- wx/demo/snippets/group.py +16 -0
- wx/demo/snippets/image.py +14 -0
- wx/demo/snippets/imagepattern.py +23 -0
- wx/demo/snippets/path.py +7 -0
- wx/demo/snippets/set_line_cap.py +19 -0
- wx/demo/snippets/set_line_join.py +21 -0
- wx/demo/snippets/show_glyphs.py +15 -0
- wx/demo/snippets/text.py +22 -0
- wx/demo/snippets/text_align_center.py +26 -0
- wx/demo/snippets/text_extents.py +27 -0
- wx/demo/template.py +36 -0
- wx/demo/throbImages.py +1277 -0
- wx/demo/version.py +3 -0
- wx/demo/widgetTest.py +72 -0
- wx/demo/wxpdemo.ico +0 -0
- wx/glcanvas.py +10 -0
- wx/glcanvas.pyi +458 -0
- wx/grid.py +229 -0
- wx/grid.pyi +4959 -0
- wx/html.py +35 -0
- wx/html.pyi +2965 -0
- wx/html2.py +40 -0
- wx/html2.pyi +772 -0
- wx/lib/CDate.py +202 -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 +564 -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 +2628 -0
- wx/lib/agw/aui/aui_switcherdialog.py +1227 -0
- wx/lib/agw/aui/aui_utilities.py +672 -0
- wx/lib/agw/aui/auibar.py +4031 -0
- wx/lib/agw/aui/auibook.py +6289 -0
- wx/lib/agw/aui/dockart.py +1198 -0
- wx/lib/agw/aui/framemanager.py +10409 -0
- wx/lib/agw/aui/tabart.py +2771 -0
- wx/lib/agw/aui/tabmdi.py +679 -0
- wx/lib/agw/balloontip.py +1158 -0
- wx/lib/agw/buttonpanel.py +2823 -0
- wx/lib/agw/cubecolourdialog.py +3529 -0
- wx/lib/agw/customtreectrl.py +8963 -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 +7333 -0
- wx/lib/agw/flatnotebook.py +6672 -0
- wx/lib/agw/floatspin.py +1823 -0
- wx/lib/agw/fmcustomizedlg.py +540 -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 +732 -0
- wx/lib/agw/hyperlink.py +664 -0
- wx/lib/agw/hypertreelist.py +5374 -0
- wx/lib/agw/infobar.py +885 -0
- wx/lib/agw/knobctrl.py +945 -0
- wx/lib/agw/labelbook.py +3029 -0
- wx/lib/agw/multidirdialog.py +615 -0
- wx/lib/agw/peakmeter.py +1029 -0
- wx/lib/agw/persist/__init__.py +188 -0
- wx/lib/agw/persist/persist_constants.py +284 -0
- wx/lib/agw/persist/persist_handlers.py +2614 -0
- wx/lib/agw/persist/persistencemanager.py +864 -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 +917 -0
- wx/lib/agw/ribbon/__init__.py +198 -0
- wx/lib/agw/ribbon/art.py +219 -0
- wx/lib/agw/ribbon/art_aui.py +1284 -0
- wx/lib/agw/ribbon/art_default.py +81 -0
- wx/lib/agw/ribbon/art_internal.py +244 -0
- wx/lib/agw/ribbon/art_msw.py +2736 -0
- wx/lib/agw/ribbon/art_osx.py +52 -0
- wx/lib/agw/ribbon/bar.py +1261 -0
- wx/lib/agw/ribbon/buttonbar.py +1320 -0
- wx/lib/agw/ribbon/control.py +205 -0
- wx/lib/agw/ribbon/gallery.py +974 -0
- wx/lib/agw/ribbon/page.py +946 -0
- wx/lib/agw/ribbon/panel.py +1170 -0
- wx/lib/agw/ribbon/toolbar.py +1442 -0
- wx/lib/agw/rulerctrl.py +1887 -0
- wx/lib/agw/scrolledthumbnail.py +2119 -0
- wx/lib/agw/shapedbutton.py +1809 -0
- wx/lib/agw/shortcuteditor.py +2634 -0
- wx/lib/agw/speedmeter.py +1801 -0
- wx/lib/agw/supertooltip.py +1444 -0
- wx/lib/agw/thumbnailctrl.py +529 -0
- wx/lib/agw/toasterbox.py +1327 -0
- wx/lib/agw/ultimatelistctrl.py +13666 -0
- wx/lib/agw/xlsgrid.py +2113 -0
- wx/lib/agw/zoombar.py +1339 -0
- wx/lib/analogclock/__init__.py +140 -0
- wx/lib/analogclock/analogclock.py +631 -0
- wx/lib/analogclock/helpers.py +991 -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 +146 -0
- wx/lib/buttons.py +1141 -0
- wx/lib/calendar.py +1597 -0
- wx/lib/checkbox.py +837 -0
- wx/lib/colourchooser/__init__.py +38 -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 +629 -0
- wx/lib/colourchooser/pycolourslider.py +100 -0
- wx/lib/colourchooser/pypalette.py +211 -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 +505 -0
- wx/lib/filebrowsebutton.py +459 -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 +2923 -0
- wx/lib/floatcanvas/FloatCanvas.py +1027 -0
- wx/lib/floatcanvas/GUIMode.py +396 -0
- wx/lib/floatcanvas/NavCanvas.py +161 -0
- wx/lib/floatcanvas/Resources.py +319 -0
- wx/lib/floatcanvas/ScreenShot.py +1788 -0
- wx/lib/floatcanvas/Utilities/BBox.py +314 -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 +300 -0
- wx/lib/gizmos/treelistctrl.py +87 -0
- wx/lib/graphics.py +1939 -0
- wx/lib/gridmovers.py +511 -0
- wx/lib/iewin.py +249 -0
- wx/lib/iewin_old.py +894 -0
- wx/lib/imagebrowser.py +856 -0
- wx/lib/imageutils.py +163 -0
- wx/lib/infoframe.py +490 -0
- wx/lib/inspection.py +1255 -0
- wx/lib/intctrl.py +1001 -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 +242 -0
- wx/lib/masked/maskededit.py +7279 -0
- wx/lib/masked/numctrl.py +2001 -0
- wx/lib/masked/textctrl.py +465 -0
- wx/lib/masked/timectrl.py +1466 -0
- wx/lib/mixins/__init__.py +17 -0
- wx/lib/mixins/grid.py +47 -0
- wx/lib/mixins/gridlabelrenderer.py +251 -0
- wx/lib/mixins/imagelist.py +77 -0
- wx/lib/mixins/inspection.py +184 -0
- wx/lib/mixins/listctrl.py +894 -0
- wx/lib/mixins/rubberband.py +404 -0
- wx/lib/mixins/treemixin.py +678 -0
- wx/lib/msgpanel.py +95 -0
- wx/lib/multisash.py +747 -0
- wx/lib/myole4ax.idl +178 -0
- wx/lib/myole4ax.tlb +0 -0
- wx/lib/newevent.py +229 -0
- wx/lib/nvdlg.py +156 -0
- wx/lib/ogl/__init__.py +13 -0
- wx/lib/ogl/basic.py +3991 -0
- wx/lib/ogl/bmpshape.py +87 -0
- wx/lib/ogl/canvas.py +467 -0
- wx/lib/ogl/composit.py +1577 -0
- wx/lib/ogl/diagram.py +230 -0
- wx/lib/ogl/divided.py +483 -0
- wx/lib/ogl/drawn.py +900 -0
- wx/lib/ogl/lines.py +1811 -0
- wx/lib/ogl/oglmisc.py +608 -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 +279 -0
- wx/lib/pdfviewer/images.py +240 -0
- wx/lib/pdfviewer/viewer.py +1077 -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 +1009 -0
- wx/lib/plot/examples/simple_example.py +54 -0
- wx/lib/plot/plotcanvas.py +2981 -0
- wx/lib/plot/polyobjects.py +1525 -0
- wx/lib/plot/utils.py +327 -0
- wx/lib/popupctl.py +250 -0
- wx/lib/printout.py +1157 -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 +191 -0
- wx/lib/pubsub/core/imp2.py +63 -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 +217 -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 +191 -0
- wx/lib/pubsub/core/topicargspec.py +77 -0
- wx/lib/pubsub/core/topicdefnprovider.py +632 -0
- wx/lib/pubsub/core/topicexc.py +72 -0
- wx/lib/pubsub/core/topicmgr.py +456 -0
- wx/lib/pubsub/core/topicobj.py +472 -0
- wx/lib/pubsub/core/topictreetraverser.py +143 -0
- wx/lib/pubsub/core/topicutils.py +118 -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/py2and3.py +608 -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 +100 -0
- wx/lib/pubsub/utils/notification.py +331 -0
- wx/lib/pubsub/utils/topictreeprinter.py +195 -0
- wx/lib/pubsub/utils/xmltopicdefnprovider.py +287 -0
- wx/lib/pydocview.py +3300 -0
- wx/lib/rcsizer.py +229 -0
- wx/lib/resizewidget.py +357 -0
- wx/lib/scrolledpanel.py +225 -0
- wx/lib/sheet.py +350 -0
- wx/lib/sized_controls.py +691 -0
- wx/lib/softwareupdate.py +361 -0
- wx/lib/splitter.py +925 -0
- wx/lib/statbmp.py +199 -0
- wx/lib/stattext.py +322 -0
- wx/lib/throbber.py +425 -0
- wx/lib/ticker.py +295 -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 +124 -0
- wx/lib/wxcairo/wx_cairocffi.py +200 -0
- wx/lib/wxcairo/wx_pycairo.py +463 -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/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/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 +27 -0
- wx/media.pyi +223 -0
- wx/msw.py +13 -0
- wx/msw.pyi +65 -0
- wx/propgrid.py +1451 -0
- wx/propgrid.pyi +7914 -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 +299 -0
- wx/py/filling.py +357 -0
- wx/py/frame.py +978 -0
- wx/py/images.py +212 -0
- wx/py/interpreter.py +170 -0
- wx/py/introspect.py +393 -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 +1588 -0
- wx/py/sliceshell.py +3814 -0
- wx/py/tests/test_interpreter.py +71 -0
- wx/py/tests/test_introspect.py +862 -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/ribbon.py +45 -0
- wx/ribbon.pyi +2494 -0
- wx/richtext.py +142 -0
- wx/richtext.pyi +12113 -0
- wx/siplib.cp313-win_amd64.pyd +0 -0
- wx/stc.py +58 -0
- wx/stc.pyi +8463 -0
- wx/svg/__init__.py +364 -0
- wx/svg/_nanosvg.cp313-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 +309 -0
- wx/tools/img2xpm.py +54 -0
- wx/tools/pywxrc.py +949 -0
- wx/tools/wxget.py +254 -0
- wx/tools/wxget_docs_demo.py +186 -0
- wx/wxbase315u_net_vc140_x64.dll +0 -0
- wx/wxbase315u_vc140_x64.dll +0 -0
- wx/wxbase315u_xml_vc140_x64.dll +0 -0
- wx/wxmsw315u_adv_vc140_x64.dll +0 -0
- wx/wxmsw315u_aui_vc140_x64.dll +0 -0
- wx/wxmsw315u_core_vc140_x64.dll +0 -0
- wx/wxmsw315u_gl_vc140_x64.dll +0 -0
- wx/wxmsw315u_html_vc140_x64.dll +0 -0
- wx/wxmsw315u_media_vc140_x64.dll +0 -0
- wx/wxmsw315u_propgrid_vc140_x64.dll +0 -0
- wx/wxmsw315u_qa_vc140_x64.dll +0 -0
- wx/wxmsw315u_ribbon_vc140_x64.dll +0 -0
- wx/wxmsw315u_richtext_vc140_x64.dll +0 -0
- wx/wxmsw315u_stc_vc140_x64.dll +0 -0
- wx/wxmsw315u_webview_vc140_x64.dll +0 -0
- wx/wxmsw315u_xrc_vc140_x64.dll +0 -0
- wx/xml.py +15 -0
- wx/xml.pyi +575 -0
- wx/xrc.py +65 -0
- wx/xrc.pyi +742 -0
- wxPython_zombie-3.1.5.8.dist-info/LICENSE.txt +950 -0
- wxPython_zombie-3.1.5.8.dist-info/METADATA +107 -0
- wxPython_zombie-3.1.5.8.dist-info/RECORD +1175 -0
- wxPython_zombie-3.1.5.8.dist-info/WHEEL +5 -0
- wxPython_zombie-3.1.5.8.dist-info/entry_points.txt +2 -0
- wxPython_zombie-3.1.5.8.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"""
|
|
2
|
+
|
|
3
|
+
:copyright: Copyright since 2006 by Oliver Schoenborn, all rights reserved.
|
|
4
|
+
:license: BSD, see LICENSE_BSD_Simple.txt for details.
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import weakref
|
|
9
|
+
|
|
10
|
+
from .topicutils import (stringize, WeakNone)
|
|
11
|
+
from .validatedefnargs import verifySubset
|
|
12
|
+
from .. import py2and3
|
|
13
|
+
|
|
14
|
+
### Exceptions raised during check() from sendMessage()
|
|
15
|
+
|
|
16
|
+
class SenderMissingReqdMsgDataError(RuntimeError):
|
|
17
|
+
"""
|
|
18
|
+
Raised when a sendMessage() is missing arguments tagged as
|
|
19
|
+
'required' by pubsub topic of message.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, topicName, argNames, missing):
|
|
23
|
+
argsStr = ','.join(argNames)
|
|
24
|
+
missStr = ','.join(missing)
|
|
25
|
+
msg = "Some required args missing in call to sendMessage('%s', %s): %s" \
|
|
26
|
+
% (stringize(topicName), argsStr, missStr)
|
|
27
|
+
RuntimeError.__init__(self, msg)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class SenderUnknownMsgDataError(RuntimeError):
|
|
31
|
+
"""
|
|
32
|
+
Raised when a sendMessage() has arguments not listed among the topic's
|
|
33
|
+
message data specification (MDS).
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, topicName, argNames, extra):
|
|
37
|
+
argsStr = ','.join(argNames)
|
|
38
|
+
extraStr = ','.join(extra)
|
|
39
|
+
msg = "Some optional args unknown in call to sendMessage('%s', %s): %s" \
|
|
40
|
+
% (topicName, argsStr, extraStr)
|
|
41
|
+
RuntimeError.__init__(self, msg)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ArgsInfo:
|
|
45
|
+
"""
|
|
46
|
+
Encode the Message Data Specification (MDS) for a given
|
|
47
|
+
topic. ArgsInfos form a tree identical to that of Topics in that
|
|
48
|
+
ArgInfos have a reference to their parent and children ArgInfos,
|
|
49
|
+
created for the parent and children topics.
|
|
50
|
+
|
|
51
|
+
The only difference
|
|
52
|
+
between an ArgsInfo and an ArgSpecGiven is that the latter is
|
|
53
|
+
what "user thinks is ok" whereas former has been validated:
|
|
54
|
+
the specification for this topic is a strict superset of the
|
|
55
|
+
specification of its parent, and a strict subset of the
|
|
56
|
+
specification of each of its children. Also, the instance
|
|
57
|
+
can be used to check validity and filter arguments.
|
|
58
|
+
|
|
59
|
+
The MDS can be created "empty", ie "incomplete", meaning it cannot
|
|
60
|
+
yet be used to validate listener subscriptions to topics.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
SPEC_MISSING = 10 # no args given
|
|
64
|
+
SPEC_COMPLETE = 12 # all args, but not confirmed via user spec
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def __init__(self, topicNameTuple, specGiven, parentArgsInfo):
|
|
68
|
+
self.topicNameTuple = topicNameTuple
|
|
69
|
+
self.allOptional = () # topic message optional arg names
|
|
70
|
+
self.allDocs = {} # doc for each arg
|
|
71
|
+
self.allRequired = () # topic message required arg names
|
|
72
|
+
self.argsSpecType = self.SPEC_MISSING
|
|
73
|
+
self.parentAI = WeakNone()
|
|
74
|
+
if parentArgsInfo is not None:
|
|
75
|
+
self.parentAI = weakref.ref(parentArgsInfo)
|
|
76
|
+
parentArgsInfo.__addChildAI(self)
|
|
77
|
+
self.childrenAI = []
|
|
78
|
+
|
|
79
|
+
if specGiven.isComplete():
|
|
80
|
+
self.__setAllArgs(specGiven)
|
|
81
|
+
|
|
82
|
+
def isComplete(self):
|
|
83
|
+
return self.argsSpecType == self.SPEC_COMPLETE
|
|
84
|
+
|
|
85
|
+
def getArgs(self):
|
|
86
|
+
return self.allOptional + self.allRequired
|
|
87
|
+
|
|
88
|
+
def numArgs(self):
|
|
89
|
+
return len(self.allOptional) + len(self.allRequired)
|
|
90
|
+
|
|
91
|
+
def getReqdArgs(self):
|
|
92
|
+
return self.allRequired
|
|
93
|
+
|
|
94
|
+
def getOptArgs(self):
|
|
95
|
+
return self.allOptional
|
|
96
|
+
|
|
97
|
+
def getArgsDocs(self):
|
|
98
|
+
return self.allDocs.copy()
|
|
99
|
+
|
|
100
|
+
def setArgsDocs(self, docs):
|
|
101
|
+
"""docs is a mapping from arg names to their documentation"""
|
|
102
|
+
if not self.isComplete():
|
|
103
|
+
raise
|
|
104
|
+
for arg, doc in py2and3.iteritems(docs):
|
|
105
|
+
self.allDocs[arg] = doc
|
|
106
|
+
|
|
107
|
+
def check(self, msgKwargs):
|
|
108
|
+
"""Check that the message arguments given satisfy the topic message
|
|
109
|
+
data specification (MDS). Raises SenderMissingReqdMsgDataError if some required
|
|
110
|
+
args are missing or not known, and raises SenderUnknownMsgDataError if some
|
|
111
|
+
optional args are unknown. """
|
|
112
|
+
all = set(msgKwargs)
|
|
113
|
+
# check that it has all required args
|
|
114
|
+
needReqd = set(self.allRequired)
|
|
115
|
+
hasReqd = (needReqd <= all)
|
|
116
|
+
if not hasReqd:
|
|
117
|
+
raise SenderMissingReqdMsgDataError(
|
|
118
|
+
self.topicNameTuple, py2and3.keys(msgKwargs), needReqd - all)
|
|
119
|
+
|
|
120
|
+
# check that all other args are among the optional spec
|
|
121
|
+
optional = all - needReqd
|
|
122
|
+
ok = (optional <= set(self.allOptional))
|
|
123
|
+
if not ok:
|
|
124
|
+
raise SenderUnknownMsgDataError( self.topicNameTuple,
|
|
125
|
+
py2and3.keys(msgKwargs), optional - set(self.allOptional) )
|
|
126
|
+
|
|
127
|
+
def filterArgs(self, msgKwargs):
|
|
128
|
+
"""Returns a dict which contains only those items of msgKwargs
|
|
129
|
+
which are defined for topic. E.g. if msgKwargs is {a:1, b:'b'}
|
|
130
|
+
and topic arg spec is ('a',) then return {a:1}. The returned dict
|
|
131
|
+
is valid only if check(msgKwargs) was called (or
|
|
132
|
+
check(superset of msgKwargs) was called)."""
|
|
133
|
+
assert self.isComplete()
|
|
134
|
+
if len(msgKwargs) == self.numArgs():
|
|
135
|
+
return msgKwargs
|
|
136
|
+
|
|
137
|
+
# only keep the keys from msgKwargs that are also in topic's kwargs
|
|
138
|
+
# method 1: SLOWEST
|
|
139
|
+
#newKwargs = dict( (k,msgKwargs[k]) for k in self.__msgArgs.allOptional if k in msgKwargs )
|
|
140
|
+
#newKwargs.update( (k,msgKwargs[k]) for k in self.__msgArgs.allRequired )
|
|
141
|
+
|
|
142
|
+
# method 2: FAST:
|
|
143
|
+
#argNames = self.__msgArgs.getArgs()
|
|
144
|
+
#newKwargs = dict( (key, val) for (key, val) in msgKwargs.iteritems() if key in argNames )
|
|
145
|
+
|
|
146
|
+
# method 3: FASTEST:
|
|
147
|
+
argNames = set(self.getArgs()).intersection(msgKwargs)
|
|
148
|
+
newKwargs = dict( (k,msgKwargs[k]) for k in argNames )
|
|
149
|
+
|
|
150
|
+
return newKwargs
|
|
151
|
+
|
|
152
|
+
def hasSameArgs(self, *argNames):
|
|
153
|
+
"""Returns true if self has all the message arguments given, no
|
|
154
|
+
more and no less. Order does not matter. So if getArgs()
|
|
155
|
+
returns ('arg1', 'arg2') then self.hasSameArgs('arg2', 'arg1')
|
|
156
|
+
will return true. """
|
|
157
|
+
return set(argNames) == set( self.getArgs() )
|
|
158
|
+
|
|
159
|
+
def hasParent(self, argsInfo):
|
|
160
|
+
"""return True if self has argsInfo object as parent"""
|
|
161
|
+
return self.parentAI() is argsInfo
|
|
162
|
+
|
|
163
|
+
def getCompleteAI(self):
|
|
164
|
+
"""Get the closest arg spec, starting from self and moving to parent,
|
|
165
|
+
that is complete. So if self.isComplete() is True, then returns self,
|
|
166
|
+
otherwise returns parent (if parent.isComplete()), etc. """
|
|
167
|
+
AI = self
|
|
168
|
+
while AI is not None:
|
|
169
|
+
if AI.isComplete():
|
|
170
|
+
return AI
|
|
171
|
+
AI = AI.parentAI() # dereference weakref
|
|
172
|
+
return None
|
|
173
|
+
|
|
174
|
+
def updateAllArgsFinal(self, topicDefn):
|
|
175
|
+
"""This can only be called once, if the construction was done
|
|
176
|
+
with ArgSpecGiven.SPEC_GIVEN_NONE"""
|
|
177
|
+
assert not self.isComplete()
|
|
178
|
+
assert topicDefn.isComplete()
|
|
179
|
+
self.__setAllArgs(topicDefn)
|
|
180
|
+
|
|
181
|
+
def __addChildAI(self, childAI):
|
|
182
|
+
assert childAI not in self.childrenAI
|
|
183
|
+
self.childrenAI.append(childAI)
|
|
184
|
+
|
|
185
|
+
def __notifyParentCompleted(self):
|
|
186
|
+
"""Parent should call this when parent ArgsInfo has been completed"""
|
|
187
|
+
assert self.parentAI().isComplete()
|
|
188
|
+
if self.isComplete():
|
|
189
|
+
# verify that our spec is compatible with parent's
|
|
190
|
+
self.__validateArgsToParent()
|
|
191
|
+
return
|
|
192
|
+
|
|
193
|
+
def __validateArgsToParent(self):
|
|
194
|
+
# validate relative to parent arg spec
|
|
195
|
+
closestParentAI = self.parentAI().getCompleteAI()
|
|
196
|
+
if closestParentAI is not None:
|
|
197
|
+
# verify that parent args is a subset of spec given:
|
|
198
|
+
topicName = stringize(self.topicNameTuple)
|
|
199
|
+
verifySubset(self.getArgs(), closestParentAI.getArgs(), topicName)
|
|
200
|
+
verifySubset(self.allRequired, closestParentAI.getReqdArgs(),
|
|
201
|
+
topicName, ' required args')
|
|
202
|
+
|
|
203
|
+
def __setAllArgs(self, specGiven):
|
|
204
|
+
assert specGiven.isComplete()
|
|
205
|
+
self.allOptional = tuple( specGiven.getOptional() )
|
|
206
|
+
self.allRequired = specGiven.reqdArgs
|
|
207
|
+
self.allDocs = specGiven.argsDocs.copy() # doc for each arg
|
|
208
|
+
self.argsSpecType= self.SPEC_COMPLETE
|
|
209
|
+
|
|
210
|
+
if self.parentAI() is not None:
|
|
211
|
+
self.__validateArgsToParent()
|
|
212
|
+
|
|
213
|
+
# notify our children
|
|
214
|
+
for childAI in self.childrenAI:
|
|
215
|
+
childAI.__notifyParentCompleted()
|
|
216
|
+
|
|
217
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""
|
|
2
|
+
|
|
3
|
+
:copyright: Copyright since 2006 by Oliver Schoenborn, all rights reserved.
|
|
4
|
+
:license: BSD, see LICENSE_BSD_Simple.txt for details.
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
def getRootTopicSpec():
|
|
9
|
+
"""If using kwargs protocol, then root topic takes no args."""
|
|
10
|
+
argsDocs = {}
|
|
11
|
+
reqdArgs = ()
|
|
12
|
+
return argsDocs, reqdArgs
|
|
13
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Top-level functionality related to message listeners.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
:copyright: Copyright since 2006 by Oliver Schoenborn, all rights reserved.
|
|
7
|
+
:license: BSD, see LICENSE_BSD_Simple.txt for details.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from .callables import (
|
|
11
|
+
getID,
|
|
12
|
+
getArgs,
|
|
13
|
+
getRawFunction,
|
|
14
|
+
ListenerMismatchError,
|
|
15
|
+
CallArgsInfo
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
from .listenerimpl import (
|
|
19
|
+
Listener,
|
|
20
|
+
ListenerValidator
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
class IListenerExcHandler:
|
|
24
|
+
"""
|
|
25
|
+
Interface class base class for any handler given to pub.setListenerExcHandler()
|
|
26
|
+
Such handler is called whenever a listener raises an exception during a
|
|
27
|
+
pub.sendMessage(). Example::
|
|
28
|
+
|
|
29
|
+
from pubsub import pub
|
|
30
|
+
|
|
31
|
+
class MyHandler(pub.IListenerExcHandler):
|
|
32
|
+
def __call__(self, listenerID, topicObj):
|
|
33
|
+
... do something with listenerID ...
|
|
34
|
+
|
|
35
|
+
pub.setListenerExcHandler(MyHandler())
|
|
36
|
+
"""
|
|
37
|
+
def __call__(self, listenerID, topicObj):
|
|
38
|
+
raise NotImplementedError('%s must override __call__()' % self.__class__)
|
|
39
|
+
|
|
40
|
+
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""
|
|
2
|
+
:copyright: Copyright since 2006 by Oliver Schoenborn, all rights reserved.
|
|
3
|
+
:license: BSD, see LICENSE_BSD_Simple.txt for details.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from . import weakmethod
|
|
7
|
+
|
|
8
|
+
from .callables import (
|
|
9
|
+
getID,
|
|
10
|
+
getArgs,
|
|
11
|
+
ListenerMismatchError,
|
|
12
|
+
CallArgsInfo,
|
|
13
|
+
AUTO_TOPIC as _AUTO_ARG
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ListenerBase:
|
|
18
|
+
"""
|
|
19
|
+
Base class for listeners, ie. callables subscribed to pubsub.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
AUTO_TOPIC = _AUTO_ARG
|
|
23
|
+
|
|
24
|
+
def __init__(self, callable_, argsInfo, onDead=None):
|
|
25
|
+
"""Use callable_ as a listener of topicName. The argsInfo is the
|
|
26
|
+
return value from a Validator, ie an instance of callables.CallArgsInfo.
|
|
27
|
+
If given, the onDead will be called with self as parameter, if/when
|
|
28
|
+
callable_ gets garbage collected (callable_ is held only by weak
|
|
29
|
+
reference). """
|
|
30
|
+
# set call policies
|
|
31
|
+
self.acceptsAllKwargs = argsInfo.acceptsAllKwargs
|
|
32
|
+
|
|
33
|
+
self._autoTopicArgName = argsInfo.autoTopicArgName
|
|
34
|
+
self._callable = weakmethod.getWeakRef(callable_, self.__notifyOnDead)
|
|
35
|
+
self.__onDead = onDead
|
|
36
|
+
|
|
37
|
+
# save identity now in case callable dies:
|
|
38
|
+
name, mod = getID(callable_) #
|
|
39
|
+
self.__nameID = name
|
|
40
|
+
self.__module = mod
|
|
41
|
+
self.__id = str(id(callable_))[-4:] # only last four digits of id
|
|
42
|
+
self.__hash = hash(callable_)
|
|
43
|
+
|
|
44
|
+
def __call__(self, args, kwargs, actualTopic, allArgs=None):
|
|
45
|
+
raise NotImplementedError
|
|
46
|
+
|
|
47
|
+
def name(self):
|
|
48
|
+
"""Return a human readable name for listener, based on the
|
|
49
|
+
listener's type name and its id (as obtained from id(listener)). If
|
|
50
|
+
caller just needs name based on type info, specify instance=False.
|
|
51
|
+
Note that the listener's id() was saved at construction time (since
|
|
52
|
+
it may get garbage collected at any time) so the return value of
|
|
53
|
+
name() is not necessarily unique if the callable has died (because
|
|
54
|
+
id's can be re-used after garbage collection)."""
|
|
55
|
+
return '%s_%s' % (self.__nameID, self.__id)
|
|
56
|
+
|
|
57
|
+
def typeName(self):
|
|
58
|
+
"""Get a type name for the listener. This is a class name or
|
|
59
|
+
function name, as appropriate. """
|
|
60
|
+
return self.__nameID
|
|
61
|
+
|
|
62
|
+
def module(self):
|
|
63
|
+
"""Get the module in which the callable was defined."""
|
|
64
|
+
return self.__module
|
|
65
|
+
|
|
66
|
+
def getCallable(self):
|
|
67
|
+
"""Get the listener that was given at initialization. Note that
|
|
68
|
+
this could be None if it has been garbage collected (e.g. if it was
|
|
69
|
+
created as a wrapper of some other callable, and not stored
|
|
70
|
+
locally)."""
|
|
71
|
+
return self._callable()
|
|
72
|
+
|
|
73
|
+
def isDead(self):
|
|
74
|
+
"""Return True if this listener died (has been garbage collected)"""
|
|
75
|
+
return self._callable() is None
|
|
76
|
+
|
|
77
|
+
def wantsTopicObjOnCall(self):
|
|
78
|
+
"""True if this listener wants topic object: it has a arg=pub.AUTO_TOPIC"""
|
|
79
|
+
return self._autoTopicArgName is not None
|
|
80
|
+
|
|
81
|
+
def wantsAllMessageData(self):
|
|
82
|
+
"""True if this listener wants all message data: it has a \**kwargs argument"""
|
|
83
|
+
return self.acceptsAllKwargs
|
|
84
|
+
|
|
85
|
+
def _unlinkFromTopic_(self):
|
|
86
|
+
"""Tell self that it is no longer used by a Topic. This allows
|
|
87
|
+
to break some cyclical references."""
|
|
88
|
+
self.__onDead = None
|
|
89
|
+
|
|
90
|
+
def _calledWhenDead(self):
|
|
91
|
+
raise RuntimeError('BUG: Dead Listener called, still subscribed!')
|
|
92
|
+
|
|
93
|
+
def __notifyOnDead(self, ref):
|
|
94
|
+
"""This gets called when listener weak ref has died. Propagate
|
|
95
|
+
info to Topic)."""
|
|
96
|
+
notifyDeath = self.__onDead
|
|
97
|
+
self._unlinkFromTopic_()
|
|
98
|
+
if notifyDeath is not None:
|
|
99
|
+
notifyDeath(self)
|
|
100
|
+
|
|
101
|
+
def __eq__(self, rhs):
|
|
102
|
+
"""Compare for equality to rhs. This returns true if rhs has our id id(rhs) is
|
|
103
|
+
same as id(self) or id(callable in self). """
|
|
104
|
+
if id(self) == id(rhs):
|
|
105
|
+
return True
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
c1 = self._callable()
|
|
109
|
+
c2 = rhs._callable()
|
|
110
|
+
|
|
111
|
+
except Exception:
|
|
112
|
+
# then rhs is not a Listener, compare with c1
|
|
113
|
+
return c1 == rhs
|
|
114
|
+
|
|
115
|
+
# both side of == are Listener, but always compare unequal if both dead
|
|
116
|
+
if c2 is None and c1 is None:
|
|
117
|
+
return False
|
|
118
|
+
|
|
119
|
+
return c1 == c2
|
|
120
|
+
|
|
121
|
+
def __ne__(self, rhs):
|
|
122
|
+
"""Counterpart to __eq__ MUST be defined... equivalent to
|
|
123
|
+
'not (self == rhs)'."""
|
|
124
|
+
return not self.__eq__(rhs)
|
|
125
|
+
|
|
126
|
+
def __hash__(self):
|
|
127
|
+
"""Hash is an optimization for dict/set searches, it need not
|
|
128
|
+
return different numbers for every different object. """
|
|
129
|
+
return self.__hash
|
|
130
|
+
|
|
131
|
+
def __str__(self):
|
|
132
|
+
"""String rep is the callable"""
|
|
133
|
+
return self.__nameID
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
class ValidatorBase:
|
|
137
|
+
"""
|
|
138
|
+
Validates listeners. It checks whether the listener given to
|
|
139
|
+
validate() method complies with required and optional arguments
|
|
140
|
+
specified for topic.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
def __init__(self, topicArgs, topicKwargs):
|
|
144
|
+
"""topicArgs is a list of argument names that will be required when sending
|
|
145
|
+
a message to listener. Hence order of items in topicArgs matters. The topicKwargs
|
|
146
|
+
is a list of argument names that will be optional, ie given as keyword arguments
|
|
147
|
+
when sending a message to listener. The list is unordered. """
|
|
148
|
+
self._topicArgs = set(topicArgs)
|
|
149
|
+
self._topicKwargs = set(topicKwargs)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def validate(self, listener):
|
|
153
|
+
"""Validate that listener satisfies the requirements of
|
|
154
|
+
being a topic listener, if topic's kwargs keys are topicKwargKeys
|
|
155
|
+
(so only the list of keyword arg names for topic are necessary).
|
|
156
|
+
Raises ListenerMismatchError if listener not usable for topic.
|
|
157
|
+
|
|
158
|
+
Otherwise, returns an CallArgsInfo object containing information about
|
|
159
|
+
the listener's call arguments, such as whether listener wants topic
|
|
160
|
+
name (signified by a kwarg value = AUTO_TOPIC in listener protocol).
|
|
161
|
+
E.g. def fn1(msgTopic=Listener.AUTO_TOPIC) would
|
|
162
|
+
cause validate(fn1) to return True, whereas any other kwarg name or value
|
|
163
|
+
would cause a False to be returned.
|
|
164
|
+
"""
|
|
165
|
+
paramsInfo = getArgs( listener )
|
|
166
|
+
self._validateArgs(listener, paramsInfo)
|
|
167
|
+
return paramsInfo
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def isValid(self, listener):
|
|
171
|
+
"""Return true only if listener can subscribe to messages where
|
|
172
|
+
topic has kwargs keys topicKwargKeys. Just calls validate() in
|
|
173
|
+
a try-except clause."""
|
|
174
|
+
try:
|
|
175
|
+
self.validate(listener)
|
|
176
|
+
return True
|
|
177
|
+
except ListenerMismatchError:
|
|
178
|
+
return False
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _validateArgs(self, listener, paramsInfo):
|
|
182
|
+
"""Provide implementation in derived classes"""
|
|
183
|
+
raise NotImplementedError
|
|
184
|
+
|
|
185
|
+
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""
|
|
2
|
+
:copyright: Copyright since 2006 by Oliver Schoenborn, all rights reserved.
|
|
3
|
+
:license: BSD, see LICENSE_BSD_Simple.txt for details.
|
|
4
|
+
"""
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
class NotificationMgr:
|
|
8
|
+
"""
|
|
9
|
+
Manages notifications for tracing pubsub activity. When pubsub takes a
|
|
10
|
+
certain action such as sending a message or creating a topic, and
|
|
11
|
+
the notification flag for that activity is True, all registered
|
|
12
|
+
notification handlers get corresponding method called with information
|
|
13
|
+
about the activity, such as which listener subscribed to which topic.
|
|
14
|
+
See INotificationHandler for which method gets called for each activity.
|
|
15
|
+
|
|
16
|
+
If more than one notification handler has been registered, the order in
|
|
17
|
+
which they are notified is unspecified (do not rely on it).
|
|
18
|
+
|
|
19
|
+
Note that this manager automatically unregisters all handlers when
|
|
20
|
+
the Python interpreter exits, to help avoid NoneType exceptions during
|
|
21
|
+
shutdown. This "shutdown" starts when the last line of app "main" has
|
|
22
|
+
executed; the Python interpreter then starts cleaning up, garbage
|
|
23
|
+
collecting everything, which could lead to various pubsub notifications
|
|
24
|
+
-- by then they should be of no interest -- such as dead
|
|
25
|
+
listeners, etc.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, notificationHandler = None):
|
|
29
|
+
self.__notifyOnSend = False
|
|
30
|
+
self.__notifyOnSubscribe = False
|
|
31
|
+
self.__notifyOnUnsubscribe = False
|
|
32
|
+
|
|
33
|
+
self.__notifyOnNewTopic = False
|
|
34
|
+
self.__notifyOnDelTopic = False
|
|
35
|
+
self.__notifyOnDeadListener = False
|
|
36
|
+
|
|
37
|
+
self.__handlers = []
|
|
38
|
+
if notificationHandler is not None:
|
|
39
|
+
self.addHandler(notificationHandler)
|
|
40
|
+
|
|
41
|
+
self.__atExitRegistered = False
|
|
42
|
+
|
|
43
|
+
def addHandler(self, handler):
|
|
44
|
+
if not self.__atExitRegistered:
|
|
45
|
+
self.__registerForAppExit()
|
|
46
|
+
self.__handlers.append(handler)
|
|
47
|
+
|
|
48
|
+
def getHandlers(self):
|
|
49
|
+
return self.__handlers[:]
|
|
50
|
+
|
|
51
|
+
def clearHandlers(self):
|
|
52
|
+
self.__handlers = []
|
|
53
|
+
|
|
54
|
+
def notifySubscribe(self, *args, **kwargs):
|
|
55
|
+
if self.__notifyOnSubscribe and self.__handlers:
|
|
56
|
+
for handler in self.__handlers:
|
|
57
|
+
handler.notifySubscribe(*args, **kwargs)
|
|
58
|
+
|
|
59
|
+
def notifyUnsubscribe(self, *args, **kwargs):
|
|
60
|
+
if self.__notifyOnUnsubscribe and self.__handlers:
|
|
61
|
+
for handler in self.__handlers:
|
|
62
|
+
handler.notifyUnsubscribe(*args, **kwargs)
|
|
63
|
+
|
|
64
|
+
def notifySend(self, *args, **kwargs):
|
|
65
|
+
if self.__notifyOnSend and self.__handlers:
|
|
66
|
+
for handler in self.__handlers:
|
|
67
|
+
handler.notifySend(*args, **kwargs)
|
|
68
|
+
|
|
69
|
+
def notifyNewTopic(self, *args, **kwargs):
|
|
70
|
+
if self.__notifyOnNewTopic and self.__handlers:
|
|
71
|
+
for handler in self.__handlers:
|
|
72
|
+
handler.notifyNewTopic(*args, **kwargs)
|
|
73
|
+
|
|
74
|
+
def notifyDelTopic(self, *args, **kwargs):
|
|
75
|
+
if self.__notifyOnDelTopic and self.__handlers:
|
|
76
|
+
for handler in self.__handlers:
|
|
77
|
+
handler.notifyDelTopic(*args, **kwargs)
|
|
78
|
+
|
|
79
|
+
def notifyDeadListener(self, *args, **kwargs):
|
|
80
|
+
if self.__notifyOnDeadListener and self.__handlers:
|
|
81
|
+
for handler in self.__handlers:
|
|
82
|
+
handler.notifyDeadListener(*args, **kwargs)
|
|
83
|
+
|
|
84
|
+
def getFlagStates(self):
|
|
85
|
+
"""Return state of each notification flag, as a dict."""
|
|
86
|
+
return dict(
|
|
87
|
+
subscribe = self.__notifyOnSubscribe,
|
|
88
|
+
unsubscribe = self.__notifyOnUnsubscribe,
|
|
89
|
+
deadListener = self.__notifyOnDeadListener,
|
|
90
|
+
sendMessage = self.__notifyOnSend,
|
|
91
|
+
newTopic = self.__notifyOnNewTopic,
|
|
92
|
+
delTopic = self.__notifyOnDelTopic,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
def setFlagStates(self, subscribe=None, unsubscribe=None,
|
|
96
|
+
deadListener=None, sendMessage=None, newTopic=None,
|
|
97
|
+
delTopic=None, all=None):
|
|
98
|
+
"""Set the notification flag on/off for various aspects of pubsub.
|
|
99
|
+
The kwargs that are None are left at their current value. The 'all',
|
|
100
|
+
if not None, is set first. E.g.
|
|
101
|
+
|
|
102
|
+
mgr.setFlagStates(all=True, delTopic=False)
|
|
103
|
+
|
|
104
|
+
will toggle all notifications on, but will turn off the 'delTopic'
|
|
105
|
+
notification.
|
|
106
|
+
"""
|
|
107
|
+
if all is not None:
|
|
108
|
+
# ignore all other arg settings, and set all of them to true:
|
|
109
|
+
numArgs = 7 # how many args in this method
|
|
110
|
+
self.setFlagStates( all=None, * ((numArgs-1)*[all]) )
|
|
111
|
+
|
|
112
|
+
if sendMessage is not None:
|
|
113
|
+
self.__notifyOnSend = sendMessage
|
|
114
|
+
if subscribe is not None:
|
|
115
|
+
self.__notifyOnSubscribe = subscribe
|
|
116
|
+
if unsubscribe is not None:
|
|
117
|
+
self.__notifyOnUnsubscribe = unsubscribe
|
|
118
|
+
|
|
119
|
+
if newTopic is not None:
|
|
120
|
+
self.__notifyOnNewTopic = newTopic
|
|
121
|
+
if delTopic is not None:
|
|
122
|
+
self.__notifyOnDelTopic = delTopic
|
|
123
|
+
if deadListener is not None:
|
|
124
|
+
self.__notifyOnDeadListener = deadListener
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def __registerForAppExit(self):
|
|
128
|
+
import atexit
|
|
129
|
+
atexit.register(self.clearHandlers)
|
|
130
|
+
self.__atExitRegistered = True
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class INotificationHandler:
|
|
135
|
+
"""
|
|
136
|
+
Defines the interface expected by pubsub for pubsub activity
|
|
137
|
+
notifications. Any instance that supports the same methods, or
|
|
138
|
+
derives from this class, will work as a notification handler
|
|
139
|
+
for pubsub events (see pub.addNotificationHandler).
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
def notifySubscribe(self, pubListener, topicObj, newSub):
|
|
143
|
+
"""Called when a listener is subscribed to a topic.
|
|
144
|
+
:param pubListener: the pubsub.core.Listener that wraps subscribed listener.
|
|
145
|
+
:param topicObj: the pubsub.core.Topic object subscribed to.
|
|
146
|
+
:param newSub: false if pubListener was already subscribed. """
|
|
147
|
+
raise NotImplementedError
|
|
148
|
+
|
|
149
|
+
def notifyUnsubscribe(self, pubListener, topicObj):
|
|
150
|
+
"""Called when a listener is unsubscribed from given topic.
|
|
151
|
+
:param pubListener: the pubsub.core.Listener that wraps unsubscribed listener.
|
|
152
|
+
:param topicObj: the pubsub.core.Topic object unsubscribed from."""
|
|
153
|
+
raise NotImplementedError
|
|
154
|
+
|
|
155
|
+
def notifyDeadListener(self, pubListener, topicObj):
|
|
156
|
+
"""Called when a listener has been garbage collected.
|
|
157
|
+
:param pubListener: the pubsub.core.Listener that wraps GC'd listener.
|
|
158
|
+
:param topicObj: the pubsub.core.Topic object it was subscribed to."""
|
|
159
|
+
raise NotImplementedError
|
|
160
|
+
|
|
161
|
+
def notifySend(self, stage, topicObj, pubListener=None):
|
|
162
|
+
"""Called multiple times during a sendMessage: once before message
|
|
163
|
+
sending has started (pre), once for each listener about to be sent the
|
|
164
|
+
message, and once after all listeners have received the message (post).
|
|
165
|
+
:param stage: 'pre', 'post', or 'loop'.
|
|
166
|
+
:param topicObj: the Topic object for the message.
|
|
167
|
+
:param pubListener: None for pre and post stages; for loop, the listener
|
|
168
|
+
that is about to be sent the message."""
|
|
169
|
+
raise NotImplementedError
|
|
170
|
+
|
|
171
|
+
def notifyNewTopic(self, topicObj, description, required, argsDocs):
|
|
172
|
+
"""Called whenever a new topic is added to the topic tree.
|
|
173
|
+
:param topicObj: the Topic object for the message.
|
|
174
|
+
:param description: docstring for the topic.
|
|
175
|
+
:param required: list of message data names (keys in argsDocs) that are required.
|
|
176
|
+
:param argsDocs: dictionary of all message data names, with the
|
|
177
|
+
corresponding docstring. """
|
|
178
|
+
raise NotImplementedError
|
|
179
|
+
|
|
180
|
+
def notifyDelTopic(self, topicName):
|
|
181
|
+
"""Called whenever a topic is removed from topic tree.
|
|
182
|
+
:param topicName: name of topic removed."""
|
|
183
|
+
raise NotImplementedError
|
|
184
|
+
|
|
185
|
+
|