From fddf19064b3260b3001a54e91a32bddff9f8a51b Mon Sep 17 00:00:00 2001 From: Pete Jemian Date: Tue, 18 Feb 2020 14:49:35 -0600 Subject: [PATCH] initial, as-is --- LICENSE | 65 ++ MANIFEST.in | 9 + Makefile | 60 + README.md | 23 + example.html | 296 +++++ examples/USAXS_XY.xml | 90 ++ examples/standard-paddle.txt | 32 + examples/test-settings.xml | 144 +++ examples/wxmtxy_settings.xsl | 134 +++ graphics/back.bmp | Bin 0 -> 2814 bytes graphics/buttons.vsd | Bin 0 -> 41984 bytes graphics/delete.bmp | Bin 0 -> 774 bytes graphics/epicslogo101.bmp | Bin 0 -> 7806 bytes graphics/epicslogo101.gif | Bin 0 -> 1000 bytes graphics/fig1.png | Bin 0 -> 21631 bytes graphics/fig10.png | Bin 0 -> 26598 bytes graphics/fig11.png | Bin 0 -> 27487 bytes graphics/fig12.png | Bin 0 -> 35806 bytes graphics/fig13.png | Bin 0 -> 30420 bytes graphics/fig14.png | Bin 0 -> 69044 bytes graphics/fig15.png | Bin 0 -> 19320 bytes graphics/fig16.png | Bin 0 -> 18137 bytes graphics/fig17.png | Bin 0 -> 16199 bytes graphics/fig18.png | Bin 0 -> 19912 bytes graphics/fig2.png | Bin 0 -> 25692 bytes graphics/fig3.png | Bin 0 -> 28174 bytes graphics/fig4.png | Bin 0 -> 22788 bytes graphics/fig5.png | Bin 0 -> 9303 bytes graphics/fig6.png | Bin 0 -> 5757 bytes graphics/fig7.png | Bin 0 -> 14241 bytes graphics/fig8.png | Bin 0 -> 19789 bytes graphics/fig9.png | Bin 0 -> 25209 bytes graphics/forward.bmp | Bin 0 -> 2814 bytes graphics/go.bmp | Bin 0 -> 774 bytes graphics/home.bmp | Bin 0 -> 2814 bytes graphics/logo.png | Bin 0 -> 902 bytes graphics/refresh.bmp | Bin 0 -> 2814 bytes graphics/set.bmp | Bin 0 -> 774 bytes index.html | 402 +++++++ menuLauncher.py | 149 +++ pvConnect.py | 348 ++++++ pydoc/menuLauncher.html | 1885 +++++++++++++++++++++++++++++++ pydoc/pvConnect.html | 215 ++++ pydoc/setup.html | 51 + pydoc/wxmtxy.html | 490 ++++++++ pydoc/wxmtxy_axis.html | 69 ++ pydoc/wxmtxy_htmlview.html | 1900 +++++++++++++++++++++++++++++++ pydoc/wxmtxy_pair.html | 1831 ++++++++++++++++++++++++++++++ pydoc/wxmtxy_pvsetup.html | 1967 +++++++++++++++++++++++++++++++++ pydoc/wxmtxy_root.html | 2024 ++++++++++++++++++++++++++++++++++ pydoc/wxmtxy_row.html | 1761 +++++++++++++++++++++++++++++ pydoc/wxmtxy_tab.html | 1899 +++++++++++++++++++++++++++++++ pydoc/wxmtxy_version.html | 44 + pydoc/wxmtxy_xml.html | 250 +++++ wxmtxy | 13 + wxmtxy.py | 117 ++ wxmtxy_axis.py | 205 ++++ wxmtxy_htmlview.py | 198 ++++ wxmtxy_motor_config.xml | 513 +++++++++ wxmtxy_pair.py | 448 ++++++++ wxmtxy_pvsetup.py | 519 +++++++++ wxmtxy_root.py | 821 ++++++++++++++ wxmtxy_row.py | 189 ++++ wxmtxy_tab.py | 120 ++ wxmtxy_version.py | 59 + wxmtxy_xml.py | 555 ++++++++++ 66 files changed, 19895 insertions(+) create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 Makefile create mode 100644 README.md create mode 100644 example.html create mode 100644 examples/USAXS_XY.xml create mode 100644 examples/standard-paddle.txt create mode 100644 examples/test-settings.xml create mode 100644 examples/wxmtxy_settings.xsl create mode 100644 graphics/back.bmp create mode 100644 graphics/buttons.vsd create mode 100644 graphics/delete.bmp create mode 100644 graphics/epicslogo101.bmp create mode 100644 graphics/epicslogo101.gif create mode 100644 graphics/fig1.png create mode 100644 graphics/fig10.png create mode 100644 graphics/fig11.png create mode 100644 graphics/fig12.png create mode 100644 graphics/fig13.png create mode 100644 graphics/fig14.png create mode 100644 graphics/fig15.png create mode 100644 graphics/fig16.png create mode 100644 graphics/fig17.png create mode 100644 graphics/fig18.png create mode 100644 graphics/fig2.png create mode 100644 graphics/fig3.png create mode 100644 graphics/fig4.png create mode 100644 graphics/fig5.png create mode 100644 graphics/fig6.png create mode 100644 graphics/fig7.png create mode 100644 graphics/fig8.png create mode 100644 graphics/fig9.png create mode 100644 graphics/forward.bmp create mode 100644 graphics/go.bmp create mode 100644 graphics/home.bmp create mode 100644 graphics/logo.png create mode 100644 graphics/refresh.bmp create mode 100644 graphics/set.bmp create mode 100644 index.html create mode 100755 menuLauncher.py create mode 100755 pvConnect.py create mode 100644 pydoc/menuLauncher.html create mode 100644 pydoc/pvConnect.html create mode 100644 pydoc/setup.html create mode 100644 pydoc/wxmtxy.html create mode 100644 pydoc/wxmtxy_axis.html create mode 100644 pydoc/wxmtxy_htmlview.html create mode 100644 pydoc/wxmtxy_pair.html create mode 100644 pydoc/wxmtxy_pvsetup.html create mode 100644 pydoc/wxmtxy_root.html create mode 100644 pydoc/wxmtxy_row.html create mode 100644 pydoc/wxmtxy_tab.html create mode 100644 pydoc/wxmtxy_version.html create mode 100644 pydoc/wxmtxy_xml.html create mode 100755 wxmtxy create mode 100755 wxmtxy.py create mode 100755 wxmtxy_axis.py create mode 100755 wxmtxy_htmlview.py create mode 100644 wxmtxy_motor_config.xml create mode 100755 wxmtxy_pair.py create mode 100755 wxmtxy_pvsetup.py create mode 100755 wxmtxy_root.py create mode 100755 wxmtxy_row.py create mode 100755 wxmtxy_tab.py create mode 100755 wxmtxy_version.py create mode 100755 wxmtxy_xml.py diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..425cd92 --- /dev/null +++ b/LICENSE @@ -0,0 +1,65 @@ +Copyright (c) 2009-2010 University of Chicago. All rights reserved. + +wxmtxy, pvConnect, and menuLauncher are distributed subject to the following license conditions: + + SOFTWARE LICENSE AGREEMENT + Software: wxmtxy, including pvConnect and menuLauncher + + 1. The "Software", below, refers to wxmtxy, pvConnect, + and menuLauncher (in either source code, or + binary form and accompanying documentation). Each licensee is + addressed as "you" or "Licensee." + + 2. The copyright holders shown above and their third-party licensors + hereby grant Licensee a royalty-free nonexclusive license, subject to + the limitations stated herein and U.S. Government license rights. + + 3. You may modify and make a copy or copies of the Software for use + within your organization, if you meet the following conditions: + a. Copies in source code must include the copyright notice and this + Software License Agreement. + b. Copies in binary form must include the copyright notice and this + Software License Agreement in the documentation and/or other + materials provided with the copy. + + 4. You may modify a copy or copies of the Software or any portion of it, + thus forming a work based on the Software, and distribute copies of + such work outside your organization, if you meet all of the following + conditions: + a. Copies in source code must include the copyright notice and this + Software License Agreement; + b. Copies in binary form must include the copyright notice and this + Software License Agreement in the documentation and/or other + materials provided with the copy; + c. Modified copies and works based on the Software must carry + prominent notices stating that you changed specified portions of + the Software. + + 5. Portions of the Software resulted from work developed under a U.S. + Government contract and are subject to the following license: the + Government is granted for itself and others acting on its behalf a + paid-up, nonexclusive, irrevocable worldwide license in this computer + software to reproduce, prepare derivative works, and perform publicly + and display publicly. + + 6. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS" WITHOUT WARRANTY + OF ANY KIND. THE COPYRIGHT HOLDERS, THEIR THIRD PARTY LICENSORS, THE + UNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND THEIR + EMPLOYEES: (1) DISCLAIM ANY WARRANTIES, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE, TITLE OR NON-INFRINGEMENT, (2) DO NOT ASSUME + ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, + OR USEFULNESS OF THE SOFTWARE, (3) DO NOT REPRESENT THAT USE OF THE + SOFTWARE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS, (4) DO NOT WARRANT + THAT THE SOFTWARE WILL FUNCTION UNINTERRUPTED, THAT IT IS ERROR-FREE + OR THAT ANY ERRORS WILL BE CORRECTED. + + 7. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT HOLDERS, THEIR + THIRD PARTY LICENSORS, THE UNITED STATES, THE UNITED STATES DEPARTMENT + OF ENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT, INCIDENTAL, + CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF ANY KIND OR NATURE, + INCLUDING BUT NOT LIMITED TO LOSS OF PROFITS OR LOSS OF DATA, FOR ANY + REASON WHATSOEVER, WHETHER SUCH LIABILITY IS ASSERTED ON THE BASIS OF + CONTRACT, TORT (INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR + OTHERWISE, EVEN IF ANY OF SAID PARTIES HAS BEEN WARNED OF THE + POSSIBILITY OF SUCH LOSS OR DAMAGES. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..1fa53b7 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,9 @@ +include LICENSE +include graphics/*.bmp +include graphics/*.gif +include graphics/*.png +include graphics/*.vsd +include examples/*.xml +include examples/*.xsl +include examples/*.txt +include *.html diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..72ef8a5 --- /dev/null +++ b/Makefile @@ -0,0 +1,60 @@ + +# Makefile +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/Makefile $ +# $Id: Makefile 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### + + +HOST := $(shell uname -n) +PYTHON := $(shell which python) +PYDOC := $(shell which pydoc) +ifeq ("$(HOST)", "como") + # como runs cygwin + # the python supplied with Cygwin does not have wx + # wx is a package installed in Enthought Python + PYTHON := /cygdrive/c/Python26/python.exe +endif +ifeq ("$(HOST)", "usaxscontrol.xor.aps.anl.gov") + # usaxscontrol.xor.aps.anl.gov needs APSshare version + PYTHON := /APSshare/bin/python + PYDOC := /APSshare/bin/pydoc +endif +ifeq ("$(HOST)", "gov.aps.anl.gov") + # gov.aps.anl.gov needs APSshare version + PYTHON := /APSshare/bin/python + PYDOC := /APSshare/bin/pydoc +endif + + +all :: sdist + +rebuild :: clean all + +clean :: + /bin/rm -rf build/ dist/ MANIFEST *.pyc + +sdist :: + $(PYTHON) ./setup.py sdist + +run :: + $(PYTHON) ./wxmtxy.py + +pydoc :: + $(PYDOC) -w ./ + /bin/mv -f wxmtxy*.html pydoc/ + /bin/mv -f pvConnect.html pydoc/ + /bin/mv -f setup.html pydoc/ + /bin/mv -f menuLauncher.html pydoc/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..766c7dd --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# README + + +*wxmtxy* (an EPICS GUI tool) provides support for an X,Y positioner +(motor) pair by allowing users to define a table of known positions +and providing a one-button click to drive a chosen X,Y pair to a specific +table setting. Also can record current position into a setting. + +Several sets of X,Y positioners can be configured. (Each set is +separate.) In fact, the positioners do not have to be motors, +but can be any type of EPICS PV that will accept a numeric value. + + +wxmtxy is based on wxPython and relies on CaChannel to communicate +with EPICS. + +In the Graphical User Interface (GUI), tooltips are provided for +most items. Moving and pausing the mouse over a widget (GUI +component such as a button or a label) will cause a terse description +of that widget to be displayed. Moving the mouse away will cause that +tooltip to disappear. + +For more help, explanations are provided in the HTML pages. diff --git a/example.html b/example.html new file mode 100644 index 0000000..1894730 --- /dev/null +++ b/example.html @@ -0,0 +1,296 @@ + + + + + + + wxmtxy: an example + + + + + + + + + + + +

wxmtxy

+

an example

+
author: Pete R. Jemian (jemian@anl.gov) +
version: 0.4 +
wxmtxy logo
+ + + One way to learn how to use + wxmtxy is to work through an example. + This example shows how to start + wxmtxy, configure it for two EPICS motors, set some positions, and + save the configuration into a file. + +
    +
  1. + First, start the program. From the Linux/Solaris command line, type: +
    /APSshare/bin/python ~/bin/wxmtxy/wxmtxy.py &
    + +

    The wxmtxy window should appear.

    + +

    + + Figure 1 +

    +
  2. + +
  3. + Next, connect to two EPICS motor Process Variables, namely: + 32idbLAX:m58:c1:m1 and 32idbLAX:m58:c1:m2. + Mouse to the Page menu and select the item + EPICS configuration. +
    + +

    + Figure 2 +

    +
  4. + +
  5. + A new window will appear where the PV names can be entered. + Enter 32idbLAX:m58:c1:m1 into the VAL field of the X axis + and 32idbLAX:m58:c1:m2 into the VAL field of the Y axis. + Click the two checkboxes for X axis is motor and Y axis is motor. + +
    If you make a mistake in typing, + or press the enter key in the wrong place, you can Revert any + changes back to the default values or Clear X or Clear Y + to clear all PV names and checkboxes from either of the two axes. +
    + +

    + Figure 3 +

    + + +

    Note: The EPICS configuration window will change the background + color on each PV field, depending on whether or not the given PV name has been + identified on the local EPICS network. Pink indicates that the PV name has not + been found yet, green indicates that the PV name has been found. By pressing the + Enter key on the keyboard while a particular PV field is selected, wxmtxy + will try to locate the named PV on the local EPICS network. +

    + +

    + Note: The VAL field handles the Enter key differently than the + other fields. First, if the isMotorRecord checkbox is checked, then the + PV names for the other fields of this axis (with empty name fields) + will be filled in automatically. +

    + + Then the software will attempt to locate all fields of this axis. +
  6. + +
  7. + Then click the Ok button and wxmtxy will close the + EPICS Configuration window and attempt to connect + with the local EPICS network. In the next figure, the readback and target + values for both axes are displayed with the numerical precision specified + by each EPICS motor record. The description and engineering units + are also shown. Compare with the following figure as well. +
    + +

    + Figure 4 +

    +
  8. + +
  9. + Compare the previous figure with the standard motor control panel which includes + both of these motors (plus one other in between). +
    + +

    + Figure 5 +

    +
  10. + +
  11. + Click the mouse inside the description box for the only row shown + and type starting values. (No need to press the Enter key. + It will be ignored so there is no harm either.) +
    + +

    + Figure 6 +

    +
  12. + +
  13. + Then click the Set button (just right of the description) to + copy the current readback values for each axis to this row. +
    + +

    + Figure 7 +

    +
  14. + +
  15. + Make a new row by selecting the Page menu, Create new row item. + Note that Ctrl+r is a keyboard shortcut for the same menu selection. +
    + +

    + Figure 8 +

    +
  16. + +
  17. + The next figure shows that a new row has been created under the current tab selection. +
    + +

    + Figure 9 +

    +
  18. + +
  19. + Enter a description, and X & Y position values. This example shows a small + increment from the starting values. You do the math particular for your + selected motor axes. Make another row (Ctrl+r) and enter more values by typing. +
    + +

    + Figure 10 +

    +
  20. + +
  21. + Create yet another row but this time, leave the description field empty. + Press the Set button and you will see that the software has supplied + a description autmoatically. The default description is the date and time + that the Set button was pressed. +
    + +

    + Figure 11 +

    +
  22. + +
  23. + Just for practice, try deleting the last row by pressing the Delete + button (far left of the row; the one with the X). You will + be prompted for confirmation, as shown. +
    + +

    + Figure 12 +

    +
  24. + +
  25. + Time to save the current settings to a file. Choose the File menu, + Save As ... item. +
    + +

    + Figure 13 +

    +
  26. + +
  27. + A save file window will appear. Navigate to a directory + to save your settings, enter a name with the extension .XML + and finish your task. +
    + +

    + Figure 14 +

    +
  28. + +
  29. + With a text editor (in this case, nedit from www.nedit.org), you can inspect + the contents of the settings file. Amidst all the identifying jargon, + you can identify the various pieces of information which have been + entered so far. +
    + +

    + Figure 15 +

    +
  30. + +
  31. + Set the page title for this XY pair of positioners by choosing the + Page menu, Change X,Y pair title item. +
    + +

    + Figure 16 +

    +
  32. + +
  33. + Set the title for the selected tab by choosing the + Page menu, Change tab title item. +
    + +

    + Figure 17 +

    +
  34. + +
  35. + Save your changes to the same settings file by choosing the + File menu, Save item. Inspect the settings file + in a text editor. +
    + +

    + Figure 18 +

    +
  36. +
+ + +
+ + The wxmtxy application and related files are copyyright (c) 2009-2010. +
+#*************************************************************************
+# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne
+#     National Laboratory.
+# Copyright (c) 2009-2010 The Regents of the University of California, as
+#     Operator of Los Alamos National Laboratory.
+# This file is distributed subject to a Software License Agreement found
+# in the file LICENSE that is included with this distribution. 
+#*************************************************************************
+		
+ + diff --git a/examples/USAXS_XY.xml b/examples/USAXS_XY.xml new file mode 100644 index 0000000..e7abdc8 --- /dev/null +++ b/examples/USAXS_XY.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/standard-paddle.txt b/examples/standard-paddle.txt new file mode 100644 index 0000000..eee2f6a --- /dev/null +++ b/examples/standard-paddle.txt @@ -0,0 +1,32 @@ +position 1 12.5 0 +position 2 12.5 25 +position 3 12.5 50 +position 4 12.5 75 +position 5 12.5 100 +position 6 12.5 125 +position 7 12.5 150 +position 8 12.5 175 +position 9 37.5 187.5 +position 10 37.5 162.5 +position 11 37.5 137.5 +position 12 37.5 112.5 +position 13 37.5 87.5 +position 14 37.5 62.5 +position 15 37.5 37.5 +position 16 37.5 12.5 +position 17 62.5 0 +position 18 62.5 25 +position 19 62.5 50 +position 20 62.5 75 +position 21 62.5 100 +position 22 62.5 125 +position 23 62.5 150 +position 24 62.5 175 +position 25 87.5 187.5 +position 26 87.5 162.5 +position 27 87.5 137.5 +position 28 87.5 112.5 +position 29 87.5 87.5 +position 30 87.5 62.5 +position 31 87.5 37.5 +position 32 87.5 12.5 diff --git a/examples/test-settings.xml b/examples/test-settings.xml new file mode 100644 index 0000000..3ce1eb8 --- /dev/null +++ b/examples/test-settings.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/wxmtxy_settings.xsl b/examples/wxmtxy_settings.xsl new file mode 100644 index 0000000..a6bfa54 --- /dev/null +++ b/examples/wxmtxy_settings.xsl @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + wxmtxy (wxMotorToolXY): settings file + + + #f0f0f8 + wxmtxy (wxMotorToolXY): a GUI tool for EPICS + positioner settings file + + + + + + + + + XYpair: + * + + + + + + + + + EPICS_configuration: + * + + + + + + axis + + + + , + + + isMotorRec= + + + + + + + + + + + + + + + + + Tab: + * + + + + 2 + + label + X + Y + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/graphics/back.bmp b/graphics/back.bmp new file mode 100644 index 0000000000000000000000000000000000000000..81efa5ab07e22cbd2854943488e489543e1940c0 GIT binary patch literal 2814 zcmb`JJ!=9%5QaBxz(y?6c!F3QR$3T{jTjI_34)yp3hEC?Ct7G>p^b=*A|ePDf{k|m z0l{>Z7J^n{X(cui^Kz@}5ih5^mw_AR_T!mhXLo1cKfa%dBCpUgKI!~Dkr$=?>)fyW zoYhGs>-D-`uV=H_H%^I0qm@c!KA)>#Cqmd?xm=bcDG&(6VzEz7NvG4nV9;*2$K&zc zZbz9Hb|@4Ihr^9VqiIZ1sg%p*IvftbE9`E!>+|`HL9eqDi9{xoQP}WdGMS7=e1$ig zR;zWfSP(Ls&16|t_ZYYRet)agA_NMiah{rh-GI$TNU2mp7S%nE+r3^-b8s@5#Hx$3 z$K&y4vq8dEtJN)Dl+CDg6GPud&(FT4QhdMP{}nn9`!A|7wmwyqJsb{cwkSYH^REfJ za&)MoaW9w4yHrtjyWO5nr~Cc>t_S`#q1);a52EZxJQ!o^d-xBwribJ4h|)s4nC3Z` zY!WkQ9&iAVZ`Q~RV{C@eG%oDHVBqz7HHQc{Mk0}1E=LFo8_Jt7Msp&9MaW8>$Gf6f zENYGtXsp$0Hk)m`-70K^?r=E%tJLE;f}MlYe0lqHIvwB(g@Qn!Y)Z9Sb-Ug9e4btt y7dHM7z0>J5o6YD)b>${(2wHJC8N;@p)o2o2>AhcEQQJd literal 0 HcmV?d00001 diff --git a/graphics/buttons.vsd b/graphics/buttons.vsd new file mode 100644 index 0000000000000000000000000000000000000000..a0ef6f56b6c21dc6f26211b3940e03fa6a0a26ee GIT binary patch literal 41984 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

d{lLh<1e`+NlB) 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 z%0A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 literal 0 HcmV?d00001 diff --git a/graphics/fig12.png b/graphics/fig12.png new file mode 100644 index 0000000000000000000000000000000000000000..400496c927483c2a53cf9590d74ed97f15ba45e6 GIT binary patch literal 35806 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

SpEV;Az6QZYnSLFc%?$)af}RnwsPS$s~_EZ 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 sNA93(4QxSCcE1eHr?H0I=X(G5`Po literal 0 HcmV?d00001 diff --git a/graphics/fig15.png b/graphics/fig15.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef599dcac5cc9116608e34eba20e5e08dedcdc7 GIT binary patch literal 19320 zcmc$`WmFr{+b^0zTS{>#R@{rb2ZFnl65PE&aCayarxYl~p*RG0hvHU3ad!#st|xu} z_pJM_d(TJtEf^bP=ck^2S- z@yR`iWE}vY1jtK?gFVv^+q}~8r!uae+w_i^mw3hlF?dQoP!3Qteb&#R@1v6${3DQ? zKqa)7J4#DG%FMlCMjvH{%ZhCj3+#wpe|oLminIlVg(&1qE^$@ou8RWlB0e7 z`ZW_1Q}rARPX5I1(a}+8XlMe1s-~tU9}mw#hI>iDD@1>^ubxi(ll+bhM+Qb8F7^@c zmK)|VxA|FdEVxs&hc}7&MJ~qc4em$&UTHM2>o-=`*4CDm9{dhMwy>~ZWo4b3no8rd zOXV<;u(GmpbGr;eMuC=;+~3{71U90LC`1$|{@o1vd!vWJ+LEL3*p;!lw&&g~{i`OQ zhQs-+idrdG*XwDl%+`P+xQV-Pcu{%z(cf%I^#Y~hl9H05BG0w2g!WBaKQ&4;dHMLr zLH-XrW4Uc@ZTR^3OG`@;Qq+kGRn{*6fLZF?rI7bAc0w7PdP~0fbS_=M3{iZrx|-9? z$r_16>#0Y_{ZgyfdEYm(h2>>Y0Rf_@-cQAo193EX5mH`WUJecpEClOCbyog01Yd)!$A6G>z8cl4pd�`8RPzdqWx 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 literal 0 HcmV?d00001 diff --git a/graphics/fig16.png b/graphics/fig16.png new file mode 100644 index 0000000000000000000000000000000000000000..d275f46c3e8c50c64fb5924a55252dabcb6245b9 GIT binary patch literal 18137 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 HDWM4fAq$RK literal 0 HcmV?d00001 diff --git a/graphics/fig17.png b/graphics/fig17.png new file mode 100644 index 0000000000000000000000000000000000000000..e805bab35db6e70a6706d917e003c5362b05b28c GIT binary patch literal 16199 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 ajFf${rd8RN$O#^h2c#tw#LGp$1pYtSy5RZ% literal 0 HcmV?d00001 diff --git a/graphics/fig18.png b/graphics/fig18.png new file mode 100644 index 0000000000000000000000000000000000000000..fb0712007792139a1b9ac087c2fa0f7920cdfea4 GIT binary patch literal 19912 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

2(LH+Yf+luS?wn9jo)m%aQ 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 LntX}ehrs^=8fU#V literal 0 HcmV?d00001 diff --git a/graphics/fig3.png b/graphics/fig3.png new file mode 100644 index 0000000000000000000000000000000000000000..2b74ae98b2f45347b7adc426d46d82ebc12c2283 GIT binary patch literal 28174 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

fY*^|~S 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
^r3(N#Z=+~W@mv${VbQ+Spw(sZzN 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 Q>c(tF`et`3bRWO`7m*(9WdHyG literal 0 HcmV?d00001 diff --git a/graphics/fig5.png b/graphics/fig5.png new file mode 100644 index 0000000000000000000000000000000000000000..9a570bd1d64e1da9191408af4d90e018060a244a GIT binary patch literal 9303 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 Ml8O>#5Ci}J2Q{i8egFUf literal 0 HcmV?d00001 diff --git a/graphics/fig6.png b/graphics/fig6.png new file mode 100644 index 0000000000000000000000000000000000000000..0932d46881551f773ad14e3c806e30a5a08b2150 GIT binary patch literal 5757 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 literal 0 HcmV?d00001 diff --git a/graphics/fig7.png b/graphics/fig7.png new file mode 100644 index 0000000000000000000000000000000000000000..6cc31e3c2d97868c35c1d5d11bd1efd5ec2f0d6a GIT binary patch literal 14241 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 literal 0 HcmV?d00001 diff --git a/graphics/fig8.png b/graphics/fig8.png new file mode 100644 index 0000000000000000000000000000000000000000..09f76d94d27354879d9a6236dec0b5cae2a2da6d GIT binary patch literal 19789 zcmb5WbyQqmw0J~YM;H5LNXn)wzoh2#a zimKvtD=&XEi6|p%c63+K?Bhb9lxvHr8)C$_IC~=&ixrY$ej%~6!(aGLC7B0bk>f|N zwVJtNhi3G$2W^puos}5vSSn!)Gkdz-ga~&rudW-{*WXV3Bb+uqj_eq=Vu4~4i?rUK zs;mUbeB+moh+ftrSdubRo4@RPUh}D2Z>Y!QT1Vup&D7l9LTnd zD-KtwGBT9l&|L7%)@?|PmndLNp?SMIb2ykF<90heq3|xU$+FgJYYa30k|5#b<%NKN zz|GAK0y(_CzA}Bqq2sC)ABIIHQlZ57@Zp2CwKW%^OwsI>D_1O8gZkNM>376F1|XX< zj7%KH9|B;Hj3X;ir2Y*50jOR&O^)KJp7s{H74XH}vDKPW{~T2FN}@h@g>tcawzfKl z6+5@vzRg9Dw*BPl9t;EL<;4y?D|lF?VC%ct+6Es6pTMWjh1?X-1HoMYI|ZpL`70D1 zF{}hiwpfu%r83NLyC5ER?>u)GV)p0Q-H6F(Gfm~xWL5OcNkRekfb5PhNGl?(04gYK z#>_S&tE)Ow{a|mv{tDVjP!`D)?uyadTTj}~dZ*`X$41+^Uu*4U$xY2{q}*fNeJ*Oi{DYxMA(97xy08 z$Ndo!yRbjE>R~hm@$ST8l7f%}hFk0m%>~f;F<+Y`7{kBz|JGC!SH99}Ad$HjDETSg zx}b<5tFC!->Rg&_t+ivEK>e4!U(ziG1C#R3>-uK9DT`_2z1(j0{5ZQDnE)zoLQ8?W zBj@j$>3XIVrY=`HVln-wqz|*@SU~&s>;=-9z>$OzT1%Hq$k_xICS^1J+wY@|$OqTm zOs}?%0PPC(hE%qTHjxP2LuPe+-+p~NY{}TUO>BlG#9#e#lt10*R%2sx@s*I%#_#U$ z+3+QQm#9=_N*8^jqe~p!dwhIUuTU=gTdGLC9K(Q^M>(=7j2-kH8?i$9Cn|K(=vTO0 z>5Lx{xGd&V*?!VWiu`!Ea#y+%W|aatx^*qs{yFpJH|(Jfsy`&la_iNnHla6Zh^fNl zEjoOwsFmwDD%r!!6b~uG^gl`dRy_HrISEamAR2><^;JBYEbtTArlc-L5+*_bVU&I5 zxsRjzPKCnv@HM}an1Pq}$syQ5>8sDw88k_K+s9fDKhiHRc;}{QXcs_}yzjD<2w}JR zkrdL3pAIGl{M)eQzsfGOW$?0i3?4D_($_~cKU)NIyeOpOWJmGre zN+AP1AI(}iW)i31BNt^;5|P^C!=lZ$dbp3&8CkNT586R8gyq_Di^yR_^Ff$W;ZtBQ zep|G3mXrIKHco!~BQCZ>2qG{r5bU`mdYw*(18Hq-ZGL_TaPXQk2cfgZk|Dhb%3-99 z57?!T?#-8}RCzt$fgNb?;P7oEPWc8?R1te|i=a!{1rIeu{UfF-eQxWDFW;O*HOKp| z;=eD(#HXmNS@98@e+|&Csyb&SMr}Y7kcs`f1_Pa|EO2-`|Q|`l&9kwh6PyBH?GXc zvibnuEa`UkSIVX_fsqXhL8h@IkOEE=MxxrO42AY?qG=K$QXjBCNWS5!4F`-Lx4tpd z69)B!26K3kfV0$-;xhOvusLk-X5%QRf^0|i-Dh}%YQJB3#;~u1`k;@MC(8-Nb_Wf> z0G$skLH**K0~J3RPYFGMNM9a>29y$*Yg(5#QG;mNh=t0=T*c%RtKjID9e`|N9_1KJ z9pf*1rz}wZi>{B6UZT#YoB|6TXY*R_c7vUyv4Ws<%D924@X@4+i;f2jp!1Y`GqLb` z={Js-KLg?&5y#cI$@k~URcK#30%*DqA2Ecb&gBLZ1cw~1jlDUjF7^p`Aip`)ewsT$ zc~piNJRgQ#n589{NtR+@t`r2HL16#=4 z_ucXj5sG~n%P23L4dG$qk-V{aqy1JiLqlSE^Ii;@4)^`ql=LmP4G(>~$L7*-l?G(@ z#EF^|q~^(UYyLi^3ZcxA?4*OP!>6>+!LPd&9Ipa0@e`t4)vObI6%{+TyNn+R5HM%qHNo-14qN%V(}m zV2XE#E%icP?Ov63tqcH2{Yz!B@< z+t(EzH1uG_P;9*{7eCm5kI0 zNIYw~k^QAzbusnhcqNAx&^>tTs@mwBte8bKxk}b{B1pBA_D|Y)$1m_<`jpg{aovZR zpiTgKbcsRgTVbmVcUZ&Lbn%ZM)1e(#*<@cQlSSPsp;j{6TWXiXjs>8yfa-_LP^2qQCj+{*Auo#SS0J`_8i@caj=3l;s zQsDryI%8Dg?Dx-0SoM3nMf5K>DyO9xMQXn`onYxwk{<8RBs(%KH(EdN-gnZgpp)#D z%%!56(4*05n;)UaA$wzLEnI%T@D6m8B1y<iHMB-hO--0t#n=@#_ ze=w9T=ghVdL94g!fIfNM54X`*TT)VDKd4b978MU%7Tf`x2+h1{53+5x{_XN*I9C-hT-D7EP!gz zpIgGSw7~h>mFN4EUbOxb7Fm5ZOn{7>*Tn6E{R^p1d^JS33XNj^s_r8*!$m_>l10j0 z(>af>`-9zyh@K>!bTtH978izaf?PueQr=Gsw9Vx*Bg&4c3WGGdwY(h%c1eB)00wBg zC>y+m1r}Q=l!I&BI+3tFzYN&1SSMt}jdPT4)kow~Hu}UtI;-2Fso~Y!}QA&7)JY@@)kkKc78nIM!<(@ej%$2V{7A00B){frkyN#sWRL66}8u^>sC!}}+;e1ZX|A_l~< zfvJvLxZ}S+v!AvtgW9^Tmcx#4yLXYA!gf%OB^(}a+uF5x8xDeYN7s8UP)@(0K7U{J z{2>|wp*wo+&mR8ssA0dO(dvEUVT*mhzJbStGK@OUobwx`Zxt*nW^1jsp&_kC2cZkd zYOU7jHQINnZ)M`Qlu`3jvf^(&Y=8P(V5}*S8yrF*_WSf$h`+v8KNULG$lpuKD{gFb znH3o#73x;IL$Z!khZ_ zQ|6zQ{IvS8p}UR%i5MBV!m3)r(4^0uu9x0PA;`42df0C_Zu^ZH9&bEukvl}8Tat0w zRS#Y#pAL=s)|(9xn^-c9l&w4}a-#j#)SV+Qr;l$o#&ik`;jrXhh1;xc(!ZE*lrCjI z%S4GaVEdb?*PJ;orCUz;IcZsL2~-5}$r*0#MLf-DcBfcJczkd7ho^rRHvh~XK4>$Q zff`u$73C*U)}1v0-{daUB9*k}@u_P3mO%NohVZwY_2MsJPZ zMGy;Z8Cljzoa0V_7~)er^i%A96wt}#uTM#!iz|Hu0v%S9e-S5|0DWsHE?1044Wex_ zwvlB>9&x=9&-$Gs&VL&ha3%U$2*F7d7}OHrM6DDEVvzhMMdSUz7VR$0$CMPpb2GGJ zs%qr#q~_R3ed2&oDYGcc%kWVTyMXRXcpX&+ya6iW1**K3 zK*GN44Ax~25F3$a+CuD0Y{?za5Yp;tX$CQjW_!#Y4HZL(;d)*|)dC-9(m+8snb6RLq+4y3YbJ*7E4yvSlB+<) z2-Oa%3!ebVV5L8Q=(7zfi^iM6Hn@UdV0O1*8gj$$?l>{r5oUI@;ee)$4uXK(LJVO1 zqy-{Io$%cgn=Nfaf)lF9r?$qla#eJE=~hFez@|YS)KdJwf=kRIA*?;m36(o2)S_h6 z5z++F`(hUaf3TZ_z!TBN$kARa^$p_Q_i6B*gSYU}*Sv(_3Pw<|C(g=J1)^tPc~sC5 z=+?DcvhF=D!MhR>jDPPrW$aN)KfX>+LejM_%}xtxLdu0F|NNToUZ7%7_i@Mt^)s@c z(p!BYWoaw3J0eo?FYD!xM|1x9A-G}*T&cnkN)-x0x#lwg6;#^4De2!kaGWpR1pRz$ z*W5n^O-^kQrI}=pJN|g>^C9|Mft53D8XKF{#dPQ;`e8>fAe|c>&yoPE(@FC|$Dp_C z3~zI1g4)I=eJ@F8;p2;cljVk)SWa7savBVt69%X!=Wtf_rsOs2eVwep7t;4nu*;(5 zosUK;?zqG61%uyP(XKeB zJXao`>Yf*F_q#kbrqU+UIkV3juWo&CF=vWu4%WqyaM)o0O>&-+w2Q*;TWN#y@9k|w zX|^JWhcEr3@+qf2U9Z>dTf=M5D8E(CcwN~`t%|xY2jaTY_1NL}c6SGUr(vuT*LoX< z+n7wwnlcaM>2b0D$XK7*lsyC)d!D9RWqDnF-Uxi(eXD@-XuMeV=r%mtfV~I!u6Leq z{DvSgWHF4NAP_f=eq>4A{JwOLDI*tObQEVbo~;wth=bUirR%Kki8t-i|IFd6Fw@&- zmeIS0ghSy3a?oSqSxMy5`x#3Sg}o$gn3JpGq-Jn(m*M4p3s;3T-(ujg!^8%#yKHUm zIZ)W>aJ)YZ&lY_1&PAt?%q*q2eP3^}dt4npVY9)Tq1ESM|LfD}$MgB-yHlpfxOyPNXKWN_QXLy+$vZM8x|64Xpdv*n;`c{{F8)4I7>;34=Qy1Al?>#;VUH z12--fy-o&bZGn!CD@T^WYQ*Fj8QTrK)WW~57G=Cqm{aL zd4)6V+0sMjRQ}lAMgk8oUzgTsE>mR6d`!FI;&nX@*Xk0aZDJ?^y}nK+o*ES-OH3>t zD~<}tYHIcxGD7gtO*XQ!vm7^aoD?mIv zQmYJkJ0h;_zYc--wHgj_kRedLYC2}!Q(qPDQwL9#&@*M-O&_ZOIh4a50}Lxx_qT(V z7|k1TQ6el>X}NfcDAP}Wn)0PY{Sx{n9>bH!)YL@pE_gh);a->83`TbXC|u4ve+$>x z->L@+q@<-aIj_A3A>#5yi45MIC01z`$Wl7kJ1o514SM*mfAF1()^%ZP>S{cjI=Mv? zpFeKs(jZDd=H1}Sf`3f@A=77EA%M%8!`sIbmV@r2(NSAn+$;xTz39B(^7Ss4nb1&!dfeB>^To9ylc@di)Q|vyr`b-c zG~}~o>!r?c*29?+!2?1s4X0CFLd>VN-)4^67Z%<#N4HYyjVFs8F5$(-8(!Q_lUve5(*w)yJ$?K1HXk%_Y3T0@Jq zP!;zs;HXO59g@0hY@R-Re2|RIwI;)|YNfQR<|~D74Ru{94olhsEHzygg_ZrxUkXL{ ziV3IeVCA+H`z;ptc(3ETJ}ON~{aFz?W514Xb9db3SL8Yz^510fVr<w) zY=;>0R~X>?c?F4S_@eU(i+uldFS8X2Mk$h@Vs=AdV=!2H#w9bkOB>l!@MMlV-J*qb zKNF7|O-ZQB4yzInu|=N~(?Ti4c3IijM7B3f&)X!^4AAVaZ#fW_r? zeds2iOZLrT|Fk7xO%b{mSZ`3!@yW79QSs?ej*?4$gl&>hn&UWz2?Rf#lr-&Nci(#D zIw>nlXJ_COKzw=kW;~#RMXwDBq)0kn&Fp;u9bCJDQ!=~Nvf>XLY3uWxKG8(F$Mx~? zgh`jj>+oSPgf2}XK}~?Y8vk82XFh&dlcnzt6ZD-X`S9Dc+l+i12Y#g9)n!bV&y$&w z{x%bL35B?PiQ@6Cdx<0r;O*^QFU7|Pyb8urwAH!0_S_KS^W6&eyt705dbQQI&FhW?Md|COAJppg?)HW}F!}Lb~bzyC2I<94UH2 zwv2@+3O6GqWmuPC{b<2vc>AKPO&AUumB-ufhQ8~^7eF@o8w*QMDKEK*t?g9b^VQ!q zc<61GkYB3{0{*J9>}3#O7Csk7K-LhaQx3h-4K)N8POdPSTz*A}m_{J}4EL}e$*&q( zZ}80bxJwUA^Yg*gmO~*3=U9Nrdq^XM4wWVmPDnYyl3a>Hsc4A;)?5=()W4BcQBhSk zIA~{oceuRYoQ~&^N)k&yg)mN^G~{b*6sp~_qnPRJpoXMME=}xgZ$koIRqCgX1QqJc zwm;}0u~g^c#1S9x6Q@ISpg?Ys{UbI|@K1nqqc{tvjQus}DoYyiqs1oe z&DB-KY}I>rp6EN3Pfcj(WUJFf$-)X=SaRgmVvd1I-{?K+h=JfD*vK_l! zwou9WgsWq2ejJ(6hF>vCm@K)UIF83=z3g~*$^nQ;dfuJ6FtNSZWXKXTu%1kHuBprx zdZRHVu3w^s8eZ>~oXo$P!&PlVkEgPZkH*yKEYv#ci6AsJwXy!q}`<6KXp-?G%o0A(6C0^H3*@s6z{f$6)7q+&};^ zQC&%Vh|Z!q>6|Wit8NJ63+iLuhnF!SL&o(z*Pp*FX)Xi=Pyo@|Gxk0?-)D8W(+tZUh|FTQ-2@DJJo<)SYThQN z+>ttNEu%AWkyg-y7;aKMc>~A*4csS9z-+ zAzRbGtJG@C&(AL`DuU`xsXOTH6`0Hjhw`m6nQXAxh#cKZP2#oNE|N-PHCrmpkf?al z3pMK3{YBhpxn6HDI1wcpAuS{GZnhVNIZmh9{II#60Z#XC&lh=*2%SyeF<67<^oLns zSD5}7qW4*78E~j4eW@-IY$+Xg+r72~P{aFKEivhm5BB#*jO!dg*X943?=<#v9{o1^ z+fEpfa)q`*NR|<4TX36)BFNZeVt@)Gtj*lO$a8OSfb!~OVbZGKoUNEFt1w}}_ZR$3IvCHes^N?xqVVi;Jz8Mu zRPWp#ybnS|MrwE>agQU9fFPcEimbL?YrTp3;dDH-XaD4qA_yTOs1B+z3Boq0u^=Jx zd4lD}@P?pISlXLOdKQiA&P0~85+x)e%EFYBTX8w9pIo$u7Pg4Nj=1NJ6w%SV>x=cT z2?h_TV0?FYzP7zRk;UUsDeCA#FEd#^Rn21IV^FsUenD91l`E8^!f=?jX0O7#blCMD zg1_etCLSmgdbPprx4sQIwyk02gLjBEpi2Q8mKJ8v+^`S87kl+fyF40G`2fkk z!9wNr?U`sa@m*}AhL%C8Lf63M8w1{P2$MC-(S&I zl%V)l8m%xS_U5fta`W0C`0mfOe6$-{Ef(l7xgE~i1F?f>)!9*iM0$->9ocHj$I%lU zPMZqcI@e*8f`YKq^z?*pDqifTP>-GY4_B->USd84 z1pR&A$imyeV_eLw>4yvJQ6~8w6abC#ZmX&|I)5X#GJO~heitp;4eAmz`t`vXJ4P4v zCZ|x;@xHe=_dJo#73{tD7QLPM@ibK$OyJVB9UM##c6*ae)*BGM_4PN#QfWUNuczw3 zB{;46UmH}pF7Jol4-Qs{!W9Dph~Jm~{Dn;X_Ot5rhqcz~M#X#cNM*s@_2VwR``xMD zfnygs(MG3WQtyjp(d68xiBB$$f@Kqe5elVeK@h#&HeHn^=j6oc5Zo(4;DrC$ZekYXn5W*vt5;-n*p}&iBDy^)Jt&cP z|I(Gc+vb+m*2UCz-|fa*$y5CI7|`9G+knUxedkzvny597yJYULYQhPQTF2({G;8Xt zW5ylSW*D&JVywN&dVkI{2)+aD)90g)&V|>SZWbTLhjIhy>~5uIphQCLT=35L`g}p^ z>LqhGNc4_igSxf#73~=s(fh&+)Y)EwrZ7A_3AzS}M!f}$8}G2M=Zo(ye*YfSzzS2L zly(Q8ep>oXs0V^*;+Klc#C`Klf_?7o)6BJ zUv6K6seCNCAON42YaAe*qm}*qLEeIuxoJDgYUAN=i%%j$iu8IKA%{LY?IyJIp|BdW zt)kf$Dq32r5k1j(dms@I5*5pB(7r`^+q|?&gD;pxG{LXu!I%{jgH%BWv2!iFik5epP_ypUnD< zs6{6Fu0LdTR(LT}eQzQfLUc(UZtlOFdMNyjQeapuEyWH1z$*v<=sdA9q)j{%PY(`U zcBlOQT6kx0`taukAtlj0{?jh9|Mj0$&B^)VQ~rzu7&0zlDRe!VDvqsjvK=Y0!i=-B z=I5Aa-^|Sf=8@obu9En})<4_ex_Puf`bs9s(2wkX(9ZO9)!G?Ml@hM8Sjap)Jl74@ zj%R@q6)wVG`+k4;$?HbUQrTF2GLxGJ|1GAaXNCCtSIqDt$;X%BxFYFY793l=8CkH! zrCw=4K^s!IupRqcv}wT=8;YxE>V<#?VbY!A31%so`SSktmn<)RsJNo zPOGO;&r8eye4;!3UU#U$Go)`B>9kKI3trI`0vtw&r`OBz zpWiqKTU(!ep54WUMhzTO+~qKlz}duJtVgVBfnMjzAfp>q#^$P0%cIF=#Zvzg=BMP< zBb`d6ro}=|cyJOWNp6Wi&SH&MIQkwt^CpXwd#T2T8u+bc)FjYd*ilw?PWZrqNXGp^ zOusY{-Nn&Ac(cLcCmA5`L>yYehInI%2d37iFUI&qGjZW#lS{YKxf`(w{;MGVckLYF z9ucJEOwdGkUUdr2lhob+d!GDnD(NT|y)P8nUM05X&5`jncd~0nx8Bd{%9!OxmZ72ap}g=k?gcPi3e;?FMAQdyC?|iXpEhT#V^!F#Y$qCXaUlOfBoi=WmnFiN_9_N%mX`LEf-Ol{! z#w^(2o+)L_=iN)FD^1aO)U3Z`?jW?YvlFnT;8{=IR(wX*k_ZQV-0m8rv64ijz$h9U zg#}>z?arPeoUK-X?sczcC@3f*Ug>HVS#7xtQ9`_40p|T*BDxB$X7`yLpJK*WxdX}X zyq=IQ!L3gXmUY%^?tRFGl1kLYOF!iImw$qb?^v{Lrl;o_)9OSh8lMmJDm zvJ6inZe0oX#)cjk&hm(cn3GdZ)dkopDw{nvl2EVZqwpE~QkF znMGN2BsVCIMUR4$(_-SEF}JEwA_-rM>J_gZ>;$yEy$2%+PA4t0m(vFc^}dAv5@8KU z8ap#$TXuvBbPBGTs4Ali8+pJ3csA^!|Jed0^nJ!R>@1 zFP-Dm_c1O1qs*+R%*)S0>%rec37cwrX`&(p2nI=)yA~@yFiYq5((6SXS zM{+d=29|FXU&gAEK>~e`FkZqCcO~-t$;J*7G*E0rrj)zK{YpS7>Au8!tv`tHM%z^ewXo&J{T zl)^3MNqk_@06YCIwqFSB^B6W&JNUlpKNL~OgFoJfc##2w#8bzunkXXm=DVVgqB5(D z+Fm>Jvs!6gJk<`y@)Gkzcu`%Yp9^Jh9Ir2P1wFt`4Jf>4d9z6st1h?hy`@G5JCXF< z%?8HzbW)ZJR)VTSxIK{w^j2>c{)*%v1i0g+vWux4K?Xzv25jA6Y9*wFnA+kFL#gPJ zu?cl3Drp=8dyxnNPKI}I(m7v#ak9^%F`Y zxhcs)v2N-%O}cb$x&3APtZfpnYQ1`|UcP{el5(l>Tcu0XK9DVMAr|Xsr&p&MAgNt# zH)^&#vlg+?WD>r|OXM1pi3CU#JiYbBQy<4k{qpxGT#uR@jR8|qY46LM`}^v*R@qMZ zQydyrCYRX@(i(7pDuczJ`%&k69CjIETcQW)w1A?cpuZIwK`2p=HPzMiKZ}Mw);l&- z-5+Fi)|oC5HmGY1ZnXJq%)4B4wFe|~7#s%C7Ih}qbQX*CY*jzq{5HomTc~gc_dizK zKgvH1`Uk&vg3dj}%5eRv!<+N))SU>;(|@i1ceKU7vveuNpAbcAr}Hni(7EQ9w^vjk zvy$pg|prTVAIM2Mj?`&CW5$<}k z!vNkM_Lu;62S>ZrtAe`)0-t;9XXFh3U%#w1+v3w`y%LidoFyeszbLr5T6_Xo%5F`6 z7!`~#m!$0-xUnT^&J`b;ZpX)Y{T`X9WV}hMFx~gy@&1ub27hHRa8QpiwEZQv?LLm; z_gSAF6F2t*X|PiP5-~BMNr^_8p+OKeN&EYn*N~oICa{Kg}`t2d$mALsO zcF6yp{h>S%(#2hl#yur7LqSY#E;+R8=8(4tT=3UnS*uX~%~yC<^ysC=4MwlW#GcYu z6^PsPaEAF@kDV~Bzy5C)Wai3wBApux6Vv@%6CX(D_NerFcGjd@XjY9ISPaQ?eY#2U zxN4Hzrt8d5l(H2TU1~H)x*|aa_Tx52<4}Ml4tl7Ip*kIS)!E+pwkA)9{ljf0QLHTP z#)s`;BlaMUPv?`Fhi*Y3ZY^$ZU@s)%Bu>3$|Jvt=tk}D?b%`=xKOI|Q4-~Ki?^tR~ zU0^5-o&<*rU8@J%3PIEKW{ZPy%Al4fXG!X2SfsxFvhkyoykC zx+!`e&rqmM3CX5J*1?sj$z&!7bZa)9E4gcwgFAc)dJb@4p%%U~M(eJs90pUzEk{xAbxrnjE{!j%(=8^)XFWE3EJZ_9u;2)6;7}w#R)XZuJigVvO2YB=>BS>Gx#4fkNrOFIk6;}m(_%hS)47$|` z)dA!^_vy&grlj=Y{l{}9q&>ukf>Ke3=YfI3YqVOIU@O)A&A{9UTe!JW7r&4{%rQvf37yv!K=tKJTE4z5QNF$OGZiw$Ze!K{@vTj+lq)8g{pnZ#GFTn4dupwtz>7J?e~ z3LZwZNm?o?(|)M6_a6-_#>7Z`hSgd%D^Ptgt;5MqvFBGBY`Dzqk!kg#c#D8Sj zu16ZY8X6k#dAo>;Bv_tI>x!190Rz!oKQQMYhBZPM8<%ykcMwJR3O*??VAn1lH&kPw zk7yy2&h@w6?I#L-41eut^|Q_2LT*4vh&3;G!LZ&+0ji)#viQ@4f$na|R(%lqVh)zk zbhq3zRX&0d3K%2`N7 z%R9x@X~A?My^KtCC6-Y&&1`p21kw>c`0)`_Q_;NhuP^{(%4v9sju$ia{&_~)4Yk8C z9p`BM7bGR7f2OWBQTHDpH2-n;CFi~eQ|0c1)Gdw=J0>-POm~ztbJJE)U zNb#ABIjI?g^u)5n*SA+?=uF1x;5z>0?BvTAdX!nCRQUN7n${k3Geur}uc|6OtM&DjNK>M`cvpi3Q zILpS}EG-bGRp*#%bC8`*7q7l0(GS(mM4TCjM1k(EMWFr%OD^y6nN*f!%rc*4HPZ-%IoYv3f{>LQ7=@KwCF8yL@ z585C1^zzDZAZ*u5^WM*Lm*b|o-^{w-@Vp@z3>7&06Vw>ZVp%4bvh!bxs}gm>5(fwP zXi&~<8Fg;hk!Ck7q#q3XR&e@=l` zUr+;#e^~$K(9}LwA<3tV(GwS&RCNjlBlj@;?$PD@Tq>_NCtgdQsc2lb4rAVVh=Ft` zY4n&LOvYa^FY{*YbegNTSDv>oCUdsd$wx#YGUc0mb2nsyAaswXvVi-@@IU zr!34_i5x9dC^KWN+-$bKzJBkUGBPfEcB@8!t03`WtGvYtL&fK=Ql;X*sbKMDVr&e2 z0Po`Fq{;AVS`r8?m`%NsNan5^L=TyeSlvv z85|m^pZ9jpsYVpXoi!@tm9n2l^V3O#`|sW{UiLt+4hvU?3iux3U=LJR%SVBA&1!fE zfDcXgYJ>2^2O~cuBmbawMc?=W8YVJ( zRdvnCNAK_sx{$+>-An3fN$A|#t;c|OT#uz%(4u`bJhzoW3;ah`Eb%l_b1X#6q%-r< zeo?{2b}HEzHbh56)@ytrE1}>z+CudF+mBLePoP0FN_em&Y)+AQK&!X2TCRWaLs;%m zM@7i$Pb#Tm!4zj;Bv;6CNQ0S%l^mL>=c<~28UhKFrlu+)xA<3+GHITXwhVR63H?_t zRrIz8TJ~7;S01k1LIW%7#l_|?0_P}#zj&9Uv;VFvU)HCni^^j}V{pY$HEJdpVX~v* zg%=*D55CmX3Jqnj5g#7#gqy>8wjzjv-m#CHWcr)2}8TJ5VMNxN0OQ$gBB2#Bg1|bSU*vox5LeJCE~8`fQ8W zz$Ug~fZbtv|34&jOPi>QsZwF6@S`l}E6yvM^|uvzsAbBA-G<#>i{Ze_(!LXVL*!62 z_f`f`D_61?uO)*wpor@`OfM9Mw z-%3c)nRjAL74oHFl`AievBIx`Voy-#rRr~)wg+LDODFeZbNQ{rGBtJXJ=qi+F4p~^ ztAPw3_I_7OEJAU+dXj|1-#>>g)HnJF4bXKccZQg}Cg4Ri3?}+_(z;Kr(CcO71olzu5?vY zlI=IQFLhqY&o$2+Qpe4!GW6e%V!*v_u0n=@&vB(tfk@TdAYA-??I8zZ!GS{quypGx71E@cUGu zkuii#iYC3Rc3Dd3x`ckJ6e*ryvj_QAL{6((0|4U7KmQBRem@(Q27T!e&LYm(UlISy zF5@+sUFhM;MJp*)b2;UvKVuXC+;YOS<3E?Kxk10Ky#3pPn*kP_6_ql|STYyMko+?{ zL@3{J1H9>Q(goi9aeY>#VZe&yB!vs5G07{X?4zMuYa-t3~m|%+D8`jHXhf>I`>HGPS^bry8;oJ zmS~%;refHDQ9EpH;(~}%kPV*OMFE!AEIWIbq62+Jv1&;iMlmciy7{ePZTp-dmho~D z8o2!wl!D_%4WM48dpjYxN|cXAkngg9LNJ ze5@$bljqSAMOJj8WqHpnal(!f@XEM?)89^ng;n2@&o~tDF*Y{dvcG#jw?c(R)Pfnq zc$-G)ffw9&4#=|WlD%e-DUC0_?)octmWePs>M=Qz-Ab0SJL@11=!aLGs${u;n(cYN zkHV`-arG1MIJbK{ix)8Sb3REJE9rn-g3eUR<^i!c)$kGl`5%@MWUl8u=R(LzwoVAu z$1GN3RamxxeDSmS>*Jf1VOZrhC|RKf(M}C3IXTc?lPdpt zM_=KRZ}L0ayU!jMYKP_T_D&V$HXVEaz|v}BLDCfGYA(_dUz_=rJ$ay5n%2~pyi>xK z5TpofWwN34v3_+q(hYoR()&U0%H&runAgbUsS*C?#iLZQRpkQ`aG1IsmD`4z(zV)5 zu%Mdwc_U~JKsCkl6(Z-u?8{$njrwt3M?!vzICNZME&^HMIrom@q2E~{M2Yv4Hu?kePsCIZU%qu1FvKI%JTfEdCbV0 zSd6Ku>1O>O>Ikz&KxVr=I*?`@c9JZ6fj^>wP(2`}cz-{xrwC?Azd8UuSnKKrA1g}} z*AGZlUS>3Xe%NZNA;PaVWhUI*+#G7D@PH#jnugliq#=E;OM^90ct=7ddaUtxzkGx} z;^-!Od;6K08E~B#T0kswaB%SJ9X{6S;{BBa>jN;9=hXoB`#Umd8{yWI4&moSONLi= z_%6K>ZJ7;ZI|PgPdRiRjWK`U=y0WzIhF7uMHqeWo4TH;i7)x_8pTO7TMhw&&b#P(= z*wa0RBA^~GYGt?K@c5AXM+(}bI}WN+9>~=PuDp4&Ssc7U3Mwlr1CQ(M*|Xc^FSA&o z-0Dd1Jix3EBr;m`wod~UXkz>r(?#DErF~pVp`3Da%ulKO=D<4-cXyYwnlqBcgj|<> ziO<+uZoE>`&m@1W*F9>e-ey!{%k#0Bv@opD8&_uKz?Ga4BidgYJ5_2E!;hQTJ82>B zbR6IcN~Q1ssiN%okv>P6%j}48t2;r(Cc+PT(hw{YSPko;E*~w(-}<$ruaI@NrPROM6}^@<|F(ufp8Z=e3jK6mwml z)M?Cx9(Uv!a{LRCC3L)P_D#XJc|d3c)6T9)5=8fKgzH< z_7_~kXKz=jjYo;av7W5DU0gFnH^v5@B_?UV zB|DUF1X7oMvIJ7gS#y(g2kb(Cx4fdzb+iCAH zND&W=KA+%nxo{;dUDZYLqMXwA}#daF;khIqoSt^Sd~bhqY;jvk)sdt8J4PdvBHCLd@1on^bqE8zFx6A zNL+}LJ~!&z7daCZ4NY@}A(t?5lbvOmsTS3zIIwIb9j6;a$rDYRTljS5Pg5W7?C`DZ z4w(ic1gau9m4Qu&E_axs;_}H)8c^)q(~VHR$1cyySyFai;%yt7T&fjuNieHj4?s(V zCVTP*d^_Ekxg9G@!jZKmyV<5k^an?J1$<3qL>FDh z(iuq9Vb-34Jlo|hCb1M8;n1PamxhLp2dtP~?c#GGgnGb8%uGsyVqBEuWIB*Oo3;I$ z9XWUNbZpR7YZ*~fgfOOg`8mrz9g0olCm$JA0TSaN2#edP>Yo--dIfKJF^4suEnV|a zPpx~DfVqU{0G5Q~YtK6-{&k8{$~g+LI8wH*v6|D_Je zRW{pY_FaxbWz=niLGcrawWj^T!Jfj8uMgXqE?B20Jc9pE7QmT{F583$L9eE!q88E@ zI!A4n?;DxU(3#&CuNXyL{L$M(c+d3S9E`ScodpitHJ@l$v5tDgBm6af0 z)kll~B#sReF z&@MvIANk+20nkUFtc9+P-V}LmnAdd-WUBkFpQK+{P=bI-sSIqCg~F@q01i}C&j|6q z-PzLk3)noVlHX z?UEH<30UX3bYYM&xz7Gdr(-s)cOt+%=EX!JxwXu*gngv{`b!`M8Sh>Qn$d2NX3ZoP zvr(+_jipSRiEL);;TrSR+BmR!8wy5W&0{sO5=UxkW@hFu$l&i!NStEIp5@P9RoSt#(ARyf2U>R-ra*~%tR3*IZysq_lUup1Zt>Zc^*Pk(3S7Wy46^9Z;#h&5 z7nj$+Z}oNTQvsE~oTS{i>126l|A`oh_*!a2z_Nv~$KTca&{^)sxhrD`5p8-i8PD^- zg@hMQJoPUxnlyNFxKS*DZKb5#*5ELxcLfin6FUZF5faCqR6T0>DW?8;O=e-5+Fcu_h1>^eURYpZXvk4!|m^!d+yo$ z+QaaJ>FIv0YSpT$HH0fENTDGUAp-z__DTAq3IM?5gTKc}u;4pw?3Y*oKmmOE_+HI3 z<8Z~z6Q}P1IQ6(;vT(vT`GNVRrKLc6;?Lxycm&=7hKF5lZHP*am=isY4xM36V_hQx z%H-SMiT!sg$B)li-e?0`&XknNBquuy7THS+3k#_$Bk9^ry1&#fXif{0_mIVqatBKz z(wSb~N+7W-zz0vm2O6*G)1Amr1}mj5@|U0izeW5yK1Jau~d_HVcgJ9IN9RVll5&LSUzD0ww0UCxx) z9`))vQ!8pJvB8-#ZVVTW=5Ony+>J3u3dW>8(DBSP55WS)+6>I}h05v2-R&)yS5ymp zA1JEkepTN!>(P^664eC-iXF?G9ibwARmh~JBC1l#nIH~!E<(j+jN`|QTI`ac2xchx zdyx*gNwM^L&Ja>RzZ=Pv8j13bwJkG)q2S#1f1EJ$?c!Lrr7_$=pL_}TdG7d;zRiTy z|Jz+B^S%77KqvrYQ>l;*?I?RO)MZ&D=b8}LSweFECe6W7s(Dr2!G&n+NgET)66luJ zF#)GhL!83_CD94u#r_frRuz+md%;3&L1vy*;wbRGBI6%()%R#NLZ%!;AvF=obxky|K6^-H8O1AIdhOMQKh7LXLwLv>50YW2dY{(|`|wz7hPC+$POE_qUJ=FQmrenV zimEqC3LJu8sXoZ>(IrWnq5F#TC^3;wCm0kd@4Zb(k8BeYs}af@g4&v~7nda0Bn0dm z;{jO93+G#{?{>0Vn;$O|)fwI#Q^NuNU505mx&8TR>iehe-tc>h8PU}jB@6t^sVFYM z55I>>26dWih=u=xN`0E5YM4V&iGdzMAmx(}Y{we!@#7ofu@U)uyZE^<6j>c}|Aht& zLxserKclFYr1uhnbBcM#XBl6MB;b{BNQ9hCCgu)sE_SXC=5MF)%9C02Rru7%*CrJ0 z`xJ-z)9!k-GMCp%CZu}v7^XWlWDp~%N%8Rrk_a|GR1Fbv;>UL)mU`8I*lPrab+XcL@W&l3hz1@Mogr@LNgUX9r*)PZ#c!AnFBMbmO+BO=oR?` z{gKL2MR~032D_ulCyV@NA>S|V7`R?DY}0KtKmav&dGe= z?jrpII-g=u?f1E>6UR2+Zv9+|LE#;5RpE(Zd@IZeG1rpDta~Y#Y|(r=9VSVP{2H8I zARn_KczAoX!n3o!f$BWOk2ej5n%)qHAlyDQD(+#qUx&0ya7&5zXB4dcwL-0CXiuxf zr)r=W!l)nYIu`*?Q7ehNH|%lfTAN&*;w87LZk{(kalq`MG)91{9`A3Y6M_t5D-$r@ zJNA}5tuLRBEPLz~&}IP9fCRBizjJq|g2|sELPZqG#zPLF!m4BQ=qgj-ukMiZKR=0GgjQK-cn`*^CL3lfl|(?PD^?A#r>7fLg7O>Yp+Rqp_X0aV z?8F=@sVOIwelrE0C#lC~i0o=Y-E?M7C-=|{M-6kSVFgbd+xo2*9AXGVttJ|uU#@Hb zzz3bI&HEy2zJi500VxBLuxkXleU9QwLjS3>Hpn;hng8z12-8sYxXlW&a`jwuao((r zUIx$g-nl6~TP12Y8<#u^JSivGkx{G+YLJ=hcfv`(d&L=8sT!16rj;L^5FP(iw!XC5OGP`FK{hh@ zcI&E8{^x9J=XcJE>-pK!?!1mMrE2pW8{6UZf~>PTV(!qv%g!r*K@pej(iJJt*5?(t z?uPhlwpsm%;sGF+%srydVlF#;)A{*iI%Gza+@NMBVVwK4&yW?D(0Abgr-kiIxFFv_;)H6c7yS-Xe3Ly5l(c=j~rGyDl&@;kej7C+k5SpP@+uZm!NKh zS&p1=e1PQf>G!lYih0F?+wNZpfMA+I`tES@o|6@&;XWU6RAP%a$?N>EfPIsOS-WL( zKOX0U0g+N|KlR%enY-&Os+b>?nfqz`%PP&QWXLr|9~Nl1`V?Ve%)3o-H?*IIdF78v7pyE41tjd-PGn z)1Ss>U^=drZjj!shm*el)B2#Jb2JV_Z-rw1Iy<__+fT|$@#b0vbz8W%9{^2fSw+wCjF^TqknHCp^?o9J6u z8zzv|ek-+m=&+;8s6Yt|uwwA44|C^QTy>RQyC&hMzw~B4z)CqdCEh29$z4c@U3}_{ zqz(RIqG4y;(>Q7UFeu22x=piKXFFNw7q&#`4m&3XAOqJcQ~ryjfKlIbH=@kjvtOg} zP0H@)k9F0jMi3m-(t;Z?!<({{7XgjCWNz(f_KC;pK3d*>==8)VH|p7Cjv51C9Y1Ac zU}y;MzIkv>{4)-Mb5jDh+MpmdKyhA@SvI(T zxupQ)NN{L-;*Z-9xS=zRxb=I?Nf4+WWd|lh|E|4+Em>?@NqduOH)+$!`9i~fsaOHP}PXHZ| zRtN-IoOH$u$bM`M7q-S@xwv^)u(Nr%y3dK1=>s}8OaqWfS}n7F(7H2J;tP~ECi&Y| zIZciVW}NJ%i+Z(yyO1X!h%r5!2!sDo%-$~3q! zfjHGE?aZ_RdHQARi@PS1IvrufeQ{Y51eTze@^3g=tdzff|G_fqnm5CTSaQmaxAXKN zD*T7}1}HR9B=w#Zp)V&}R$1$7!b8Z*uvWPVC+n)WtX*+m%T(BSj(#VE(r~&yZJR%5 z$h9As-SI{aq;k|xN&OlxAJhM6*rLly=RjEj zJ*c}r;~8uqAnE|zKJ=2d4@Y4S7P+CFJ5>w%Y;6a1OU(te8Lj?~C1+iYrA&Bipo!pk z7H-Y@x%)!%Iz0>G(tsaLFiqQP0Bd(r_v|}3T^>X;)QVr>o0XzH(?<$m$Ei51_|TzS zONNsoNxaYf(3g8=l;`yXyoygAbvYdnZLm#4Wb?m>YF!FL9hB3yOy`|byf&1*&yzKJ z!JyU?ZuPp(D(e;oj2_xQ)GEml_-$yUkG-s2=Ud6pvEIKhQvOU)*KMQ%Ql5?Fd7Ic+ zD7|_bh^>4odeMkO5${IHrd_u;w6d0KIwI&J{tPU?7TfSM9_ZAd$5|@iG^eOILH*k@ zo8+J!A2iuzwz2l0x%}!_BQe#CG9a4;%7p87em+9XYk%tMB~C_wib#r7=dJM;d*QWL zj_U4}H=?JzLe|70C(Of=_4W>eE>muTg1ikE(<_cv+jyUWu&;kqZWb%g9jE}O}vw7+; zPA^`c-@pZ?6vad`#8=%sJSp_5k>dk=zK4o3bQ`jno+|k9J;)LEnuI)2f6mO@yfJ4O z#ZeJ7oc_97D=a@f+jZ%36~9+@y%Y@>yg3y0J}=EwWRAeYvAohe@E{2qH9y~BP0bsz z8#B?g^DnRZfw9DGOL|C`6=iMORKndn>j(67qiVX9S#lzDdgG81LK8AY= z!O4ofHKh+yDM<)NFiE5Q{=TnTKqeurPoT-?K+N(}8za5=e8!M2ff>y>>_b|n7Yhu3 za)9|2gAQG+y2F?U#srN7J$Ysxyot6nqt4;aPmTHVUV}9?9+o^D2g^4A#Wlnfe_k&6 zS?}%^1lhS`mecaoi@CATWwoIA3a(nxu?Z@MsYeW$wC&XEUS!>6SD~{*g>X&vj z$@44pDOZ)jPATc83kkI>4#kog2|-#OYs!@i5kAC4aN z3QL|0!0bX67WcxY9f!aKR(>xvhldOz&Wa&XGEtwG_cYwVW@7gr2ve1=RXC>l9q`YV zkRbs@qlOA2{XaA-K7gKXyn5g4p324i(rGGW=AX%e83{+U)Pz{$&5enOgy0LKxGl55 zk7Lgb8UDF-Y<`ZcDkoMh1Yo}>KmACQg#EAu1;1jAvv3=E<*qckXeb`JGiM4e zdkkp{xh}fUii`~`NW6iQK&eg?Fxkl|f{zYGm1PW)+39+`_J(tz-rpPclEtCG)htnL zK~%2YgJ2>hGRse68C%k#a316-BDg;b@$*kK4^=nO>t!FW{YYhf9^kGB==?PHbe!>C zk+}L0CJ+W-YaO-3yZ|n>mG+L~HO<46go<`bbZs@4Rk#NP7 zE67`ACUr8)0k>pXnRQFMc($nj%rv zgEGvW8o}r+;#*t7`%~IQ`nc|<8uJm9m+0dm@klrMWp{`yPseR^n%Nx;GhI>L(fU3R zHI%tM*JY+M4c&WWTmxC?`|gNAb2c_*3^Hdo&*wkc_HFm+UQc#aQOLgxe8x|e*{hri z9766A@wQsrM4Rv7?bqu1QdBgE>rZ>>Ta%qSI+H?S17Pv4_8NN{&!&oXsbc&2Z03Ii zy_iw_yi_Dj*OT2aiLxmrG@w4-g9G|i>B?6c2dabX4{@p-^PQbtEJn3Y2U46Y6iJxP z7>6sSFPX&M4_EOGsBM=zq^V=h>KIbM<>xK(D6J#*XMm{?H=Ln zH!_N_sg}^i21X5AGvd;k_rgxdg#Dd&R-Ybg(8=!G{HHXYDY^Rs*hd=cI5{|^{O`St zu5@zih#uDty#zARk&m$KCyk8c>@vE12w#!dT6umg0S}b46FZg7%v(X>xD3j=3cd4? zvEJ`0V3eu%o#<7_po$;NT5dTzc-Hp`xU1_}&JVkW>xh)PX=E`l?%`oLn1R>{dW5NC z6wqn4d-}Uhm$l5Xz;z_BS~wAkWV0;{4A9>{k9>IWAQ!q!cY4n$U+*h>JYQF2vlC4@ z^Q+!|LFnZ*6Ohs7cy_)J&s&iZaQW7IK@-ySn|+g(o#|qIwrt^*_fZM%*@2%0MTX7iH^Zz&(r>XncpF}4$FO*n^l<&sK8Q}$uHbn(%}g$`(7I9r z9Npd1_*l*d*EE}uAKk7Nhxb%}n^Zv{Lyi4oOg7a`FPxGkR#vnMnPlS?7{KMp(!=RV zz~3$U?=H{`j!#svjZIAoMEG8(<0pD%EC$auqu=*bN`8-wxSa=Az4Cu5EAC=mBH~*& zGVLa2@^(&Xk^UV;zS?Bo`o;amA1B#<_(wv99Max$S+djnOoOpD%B4vtRNQ6*TUB)m z=$PwEA6h@y)Hj+z5W!h0&m%$r`l7S-9ySZ{S)YvwLf@52=Cc!^>LCaTFE>fFwh1xY zREH zC1O^;FU%@pyrk{G#siSRitSMKoqy|vTg2H{2m}St6LRUA>VAsCUiDRsAq<)8+K`D> zlrGiaPI*u=n$c_1PBM%1RQukVD%bIm2?(scyi|_eoC|0W$djdwm3F0luP@0>XU^@zGXi>QC+y)$GgWl29!wppndYp`nj6kM}`IGaetQt-h z1x0(QD(W`6mJgsLm-mm3 zA_gW**Q#2KC0Z8juo}q7D2O;auBE<_YTQU(St19W_Fz<>rTdq|+%L8L;o;IcQTzQV z$g2i!9Ug~z=NY0znatSKyC)3d`|JJJKfau&*OW6uRZ z7dzPMhtxnrogOX3~e`A_Zk|kH}TZA-qLXp)_DT%48 z;~mK(p5Kj%Z~VYf`1QD&r%X>@LYSJ$-EH&sEsg(8cMO)kK;mVPLHcqWlDh9>+KgnK z_3Gb|-(LcvcoH@t(D(6UKcwzB6=*dZClaX z@EK2bo)j*S!M{CuG{dvzy9siqZU&M%{K-WHBv}^I+mMGw95*ezX71*%V*L6$ui#bU z6PIjs%FA{(r%V?5=a4$}=?nw{}ptdVwA|7tCDKsU%1u9awnLh2x2 zF@O2WeQb`Ba(H<4YEkeM#(4-TPQ$-+b|eu*9JBiD?`vT*hd`-zm(r+^{NsARXo1=? zLeuG3u9C^JZupjPO{awlDOYCTV|ID|6ell?V#QQqfL+ALpy*jQXK(W(Z?HY{E*|>( zHPzQN9?QWdhHd5h2plgg@x+KdX$z@aq1j6&n_TJG3f_-MloxVgoL!Y2Y)lATLC741 zsJDrT!Q;9NRFleFFl3JpBb5gmiQ<#SKija!$GN(qn zqL!J8!QsG&tN&n!^OS<6yiAgl5&&!R=D_olSw1qGIo;QuC~>4*-jw!Ri8pCfYI|YD zEf{UWzxKGiFBT+Y(#Gr6gJUedWxB z0Y6T#u-ZUOj+!o()Y7WR60Xx(>C2Z?MUBamD@*H?4#V`8E$n_}jL>n8g5hB=TIq3q zyH|9?Z9RK)`I_VnzjD5LqjvaftCi-P*GT9Wr|7#g7DguGY3xwR5l8ZRyCu~c1!~qc zicOVeHnTqo$5_H&V86h0{Pi}(K%%_Vh}fmW%F&9bRLf-tI(lT29iH5dR!0P5$b=1A zKhyIj(_9X2F>dB%i?;e?!=~K!d^Yv(QdvHEFlcl&?j^2Ia_AyB)f9cSp{an@)&H05@v6K+|LmHg&3EjQR)Z<&NPfc@+| zaj5sP!{^EPI3v|rDttUz@k~BpY>U0kfUMi3_ybZ~8CCg|GCZ9)41nMe{TeJZ+&Q~E zJ^D^gPBo25#XOxXoy>{&Jby7JNHUutLhB}Ke4K`!OkZE0@q3j%)NqlGPY(01yBP9`icQ}ymb5=EWeY}bepbk0S zMWLjzT#R%@W(=A91SeBKMU}aLA6)imohVZ<*x&zn-BR~-e+2{7$&9dl*JEjT6OR2R zUcTKPflp$6f8|32u$D~wj>EeD3Rcqka1*Y}Pb9uJT3;Q{_s`j7*) zICsk6@qh?V*RLtZvrgfD57$H-o?=12KgIXTr*Vy@@R?uI0mZrv?(XK!&loh3Tjsb1 z6X~Dki~eIJ?Hh_(U1<@ndQ`GA_{^a;d7HD)d09Va@MF-1kW8u%@(Q z1EN*}li>x|xNP(CnHPz5kU-2|yI?t_mm3A;twv!sQ$=7WKBd}(Wx`-r_&3ymn0~Dy4paD2UyU=*w?c-O{q8%i3=L)Vt;{ zs>9hTNvQF<4TEhm*ZC@7s;G743u-r$R;}w(X!c;e$gXgZMMW`oqtA{161x7J!)=LQ z3(ssh%C7|Q2JH3nYW)`feAPL!RsYW1jVtrvtRf}4^PPeI;fw|&r+7R&zekAI9U`~Y zg!@(6$(8qqXYBKU)$@yJ>lvGeTg?ZP!DNZDoB6XhPOO{wquDh9W6>US0-w824{;Oa zB+a)2JGaJ^zGh5j1e7w8`uIascfQgL>Uu_yPP z&tHOQRzyEK`7T6MaB^@av(n$r3jn`q-!kb`w+5`OdbhPZ<%dd?U4H$>Vk+|RduHZ} zlm~Tz>$_|5XB8C{L67}Pn+H6ym{-6it^7jENk^97gA^(;ETG$P^v#D5dfeiGh;}%( zmCdsi=^d3uF5vt7^UtAyftCBI81m~wd;bD3JkuYz=iH!VwdG;!Hd~6|Zv#fhrGz*V zPu{z{_SN7fu9fOcKn)#C%`q@;aykM_OPS&&!awHOle_xO;YuPsfO8QNTK@V4_CoRA z(?`_v_FHhkPt`{In^;|U4b=i<*9 znHk7G`?spWczRqTnSTdOb-5wu>tFeDdg|yfTN@r3>0)i2HZb|t)PS)AmbwI_u5 z(^1j#&P{X%JqTH>=IQ%fU+vAf{63}RwhneOuJVFhOGpR=55AHVP~&(V{wY;kn`Lx# z8Qe2x@D+A#*EC>=@v?n%RA<#KuxZ1^O*Are3lC5Pt95wT-2L5;4Y#nRO ziBc!bhf}$6uTLwSZ`VZHcsWZ&nqluCVy64G5 z@RC_Go{J3~fJWE52zAEjRT~g6-p#gZ$E(str)9juM#djb2kW|rkKx%dcZV13*-qJ< zs+&=JccQw-M@ix*{D)w$`)_~5to8%lG!ZbM{*Z`s4Z`rhA;EW7B+8|**niwu#_{B8 zA^+*5oD5f~jtEY!5bChhnY1oaCoFL^1zV{Y20n@4zwcL1JCXj~Q^fjY{Stc8JIN)v zV=`>mOnYpmqvs3e&TY>3jAR%MS_KW~>4pv~URh~b%-G0jJm{HR^+l02%ZrJ>!;2%q{Eg7f?L3 zS|k(Y?ymO8r1}C#?p7issCn#!Qxh@>*H73zdOLpq97aozp{237*K{&uvr$qCqy<_B zHA)}1*ROQP;C&7H+})rAbE*{UQVKd40BOq@OrT3&a_Vq*naTF_^OAe^Kz~2Ki*1RL zmX$!610}PtMQ61z>+`2s>nk^Fgwbc`z?O740F`{13?P$&o{`S@y<&ax+P=>rSF-K)axS5;pfLwnF2l@ zn>U*Zr1~TT>+EjZNmDz=_K*I{d-;(NMDH>!zaK-K4rlhElzr%jK0lsj*fBwwq(*F>rhRuiFUQ3!?L%I@Nay_>?HUn&X@Rey|v)} zW9KFlZ7*JXQDVV+xGJr`hi}RGYrDf$8<25KL=^uP zm#c(ligh&H@hUep3BbSdf(gw3>Uz6=-Eh**7QbM?vNv8o>d;pX19Vru2zp&~AInGR zOH@5TJ}xL#MXVIzR|qY)y*y5bw*fa+pAv2cGHa#|hKi}MpdD|!!4|N&`4&vz*-Kne znCdK}M3DIKj+2LrZx~v!^r)eCrOjGX<1JSbB@?AiS(ceLr-!ZgjU|uUY|?AfX2UkD z5jI=M_C`;6-u#o9F;6R_3FXDZ<#Nx1tj2S-?Z)Y8C4(OFu_}ssY}2Js!4CvO^VL`207Q$o&nQK7a1^R*#AV9ZM-Ba*$>8JoM_9{j#@8*+ko* zhV7bPp={qhK#?2{L&43wB$ss)Aqg?n)?mPW9r8F`d&s<`NNBO=ikLatvEnzohbEBO z$p`U>DHOcPYVoFSwrF@!Z~;Ao*N&Gtfaf!=`Sl)a7)!v*=7aaRoxp+_2$~?&QzQ948A&6T~hVTW=I@7N}v6n zDHN72_a9|aqR_{ip%PAyOYcIz1KwxAT<*xC>^^6*+t2#-ch{3x^p)*zJzc3&_pjj_ z*X-cIv)-8Xipk)w|GlU#W`=rG62h?DrWuUM;PNkMm$)vF83LWNzi~^EAZc0FzxM-fwOM=7ax6m>@Z^(LQUhx+~4D{$MQm2Yu5iBNH@s zHmW1a<=$t}J#z~`PvFYTpRi1;wLJKa+mx1>JpXHOZ^!H|$r{%p(DA~PTU%7D74!xCt#ol=Z zSX`3TdG$H#>({4xX5u#{*#=N=<+2IibM2o_vlp~Co2Gf-%RwJ%;=EA32%RdFYkr;! zxlP&K4fD|9a^Uftmll^c$TArpkJT6O`0jPRyU|8`d~8oG73Gzzn|GL~{c}@59{S=` zc9UavL}d;dd!kIsU&vFY&*;It-{>FQ2QD4qWKIy65C4+4`0`cQ&85Z{I>^Y5ZGcrT z7h1Wc`TB$5PVx%xQ#O`>4O)e@V{S*QmT%gTNhh4wLlF#84n{mrzHt!AxmA?e(uX!N zb<;m859kK%E^AHI)-7&?sG)w)M*+8U_*6NNQd}(*k)N!pp0ao;dYHn~6brq=90 zGkBUlx{39q@miQiRqo?R@C))sMUnVD^)jR2Gj%@^8&J#9#KQoT!G(Jr9iT`78~Y6| za!)_j2L#x5IT~V~&*SmCMJJ!%v~rp)7qvJ&ER-{=jy^k-h;`_;ItLhJ-JiB=OJNMl zj}7ZLY+$fpNOVrWZc}(}-)(qu0gUeU;q>mm6!`qao;X{>E7up^j(Nj-j_-3MdAVvg z6|lm2;U#w-%G@`STw^j51T7aas4}5^1 znz636Trpm`k3v;F%_u>=VFf-4dlG1sg*u4!gL{NQKK}{;i^H=OnjRNPc3_!>meyk_ zdIe7O*Jp>n^qbQ7{J$V-CbXERF3##ZtP)YgQ}PT|Zz3hWJ~W8<9kV3&jm%K;^`ihJ zq(8e~H9-At5P;9-TPv*>zQe^xRhi>G+9I~&#KyZ*v6(&Y;uf@b-#U*Jv)b(nGcxpM zUY=XIO|79o00!_w`Xd;-iH7*kp*ASVNBUKkAH(Y12J1I8ekw7*h%v-E#;cU5m8fBF zrmu}`gN6<;88lbxFU`sm@iJJE{@9AnzI6eY$(Y0p3qTp#cNEB>E}Iqj6BzAJ+mOtb zn^D8YTCr!2WhkHoG4~v@|wcqMH z1Xru~It+uM>#xX9i@%uSBH@qG>2KjL5#eN!{mM@#6;5-uKV|~L0s&8hLLe};WFkLbB`z+grYmu;K zC+gnz@HkU<$k-+!(ZlUzrbincc&HEXx{rAW#uMl5`M5}0&2gN>)I?sJ&S)4vT~a~5 zm*J{+hOAEn0FqaxDEAd^gQvBQ`}5>^ks$vdkW=iuyh1`B;hp-!xLV_2&ewlyf0LYt z%txxMK7v90@u$jOzEn)p0N8#3TNia~il3&&3>y>T(li?0*MOPSr_N6Q zzo(QIqw3W|%O?zz{DK2ZwWUqhefdpZ3_ySXaGUcLJ78HWkYrY%606j&C_l7X{p5Di z(W7kuwLk4Gqvh7|n}xLMKaB3M+Fe|$T1T-6>Q=d&G_jB#q|*0w8emV9bPhWBM@1^W z0_t>pSQ&b?qLYg*dQbZFo9;cgc%jwx&h|Y!7q2c)YP?5uLd0Ve5+0|vv%^qXZiVaf z!06y-`*$~8lU1M3=e%nnKHXpM6%dfcx0tUR{0@Yt#mlK#FBClT`38vk&;g)KY>?nj%V^azL?boyoryCCJ`=FDFG;GXx#4x)&0D0;K6dIKX&-%p|Pb) z@2@H)%T+cGmeSHqc1av(=-EZ-qAowwta*)YH9?$?NIRy`#o;efpHZSGjJ}mjM z`P?6t9i6v%`gWFfB8M~|gk4A~-sX1L1^1$TK#Y291|c5gSEiB@DXbRTwf<2=YMFd? zrXW`PA+m}F&@%)mm$O_Gx04e;F*$Wk3ZsJ3gze-a36yPbAD@}hrDFZQZ|#2GXygJZ zvQYA?4pufb$W-cpYMyJ89*EpMX!hmh!1~eFKqd^XI(qf;F#p8`PQ>aHB4KuxDS>3J zTGX?zxRP`u2v^?}B|VNNt!4(z^qx7^pg^VZ6yC8{vw`2MdfSP^16)}cF_z?`<@&qb zs!dQe(q+vpt)Q^bdKPxRDp2s@|4n6j9B!$D8AJ+Hn*65Hs^WJX<4eM;OnVg}Icu?? z_Map8Ka#KiJBO%%UqkFJVgW0`|KH5*Uv6gXyl}mR$b-dP! z6!dlbz+akYq5_#QrIkZ3)u67GTrp#8XHm|ID|F!^k_YQ2`a+MjI%QjKV%zeWA~jAI zJR;9Czd~n;NclyWnMr};)wYvA8y3DbAHVi8%dzNcJlt$5Qa9a5-@XdFI$U|#ubVqb zc{w<-(HFTL=cV{9%6FLmzT3paWUU9!(_@fzvP3QI0mFnjfHJvL=~UgptQ|R>Jzyg) zIQVz5;M`cI$n!z&n)~6Rsn|1L23C@O}ZyrpZ*(tC0t|0g`L?g7>5=0il z0nVZ#Gy)jF^u1==^}F`<_ zs=ZPx^>Q(vMS>_OCxAll`TmJHhvjO=PB6@DaCd#?AOtYQEz{6ZQFG`RDA|>BmA;d( zt5K{EeXchCfG8a9f3LvPDX8inYv1i*3bTGmE;~wUhzQ^ysM1~v+&$#2U4yCb76gO9 zWwr6ib}otD;-vw+eZ;W2Z`Hv0&yB=Ed$^F(K9m&dx%J#CbhY7E6HS(qo|W2S-%TE( zd6wmQ$6-*S78*9UPSb4@EbNbMXAGVdT%crrDxcSV+6?2-$2{yAn8f~&$mIR$=aZEz zwDfx9QjL6x1N4Jg2c}2!gMT6>=GD3}NO;>}K%C7I^)(^~g4G~8P=l2b-Fhpx=8TMG zJ3)7h$KtgX>$?`?Izepva`evkpt5n7f>fmO>8OSEdkvM8TcXS%JgomLV^5|JYw!1c zYg%kR{=raG%OSJ=QROTs4!6A=Z^>^3COov`wfoDa77Z&2iJX6n{&Box8pQ; zSF@J-vUDzcwMhYrAyUz^o#rcIO(tDUP3wPFTK@$-2rcOHlNqtV@X3XT=n>b=riv|WQnN5>UfU7 zFyQFq?(XEiZO&~yZ*=yhDO)1iu-ek#Sz^%oWt(*hY-#WReGP|*Vfb*w0M~uFyYiCn z??)5;qL)80nj-8lZDHzhvaExyn_rq>n9cIyK0G{_UT4%7*j^S*nh^j7_ljhHR3L;p zu_hiBnB;VB9H_mtJ^mV5Ljqjey_|yV5J&Akn z*^`S`5dk1fZPF|kVX2I`d6hjzJ`Nq*=eEH`mH@lCis=Dl9F6NY^AVs8T~@{BI~cUN zZX6DvSSZ@xJCOp9UVkiO?6E)=f@?FSsJp|guiLv%Z{wIn9i|S@WD1=7%G+`& zDYxpi2S46P2#`A@gX{w1?z4K|v5Rl3UT@TKy=Bj{JNa;yh>uOnY+Zzob?0FxSi#X3 z$+)@07j?JPP0phOg}6q~!|zo}RsuH+>mpOQ&ATur6yG41<}EL(V=?Kl%`GiK%vU6j z1SBtyrfhDuv5RLZs4UO#we1OMxu}fHS4sz0w#GK~W zWYxd+-!w5huf&8 zwV8cTsm4p_OG%B#T+@`e9>c=}&%jb~mZ@W!5?^lHfPp`mApZn14CS`q?avj>{?v2_rKO&+GX2^~p z+XHv@`s7yBW)7B8tx5f|=AV**@W0hlGtsk~#gNoh{^|HEi2Tc?e+k%-U62OgfpK`Y z{L9E6|55~XYl1!7-M2iN^Mrmzv=6%7J*ipR07yqZ97*yh! z`gKq;jo#i#)Na^ufRANs9(_F?PyRXp>fd=iGP^oZtj0FE@MXSF5w^vBWVI^ujy6fG}k`5oZ&>H!ZEriSd6-4;}$0 zJ^58IVnmMChkH*p8H4SxR*Ick>ka}3LubBzL5oo~3tL01A^jZzC%>eazWuZw1l2jJQ1jMr zp&=ET=fnR<6_(0brrkD)){nTp0EwaizJu}ymPkDQk*pC0oPF73PZpNE-l!G#6LT-u z)pGp=Exj%O1PVSrmmX)xOa%^sjV6%z`Z?;r-((yh zWnlgJNvF?g^QiCR_Tj3;QaF5PCoo%TU{yI=4lum&ytbw;_4SvU0*plWRkMm{Vfs@< zS<64=Pgljl=U8tumWNWJZg4~rai0sjHCty@TPtLZoxSPuzWTlu%=R{z@|^MmT=t79 zH|^NbLtSuRca5f+H+a&B5_F3?AFg|&fORfo6G!p5m#FmUH_-8-pVnj|R5)dP{uz+$ zKmAzZ6M3Og5WQ9=tF`wxr$N^fAFOs*)L9JhW^6hVySFa2S`=>nAdJ^eHJ-85nCn*Q z-`RvPa5s;1rp}hb{kojo8Ieyv3kd!DIft(09!+m&1jYMQX|fOvc#A0~6Ex8J03skes%oFeg- z-zKYi{lSs2+zM9(C{8c(C9rLHqSn{GF?Y0C3L^Dj+kBU}+V^~^9&GaAvvnHE`| z6h!J-=_!0_Ktj|4i2{rm{u|TrUuBaloAV5UIEl=@S)=ZlKm^s6=xk4~xx>SP)8D@5 zfaj8C-`BufW*u0u-u;Rowo;W(t^zW2sLj6og{ooGO*L?%87|qPhGY}CNLaj9gA9rE zH5M=u-!u6txNQy}u4B2Zkbw&SMawd94gH8l*`tz5FRQ+FgM9BeIP6AAo-TIc@R)m| z(k;n_qzQRhOz)7>l#Glxp*jPTa4^>I*czu^vDp(U)r)xe?0XdNsB%= zP0o$=Z_&tEP|J~l)V1<~d+$Wtr9`Mku}b$po>|6Av}W;VWp;u_{9&@LxG84QnHW~5TA!mG<^RVB*R zAJ)2?hj=4!23!9NwnWlEI3?utzT7{$y)l%tCQ^bA>~f;-6T*l&G#`2KydK*PaVc#J zQ?@b&$1z6R$H)}9YmnD9tgh`Gm|2{u!tzZjkIUje92x*G>b9^H*Mflg4G(KY=c8+l zJF{)PPPj!yVpfy12dBW@j%dCCjYWd49rF5_XZ!IewcwmB!M<6UfEwQI+_xWu5|YjT zuJ9@7!$%tWbza@h@9B3vj<@mbsS*mRP{7aqx4frxLEEu@b14#*m#ppS>2_436cPMx zG9$<2yPs|MR@X>rf3$C2HEZG3>X<)%cPP_-9jx?D^YhPx-OFM5j;RCJEp6gAbmJ4v z3JPPTdT7B)X6DDy!TmXfXlc$68D+Y*x_oBw;y6zHy+fqzKAjhKoQU zs3@r2Dq?Rc|Dql%s_ZM z#8j33rlZh>@~D1Mj;gFQ5caXIYmSkMDkLD2NF5wD0u>S9L@30yU@9NGKFnc=zypRa z)>$G!9p`V}Og6inyul>d-XI+(&I&F5FD(FMtmAhum(iWrEpR&Y+`Ump?0pX(9iCCF z%o!4y#^EG$^Ns91OebLEtY7g8mC9KZX-4ItxHDiV_qeqV zGgWYAV8LR|5}Aws&l4*CRoSC->U}(6`tor7P&bwZH6jQ#)2@^3u0&*sfo8KN_l=Fw zG7GnTn_R!*?83cC-q_{4e9;W!viHL#cIQn0&GuHuAnXw_>qzV4_GIr z851<=+0$abqoFB#^mcpBV1()vsFZMUa6q5z?V$dC$oK^l*4#Q}3Po^0rb5w#wfs!? zFX)dj%wLbg*=;HbC6}PAA?E(ZZnl~^dn_i#tJ!fiqiU1(*GyVYPDk$7R|ZYzyjLgj z(4)nAtI1Y3b90TDWAfp2;e1D{tkvhoM;l}566wm9NQZJmd3BtQG@R|?S% zzH8HfMPaK+zRgnhd?^^QmFBt{&UhH3`SJG-2{$w>ik)tFa$TU34P2RjcXnlPoqs~- z!9VuTu${Y{ckjAYLNyITsaAq}bM-X>^E0S70ncKaS|6+7?VxT*G5B8w&Kb4^NOfWE zRfE^v1cH@HaD1+Hu&6Sx4nQr=^y#bE|E-7b@}FuRNEo3?2@U}AV3VT=P_P$-l~0SW zz=gl}Tjc>6`>=5IZV+s6A*s6}7dUUGh0y$u+P*s)&hA}wB1K7*AVh-sMxsQbPShyL zs1YSZ^j@O}qXv`0hY*73#wa0ChUhJWL=c3*L??O~Ey`%4-7Via=l;%G_pE!?UH80y zO?lrv&whH{V{b@mnsuxoV+RCSA|9BlIwUB~=Ba!8Bs1%4502;xV}-q z2!VuCyC-&G9D7zzyEQ;k#CN_5>(+d_6~_#HMjSm3=E{r)E~3aI#*nIC`$LPR(sr+P z0>WAG=+!$GiWX13zFxkpY;Q>mX*Ag{#d%U zzP`1#CbPc(E9jN{IT<^(kBui#n(DQxYrjUdUl-%9QM=2KJs=vHZcEF3B>+UKI_5i# zgh!8LJ_iW6LGn!k4k&sFX2-7`kF4jKX7vhT9N0wh-gG{XN{kXcHQan(wzYX18dJ%Z5ugnFX_rH8qILhy3x2NNJpz5CauRimb3d7>X2#$pE?>CS5hNNAHhb2{e-^LG6+>F=d%z!WR*NKVuZ#pU z*xTD@J{-(cp#0lX(6sj5JKdMYyx%L?_K~0z+tKkL^C2HI4aCAQ0Y867TAH7kroyO` zqx16I+lxxtG$9E7c*hDO1eFE>SaAHjQ-x8ynyv8VNPMor_bj(p7ad#?;vY;JC5^R>6NwSD>W#X{J|*4AAGY?n8f zM3iql5XsibQ;xhmxv;RXx+>?hI?6Z;%0MbuJ^f-c*<-=V_jI;5fdaaHTNexjR99c% zl#%4-K6@m)W^+tKM<-t6Z0Pdl=x`r&ns?ZUK6|zgdOywT1Ck#!_^w-(*>%3x$;06S z6&1g2&f^~tdJo+Hel~3Z`aHodALpoDI;pb(wD819NlHpeNrBj&v6-!-ekY~)8;L{; zrH6u4PhMnL*hc`(&g$5#M~zxeZQ#DQi3td)-B^hm8yiI?HCB6E{y4c~uC2wsM|{kn zda)svL%PMK7r>6sC$Z!^GqNPo1kq+baI2=wkx|OiBb?(&*29Kx5 zW}B@)NJN5peE=I2irU{^kp)d&B!bpI_1~^Esi2@BZmhzP2NEgcyOyDo7eFTE8DWnW zvZEu*0EVhvHzHVtP7=b#)~lm6Jv}|(@B}fj3YU>eS%1=B!83Dn-oJn0p6#rH!*IgG z!vRE~h4bd)N1M&Gau`fv;{4>~MHZI+66@A3^c}EYG=ARR))p`-=rDEk8d8y_2tffa!zXfS|to$2GjEQ1Am&&F67u^pHJK)}ed*lc7+G)2BfaC@$_1KsF@9 zYpEZk4Hx+0+8}?yV40?M-bF=4I(g*}5(TNLsn>otlwyL&H-v>B^2CX`jt*9bl{{+> z94xcfQdJEzxaHcNaZgv5xvDofI5>*qj#^GHARpGaDk_Wb)t84EdSG=iO&%VejlBcF zMp=v2x*49W8Xh6@v$KI4ZM=elf>BXX*HofFp;5`@l<`*%c*F8YGvnX*c~9&dSBk-{ z?Tw9m?QCU0VFd++5Cp8F^p+)=?(&nlBrpPU$9p+R_F1Kg;Lg?-TG;YyKi2q9jkYWP zroLvHqzLNhfUz(02iBk@OAl+rtW;B7t)478TikH;CuMvEw5BC=%t9Ksx(oEMYT7?L z5`{K5Hn^@`J4^AxMDQ4pxJItqxC3e*jDWGKL+*0L=wgj3+^1UvjLNC#=vcxPN3UiH zgu|7&j|7+!Y~gS?6BAQ*R#x>R`Vs?n@cPoF_?Q@2T-%e{UD4^Osg`JHg9CvlUhNVT zDsS7)45{{A=YrVS+j}N@@VzD$HGLGYEYjEqb7gBE>e&;4rS!z zCZBrv;wNWQcRuqLfJhZ3B-45v(*5>Q5-iDJE&p2vGt$I@}{Q1WI6{2heku>>(}idCHs`a zK9LDgZnUy7+abTd3=dbF(!FZ3_%-A_UUnyKwj(Tzs>VdlcWnYlSVj6a@muyiDxl=R zc)w2GZID+4HwM3bahfvfvWOMnENOI6W~Sxw(IJr1)k0aZD{n~soD?q_ZA6pRd7x0t z$B!Q;n?iveOYH>xq4Xcb7oPMQDu)B9FF&iTtzG^@(bLn@z`y{|iWq-UWsZ1;;zere z2)+ElLw$YTxHca3q;7w7V`Jm@@2ZF}MCRZp%ckZCRsoQ6Cure5e+HvhXlYjCD%bdq zSx{MQetl`6$n;vUuAbhBfr-1A`Zy$?PE34x1z6RkB#4)j7V-TpOySCvEBrTa zHe0zP5EL*lASS@gJqwr<=og^I;^X7%yjK<{F!oqI_-9(P9 zN}PvEzkO3gYbGWq8)|D?CbN_fIPU=SEfsZD#46ZCFtKA6m@3c_YgaZDbFJ~Y-+43c z;I+MgsA)lyYT&2)&i!DM))BsZfn*hEWMrhFK?|Gl)w!DOd|vuP&%vfjb)RE}I*-%3 zj=dA$U!cIza)JJvbDh!M=UDePI)qpSjF3~`!eg$fFd~>~n!7VWTg)ktPzNd;I2rVu zG7ALj?^MZtSeG$B?$KWdY%IGLH5IXW(aCyA3`5fRy; zze-EdoAWmw<$_57VA3W+Sj{q+lKWfBOG`a~1p|hGKR&;tWF1(=_t=+=nqH#v^705( zKR>C%(q_ffv*_;+G&E$93*DdnHW!K;#>V2Tyua_a- z zBy}DipPl^t{Fas$pk~YL@xSVP@D{>=@Ia&K6>RzAu1Q%>l7QHox{rEo=nZjum2v;SQ}0wV%&VVe!`R$^7J=j7x- zQ3vj+BPBs1QdUN)s%oxa@aCU=*H_2tw9+IkrMz6KWKW;F z@U~+XI1ggU>R^FXahI%)!-E66uCyB9;?>qlBf`{j)E+!2^Ez|6$$j)dpT(VBWuCb3 zL)p~S)Z2SI@6m@7ufo`PWOUS-$bUaPbOrDGd3)FitVAY$z_howgLQ28R?6$5$~u79 zni?1+#r?UGl2obownyCT@#!n7SEa|mIs=773nd|%H;&bIZ?U(vD6)%F|_IWBZ_qCa>201~*7X5uV)M`8}?s zsR_;_QU@)7hxMTZo-Ti4 z$CiKKqepRyTwwB&g!4kqo?T!0VGmTR0N=^A01iid6CI5@+!`QyELG_Y8@1-mf*-gi zpH2Ad#fuk6n$do56JFr5<>fi_zQ3Q~g9p|M*hwgKyg*+lPgmN$D-G!E<*~W}C6!kU zrPi%<oH;<#&dk`jx&40r{5fDi&E*ylBVA_{laP=Q7vJ!eA^-A_ z_9bm^=dxC$4QE(mVkW3y!L1jgRBS{IfiSk&#H!^WX?{41pAY%k(xU7ykX2Y1S=3gB zE`z~fhK7dNL}PP$Q{b?Wx0VFVi;OB>Gl)75eqz~kIb~*mR*}tQWZlICYhuAA?TOI9{!EnIX+-v~@gOLqh{ROp41T z^#+?2vr?V$$C(umI8_Y4d`V$;Aha?c32bW=JT>wh2j-d`XYy5v<{#Hc?y1Lkv{;`_ zcTcPGD<&UvBE{_NY+qlWLMR>1=l3rVl-YNt^oBt#;v@zy|pfwsE!TQ6w7|-y*BloaOU!p#>%~^DjrR)LtPHmY- zOTu<5a@vab$o81-aY(yG_tmrv{l_1V+-EncspA&B0}fB;>(ZHC58>4w!qwFW9g#%H zk!6L^X86&iu0?nyfZ#kGHCotVvF~Q0V}8CmUBl0AH5R;9x?@ev{z4KpO5Udh*zIx* z(@uD3E2hon*510NznazZ3@ee5#MW9N=P&D7e5U|EIMwYQ8Oh1XCOi5CGxjpa%Gu)K zcoKD77e;n3qa|GSMJp7$Ns3s<6MA`>$&s&&pt$s!f%kFbNP(!nXDgB9{#BjgdofMt zl<1arb0|@?UD}T8(s56iHVR@cHABKKODLu9eOjLc_&ToReQf+vGdBZvi8uGv{?(=rBzoR8D(%ox(uCO<+)D_ zr1t)(v5K}u9>e~4ERmy0Rz?Oy6~BqZJOc4nJob3&TM<7GMfBArIqN)UGzju^b+0FO zfMkggwy2fj!WlI?jR zcg-Mn?Vh9Z$c|u@ zgk(`h#@+0mZ!IlA?HCOWkByD#3=Ma7b~@UM%U4jYl&->E^eXA7s6ZlR9Cdt%z5{yM zWyu!|cGzN6Z35?KK%QZLclShJ0LQPk7UXrnLLbPHgiU05sTc;|05StMHrKJ~3O9{` za_jXpu&<(aE*mwHm6irhVkpb0jIDV8omJ2{;xfj^?qA3fkEMpm{kiJv>-CFFG7}Zh z!xlTbm4Bx<_ENGJI=_)SogmjujK`um2`Af9Q6Z#kf>0timxqrpY#L-ls(}((Ty(T| z+J*MG_#U2)xCB`B(?L`uV3YnrC%&SEY$F9$5mVV z;u}^J3T3|^X}yU|8}i^8%_`jjvEMZ=t|x&RV0pa!ahl$ZqrLDXPhw`_{spY_%Id1- z1MlAU{*aIm;E8~vNJyhBf#(YMBXdeC6uD|Z=EcDQ7@r(;s9q&YM6>1=n@TG(VLj8! zb_r;+2ewPV8(>7dQ{%=;j!YSLpEeBIM`VIbOmFfVU^bSQmq9RES}IDGyFsq!Cb9jc z*AV!?)+t7nH1Xv$FdJmiyq+gdCQa=Z!|1gh07L{id9Gb zhjalc)jIdTrF0aC;E9x)PHnXJ8!zTw?Crv-Kg_wjeAjj<>aML*2LceB_Z+{m&l!H> zy44TJvBANdx>M?l$$`1{s}%)O{z6QU=e(@3bdbST=ziz+DyY>ycd}Hcge*@(NA~ag zRGoq}RtV>whHS%#kmrG_(hv*i$=#vv|8E~1w*B|;t)tR3o372Xl(2p z1Tye-=qBV7{eAFj3caTw`)`quM!D-8|KlG;AOC1u{MW65GaQ%yfvx4g1;VcD*cdoj zTE8jj1aT5xKIb726I$yN{ z{^xPrefaY4Wc`2M!LVv={O^Da7uQ8{E(C&1)8#ka>!K83u{x2q6JQ<%yt{{GrCFA_ zH#U0ksb>z z7<|hxFE+yVITDq1^IumRZgQnZ(a>1-Mn!#$RCO-ag z*?bFS2;F74>r}rKN4=QIksa5>qeg>x_e+{0zaZqNcOV0d-Z*pWSql9yQuG zB2+!034^_#(6q!%1kpp~oN?|;frVJCX*p@D{_vc#3`d1))4nwDLR~2C>O0C4L6Gd} z;ffPQ6`{QZ&Fek(Qa8DMHkG(~QmKE7-@bjcN$wj>a{^hPhCN><)6mvwm!Si9%Oh;6 zL@71wccGyc)%`n%+_3l6Yx})Z6o@eFe9^AgOLZPxTwuUoO$X=1ty`jMe0~QR`boiNQX`TlCoK~NZ5a`QX0 zS@0fkTFulrC=e(NP*bfzZ?8EZRNbJMD*Z#UT7MtQRlkS&19P4Q1x}*HHn;|NbZBU( z4zX^r6IIn0IUcZ^UR9N70LEu#Do}Hy$bDY zyA~b>7Ut#Q()?zd=*87?bj;10@3=L19oTGSyD&j&|Hk1}AJ)^Hg}txM6<6o4sL;g7 zog&>+QsQoPkISuBY?zVMES5;>v;$>>g!B^6o%$>&>UOfa9eihPvWbP2%UQN6zcz(| zk)2sJ(U^14ksqeG2m=XEJsD3<_$8DP%=)$k$k!?km-Wfs>3W*iZf=096#E#toZsoRc^@ z3hM6wcu6>NY{qP_rX5Y4wTeErao=hf)>?{n>T%);Fn$F z7#Q!!&8@`)YP=SBG1PX&UFprZj;)-vcB~g`7{+Wp+jdHGg!anLwOXi z(BQqCAGr3MA*<&}Z!cW0eoJ#nEHLmA!7N}>qT#T-KJx{Gj-laJ-(CX~;REl^XWC7c3%I0d3ctN zjnNA>y&UZmVa=;aOO2BDSO`-HJ>H+KCb|@TcH5!T(!y(7^PCBl6_a({#*Wm0^lCi} z8uV$s^KpT~SB%;2aA{&LPF0`o{K_4lu0l|}4^g^Mx@Cg+j@dpaDJi*OWkHI7+co2U zZsRMO`^A+IlS$^0jMdZ&&u@AMs6QfT(P@4RtaMB4dBT2qZ}g)G)8Dc?%llUcq^bcE zdcJB(&l+$%mC>=5B6avvL?p4SbSb~1u)%$E9}(~s3Q3ogYyWHMb^*VT-*l&#WC6v$ zdNk%An<%ADJ$HY3nsR%DY?d0r3jq&^k4v#1sw+kmlt3U_ACJ!xG79tWinlj{zm$O7 MSJG50LRh@~UmVIa8UO$Q literal 0 HcmV?d00001 diff --git a/graphics/forward.bmp b/graphics/forward.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0d5863645a2f20967a959c62d4348b064e03ef7e GIT binary patch literal 2814 zcmb`JuZsdf6vyZ4fkg~gTtN(rNrMMx5f21W4#B2^g8Bzs6Ac;+T0|_0h+s2n5d0H7 zFc^&{F&G4k208D`jyo(2gou)~{QpZ9j&+kNx-_4`UBc}FYa5pK^5d6UL}Zu3&- z)?5{`*=*YFcClFe&?(7eve9U)Rx1VUN(k%K>vcg8B9TZcmHO5x`FuVajk?|LbUJ-F z94J#}$6~Q~Jl^Say5=O8%lUl1)9D1f#2yZZp-{*i^u9Zj$rK6&i47Yzo6Wq(cX+q! zbUN4TH6e?|LKH>ijCnmA4)=OJLeM}p&r=eR4M;XZYPA}osGMQ?Xf$HFE+w1I;?&jI z%jFXB*zfoA`CJzmi?!I7%Y~+?0Sj7e24)KXJLqRqBRm$2vUx0+V>1iW>GXf3tzg3f zLf-H9AMh5jkH_N!m?H=2TR&;f=QF+m{O2rXKcP}PhR#HjYKYBAUmX=0EMTKGm5fKrE zg@u`4~3<-Ju{CRYA^wgAIAHf@4iK~OzV z*YDrIr%#^_(Sl$7zkmO3+_e*XPRI9Ww& z#G`$GzL0O6z5ed!Uf!EGo^-q2NF=hoz5RVoaXOuQdwY#Wg9m#fguU(V?rODKtJUgq zxqi(lKA+EKv+4Ev&CSi%*H_A%vNtw1>~?!J8vVVPc)ebe$ut-Yfaln$RBC;FeKF|A z*KW6aYio;RqYsrzCCE6R&rc>3RxV}b^z`(D%xOzYOYL@>kXo%~G#Uj?gb#;9WhC{E zMx&dX8^PxmizOb96M_b+z_}nBs{xCRkWeUuS(Idt$7AGFDwT@G;@R2R{r&yZ(-Rab z<#HKglg!)W@u2F8?0&z0baYgyR8anUy^enF?(Wb&JUp~ot>fckbhQ9GnM`K0*~7!b zTrP)n!G_%4-eQ~>%wp_xI(>0*k;!DPudlDJt|%MDIX^!?IXPK?jdEh?$6~RAg99X5 ztyY`OCYzZ=BJuL_GILEZ*gu?fIvq^pENc*9IECm}=p4DAbJ1MFGYd>P2Icy1Y+5u? z-slg#DyOCFeSUtHsR`Jap2x>WWq_O)n}LF*Y62SscyuoZkh24fZ9oZVrD{T*=$@VL zaxlIfOBH*RffdNN%m<1Rc6u|GK<6E@caFQ;9|q|#>|om&TKxOe_~0- zBUz-(-Shab2nK_aQOt;ImEw^LGfFD^`};bbuGi~vY=j#O2EkP?{tlNI1|YTzEchM4 z4nZQ*e;?d0!0+tr2mGCjOqKKFomzn0Gse9!Qy18t)61H*kMxmTb9cGOp2Rnp15`>zn zViYy`1dl4MmpCb`yX@BNn|pqSCw8Cw@Oa0gS-e}Lbic0s{{6et!h+J$rT$nxq7swp8E9Z)3ax3;o;(6t9pP+?%cf_8x_U1HEQk3 zl`D@Pb**fwd-D6=!Gn%lqqf?d&o+@_`m+1oyLXL^jWK%ZqFk*PF9yDe(Zcao@J)k z;+;Ep-n)0tMaj_6u&}&5eb*GR#RV33{u$cZ=7QMrGxbDU1XI?96u3?3404oqO!K@b z;ke8rP|ESo(igo7=YnE-6y^o(=~2iFlIc~j3##c=;0wCbs}QAW+@qkSIk{)SgQaJT zo0_H=UFG0%TP3_Nz4^+mTTw zxveQtaC74+RSwbE2S?K;uM5tAGV=$6h)xN=mL`&NMfQV!xCWvi`cd zy1KOkkU8c2^Upu`^qo{Gy<%SP+bK9t;vosdRIjBq_m{^tXXfYUZ;UvzDfjo!pEIi@ zm+f3bKBeB`)s`S|Nir*rmCt)=6I0T+xPG1&z~Q>{>Zx1r%!+V`ZYxBYw7)q z$BwzJ4U3M9>~vdvW%tGxj~+b&O1*ibBh>k4xB2TIKPsxLt!Mfid;AfYU~Y-7%rcwZ z-`~&A&p*>AEj?XbsB^{p@@~zgHs?=2ExLaF`q89`dH$!|+}xf$e}4Jp7ohgvAN2q6 Xe}9~@cjq}^{$lWS^>bP0l+XkKdTp%t literal 0 HcmV?d00001 diff --git a/graphics/refresh.bmp b/graphics/refresh.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4362bcae1937af2fc245cb1ac0deff857701a215 GIT binary patch literal 2814 zcmb`JF>7K$5Xbl0gEV4sjS6BRR$6#)HsXOG$`MFs0t)H}xGrd+g@raEHW3ja5HKJ} zECfNsHV2|Mf`t&V5CscC5G~|#f8OY3WAqtM7v3_vv-{iGncbcD^Vi?6Oe)_|>+z}A z-xu~x>i@IWOO18)DwKY|pG+nLfxwR=%hlCYEEa3G+XC#BG2V(sqiVIxTIJ8>r_4W01Iwj_Y?Q}X_E>|j*x;w3SyQgyps#-5*_^?Ln#-HukVSmco* zVLqRi%jF$I@9u0iTRNR)3>CzkL&Q#433IpbXu>|YR2&HzrvZnJu}CC>C~hg`o0Ups zJRb9PCX>mQe>@%!y#8NoS{crS`)P$vrz4tkG8?c$p}_H_Qi|;M{ERh>f_)vJvi`*MTPOtBH;0LzeyU@PL6b z_xU3}pU)E;56&mpH1?Al;K#7hXvng0MhQ&y!3`jg7(;`x0a-SbBAaBH4e$r-<>iII zsP~^ievQRNU>rA#GvEXovs^B*0p7o#joT|yNfyll1MBeXhyl1h91P(YHq2@^o3&aE z3`7oo5ch^25iGDDA0I6ii>O4_`e^sg9;9^SBXKUtmzS5fx3`QTPDpQ}p4hMzuQEKk z(?!s>S}p$YiPIs&SePv3dHh#|!(pz+t1Jcv{V=XxufrAiIl^lEz2j3vA(2REG@8+9 zB(Y(-PNzGV>P3KzjNcJtQ2223?~~1Dfe(d3GLsIf;_olpedC~q-h>?flYnz6ZA;_N0q0iCz!^mBrx_58MdX! literal 0 HcmV?d00001 diff --git a/graphics/set.bmp b/graphics/set.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f256b0da13a5260690575468a026f45600d6aee5 GIT binary patch literal 774 zcmZ?rWn*Rl12Z700mS@J%*Y@C7Qev6z#z;G!C(O(@&Et-2M->UmX=0EMTKGm5fKrE zg@u`4~3<-Ju{CRYA^wgW^6uTcKrNW+fwGStJpwx8&6_twsy}k%2+$}Z-2*feqMk_q z0$sj)_imv1Si=+I{_N~*i1!JS2?+_n@N8>qn=oMlLB&(1OsT4>0;>P|^(!#q`uqFw rXqh~DGSF~fN&~6~`Vpw5v$HcdHy0S!m>?%7r>Uvw?c29Nl|c0X1njeS literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..0ba041d --- /dev/null +++ b/index.html @@ -0,0 +1,402 @@ + + + + + + + wxmtxy: a GUI tool for EPICS + + + + + + + + + + + +

wxmtxy

+

A GUI tool for EPICS

+
author: Pete R. Jemian (jemian@anl.gov) +
version: 0.5 +
wxmtxy logo
+ + +

Overview

+ +

wxmtxy provides EPICS support to users, + allowing them to define a table of known positions for an X,Y + positioner (motor) pair and provides a one-button click to drive + the X,Y pair to a specific table setting. Also can record + current position into a setting.

+ +

Several sets of X,Y positioners can be configured. (Each + set is separate.) In fact, the positioners do not have to be + motors, but can be any type of EPICS PV that will accept a + numeric value.

+ +

wxmtxy is based on wxPython and relies on CaChannel to + communicate with EPICS.

+ +

In the Graphical User Interface (GUI), tooltips are provided + for most items. Moving and pausing the mouse over a widget + (GUI component such as a button or a label) will cause a terse + description of that widget to be displayed. Moving the mouse + away will cause that tooltip to disappear.

+ +

For more help, explanations are provided in the HTML pages + you are viewing now.

+ + +

Example

+ + One way to learn how to use this tool is to work through an +
example. This example shows how to start + wxmtxy, configure it for two EPICS motors, set some positions, and + save the configuration into a file. + +

Purpose and objectives

+ +

How to use wxmtxy.py

+ +

Create a new XYpair

+ You can add specifications to control additional sets of X and Y positioners. + Add space for a new pair of X and Y positioners by + selecting the Page menu, Create New X,Y pair item. + Note that Ctrl+p is a keyboard shortcut for the same menu selection. + +

Configure the EPICS Process Variables

+ + You configure EPICS by specifying the EPICS PV names. An editor + is available by selecting the Page menu, + EPICS Configuration item. + Note that Ctrl+Shift+e is a keyboard shortcut for the same menu selection. + +
If the chosen positioner is an EPICS motor record, then you need only + specify the EPICS PV name for the VAL field (of that axis). + After typing the PV name, keeping the selection in the same entry box, + press the Enter and the software will check the local + EPICS network for that name. The box will turn green if the PV is found and + stay pink of not found. The checkbox + will be set automatically as to whether the PV is from a motor record. + +
If you make a mistake in typing, + or press the enter key in the wrong place, you can Revert any + changes back to the default values or Clear X or Clear Y + to clear all PV names and checkboxes from either of the two axes. +
+ +

+ Figure 3 +

+ +

Create a new Tab

+ You can add a new tab to the end of the list of tabs of the displayed XYpair + to document a set of positions for the X and Y positioners. + Make a new tab by selecting the Page menu, Create new tab item. + Note that Ctrl+t is a keyboard shortcut for the same menu selection. + +

Create a new Row

+ You can add a new row to the end of the displayed tab (of the displayed XYpair) + to document a new position for the X and Y positioners. + Make a new row by selecting the Page menu, Create new row item. + Note that Ctrl+r is a keyboard shortcut for the same menu selection. + +

Save the settings to a Settings File

+ + To save the current settings to a file, select the File menu, + Save As ... item. +
+ +

+ Figure 13 +

+ +

A save file window will appear. Navigate to a directory + to save your settings, enter a name with the extension .XML + and finish your task. +

+ +

+ Figure 14 +

+ +

Definitions

+ +

EPICS PV fields

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fielddescription
DESCEPICS PV to use when asking the positioner for its description string
DMOVEPICS PV to use when asking the positioner if it is done moving. + DMOV=1: not moving, DMOV=0: moving
EGUEPICS PV to use when asking the positioner for its engineering units string
RBVEPICS PV to use when asking the positioner where it is now
STOPEPICS PV to use when telling the positioner to stop moving immediately
VALEPICS PV to use when telling the positioner to move to a new value
+ +

General terms

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
termdescription
EPICS PVEPICS Process variable name. See http://www.aps.anl.gov/epics. + Perhaps a document such as http://www.aps.anl.gov/epics/base/R3-14/10-docs/CAref.html + for more details.
EPICS motor recordEPICS abstract specification of a positioner such as a stepping motor. + See http://www.aps.anl.gov/bcda/synApps/motor/index.html + or http://www.aps.anl.gov/bcda/synApps/motor/R6-4/motorRecord.html for more details.
XYpairset of Tabs in wxmtxy belonging to an XYpair
Tabset of Rows in a Tab of an XYpair in wxmtxy
Rowspecific combination in wxmtxy of (label, X_position, Y_position)
Settings FileXML file with specifications for EPICS Process Variables + and saved positions for the wxmtxy.py application
Text positions fileThe "Text positions file" is a plain text file and can be + prepared with any text editor. The file describes a set + of positions to be loaded into a Tab of the wxmyxy application.
+ +

Files

+ +

The "Text positions file" is a plain text file and can be + prepared with any text editor. The file describes a set + of positions to be loaded into a Tab of the wxmtxy application. + It contains an arbitrary number of rows. Each row contains + three values, separated by tabs. + The values are "label X_position Y_position" + where the positions are in "mm". + An example is provided + (examples/standard-paddle.txt) + that describes the positions on the standard 4-column paddle.

+ +

Users will likely produce a"Text positions file" by preparing a + spreadsheet with sample description (label) and X,Y positions + on the sample paddle. The origin (0,0) is the notch on the + upper-right edge of the paddle.

+ +

example file: Text positions

+ + + + + + + + + + + + + +
filedescription
examples/standard-paddle.txtpositions on the standard 4-column paddle
+ +

example file: XML Settings

+ + + + + + + + + + + + + + + + + +
filedescription
examples/USAXS_XY.xmlsettings file from USAXS sample and detector stages
examples/test-settings.xmlsettings file used by developer to test various features
+ +

Python source file documentation

+ +

PyDocs from wxmtxy source code

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
filedescription
wxmtxy.pystarts the wxmtxy application
wxmtxy_root.pyMain frame of wxmtxy application
wxmtxy_pair.pyconfiguration for X,Y pair of EPICS positioners
wxmtxy_tab.pyset of rows with positioner settings
wxmtxy_row.pyDefine/manage GUI elements for one row of the table
wxmtxy_pvsetup.pyconfigure EPICS for X,Y pair
wxmtxy_xml.pyread/write routines for wxmtxy XML settings
wxmtxy_axis.pyMaintain EPICS PVs and connections for one axis
wxmtxy_version.pyversion information for wxmtxy
setup.pyPython distutils packaging file for wxmtxy
+ +

Helper files that could work with other Python projects

+ + + + + + + + + + + + + + + + + + + + + +
filedescription
wxmtxy_htmlview.pyHtmlView to view HTML-formatted help files
pvConnect.pysimplified connections to an EPICS PV using CaChannel
menuLauncher.pystandalone GUI to launch various utilities
+ +

Other files

+ + + + + + + + + + + + + + + + + + + + + +
filedescription
LICENSEAPS EPICS extensions software license
READMEComments to developers reading the source code files
XSLT stylesheetXSLT stylesheet to display settings files nicely in a WWW browser
+ +

Requirements

+ +

Python

+

wxPython

+

ca

+

CaChannel

+ +
+ +The wxmtxy application and related files are copyyright (c) 2009. +
+#*************************************************************************
+# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne
+#     National Laboratory.
+# Copyright (c) 2009-2010 The Regents of the University of California, as
+#     Operator of Los Alamos National Laboratory.
+# This file is distributed subject to a Software License Agreement found
+# in the file LICENSE that is included with this distribution. 
+#*************************************************************************
+
+ + + + diff --git a/menuLauncher.py b/menuLauncher.py new file mode 100755 index 0000000..f5bd9f2 --- /dev/null +++ b/menuLauncher.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python +#Boa:Frame:Frame1 + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +'''menuLauncher: Launch command-line statements from a wxPython menu + +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/menuLauncher.py $ +# $Id: menuLauncher.py 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### +''' + + +import wx +import subprocess +import os +import pprint + + +DEFAULT_MENU_ITEMS = ( + ("xcalc RPN", "HP-style", "xcalc -rpn"), + ("xcalc", "TI-style", "xcalc"), + ("gcalc", "Gnome calculator", "gcalctool"), + ("nedit-client", "window editor", "nedit-client"), + ("nedit-nc", "window editor", "nedit-nc"), + ("xman", "X11 man pages", "xman -bothshown"), + ("xeyes", "Here's looking at you, kid!", "xeyes"), + ("wxmtxy", "motor tool", "/APSshare/bin/python ./wxmtxy.py"), + ("separator", ), + ("xclock", "conventional analog clock", "xclock") + ) + + +def create(parent): + return Frame1(parent) + + +[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1PANEL, +] = [wx.NewId() for _init_ctrls in range(3)] + + +[wxID_FRAME1THEMENUITEMS0, wxID_FRAME1THEMENUITEMS1, +] = [wx.NewId() for _init_coll_theMenu_Items in range(2)] + + +class Frame1(wx.Frame): + + def _init_ctrls(self, prnt): + # generated method, don't edit + wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt, + pos=wx.Point(294, 331), size=wx.Size(223, 65), + style=wx.DEFAULT_FRAME_STYLE, title='menuLanucher') + self.SetClientSize(wx.Size(215, 31)) + + self.panel = wx.Panel(id=wxID_FRAME1PANEL, name='panel', parent=self, + pos=wx.Point(0, 0), size=wx.Size(215, 31), + style=wx.TAB_TRAVERSAL) + + self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label='button1 label', + name='button1', parent=self.panel, pos=wx.Point(0, 0), + size=wx.Size(216, 32), style=0) + self.button1.SetToolTipString('button1 tooltip') + + def __init__(self, parent, + label="Command-line tools ...", + contents=None): + if contents == None: + contents = ( + ("xeyes", "Here's looking at you, kid!", "xeyes"), + (None, ), + ("short name", "describe command to be done", "xclock") + ) + self._init_ctrls(parent) + self.registry = {} + b = self.button1 + b.SetLabel(label) + b.SetToolTipString(label) + b.Bind(wx.EVT_LEFT_DOWN, self.OnClick, b) + b.Bind(wx.EVT_RIGHT_DOWN, self.OnClick, b) + self.popupmenu = wx.Menu() + for entry in contents: + #pprint.pprint(entry) + if entry[0] == "separator": + self.appendSeparator(self.popupmenu) + else: + self.appendMenuItem( + menu = self.popupmenu, + id = wx.NewId(), + text = entry[0], + help = entry[1], + cmd = entry[2], + handler = self.OnTheMenuGenericMenu) + + def appendSeparator(self, menu = None): + '''add a separator line to the menu''' + if menu != None: + menu.AppendSeparator() + + def appendMenuItem(self, id, menu = None, text = 'text string', + help='help string', handler = None, cmd = ''): + '''add an item to the menu + @param id: (int) to associate with handler + @param menu: (menu object) usually self.theMenu + @param text: (string) label for the menu item + @param help: (string) describe actio to be performed + @param cmd: (string) full command to be called + @param handler: (method object) function that will receive event + ''' + if menu != None: + entry = {} + entry['cmd'] = cmd + entry['text'] = text + entry['help'] = help + entry['id'] = id + self.registry[id] = entry + menu.Append(help=help, id=id, kind=wx.ITEM_NORMAL, text=text) + if handler != None: + self.Bind(wx.EVT_MENU, handler, id=id) + + def OnTheMenuGenericMenu(self, event): + id = event.GetId() + entry = self.registry[id] + cmd = os.path.normpath(entry['cmd']) + #pprint.pprint(os.path.normpath(cmd)) + subprocess.Popen(cmd, shell = True) + #print os.path.abspath(cmd) + + def OnClick(self, event): + self.panel.PopupMenu(self.popupmenu, (0, 0)) + + +if __name__ == '__main__': + app = wx.PySimpleApp() + menu_items = DEFAULT_MENU_ITEMS + frame = Frame1(None, label="menuLauncher", contents=menu_items) + frame.Show() + + app.MainLoop() diff --git a/pvConnect.py b/pvConnect.py new file mode 100755 index 0000000..f73c04c --- /dev/null +++ b/pvConnect.py @@ -0,0 +1,348 @@ +#!/usr/bin/env python + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +''' +simplified connections to an EPICS PV using CaChannel + +Provides these classes: + + CaPollWx + Use in WX-based GUIs to call ca.poll() in the background + @param interval_s: [float] interval between calls to ca.poll() + + EpicsPv + manage a CaChannel connection with an EPICS PV + @param name: [string] EPICS PV to connect + +Provides these utility routines: + + on_exit(timer) + Exit handler to stop the ca.poll() + @param timer: CaPollWx object + + CaPoll() + Use in non-GUI scripts to call ca.poll() in the background + + GetRTYP(pv) + Returns the record type of "pv" + @param pv:[string] + @return: [string] EPICS record type or None if cannot connect + + testConnect(pv) + Tests if a CaChannel connection can be established to "pv" + @param pv:[string] + @return: True if can connect, otherwise False + + receiver(value) + Example response to an EPICS monitor on the channel + @param value: str(epics_args['pv_value']) + +@version: +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/pvConnect.py $ +# $Id: pvConnect.py 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### +''' + + +import sys +import time + + +try: + # CaChannel provides access to the EPICS PVs + import CaChannel + IMPORTED_CACHANNEL = True +except: + IMPORTED_CACHANNEL = False + + +try: + # wx is needed for the timer to call CaChannel.ca.poll() + # only use this with a wx-based GUI + import wx + IMPORTED_WX = True +except: + IMPORTED_WX = False + + +class CaPollWx: + '''Use in WX-based GUIs to call ca.poll() in the background + + Set up a separate thread to trigger periodic calls to the + EPICS CaChannel.ca.poll() connection. Awaiting (a.k.a., + outstanding or pending) channel access background + activity executes during the poll. Calls pend_event() + with a timeout short enough to poll. + + The default polling interval is 0.1 second. + + @note: The code will silently do nothing if wx was not imported. + This routine use the wx.PyTimer() to call ca.poll() frequently + during the main WX event loop. + + @warning: Only use this in a routine that has already called + wx.App() or an exception will occur. + Command line code will need to call ca.poll() using a different + method (such as CaPoll() below). + ''' + + def __init__(self, interval_s = 0.1): + '''@param interval_s: [float] interval between calls to ca.poll()''' + if IMPORTED_WX: # only if wx was imported + self.running = False + self.interval_s = interval_s + self.timer = wx.PyTimer(self.poll) + self.timer.Start(int(self.interval_s*1000)) + + def start(self): + '''start polling''' + if IMPORTED_WX: # only if wx was imported + self.running = True + self.timer.Start(int(self.interval_s*1000)) + + def stop(self): + '''stop polling''' + if IMPORTED_WX: # only if wx was imported + self.running = False + self.timer.Stop() + + def poll(self): + '''Poll for changes in Channel''' + if IMPORTED_WX: # only if wx was imported + CaChannel.ca.poll() + + def GetInterval(self): + '''return the current interval between calls to CaChannel.ca.poll()''' + if IMPORTED_WX: # only if wx was imported + return self.interval_s + + def SetInterval(self, interval_s): + '''set the next interval between calls to CaChannel.ca.poll()''' + if IMPORTED_WX: # only if wx was imported + self.interval_s = interval_s + + +class EpicsPv: + '''manage a connection with an EPICS PV''' + + def __init__(self, name): + '''initialize the class and set default values + @param name: [string] EPICS PV to connect''' + self.pv = name + self.chan = None + self.value = None + self.user_callback = None + self.epics_args = None + self.user_args = None + self.mask = None + if IMPORTED_CACHANNEL: + self.mask = CaChannel.ca.DBE_VALUE + + def callback(self, epics_args, user_args): + '''receive an EPICS callback, copy epics_args and user_args, then call user''' + self.epics_args = epics_args + self.user_args = user_args + self.value = epics_args['pv_value'] + if self.user_callback != None: + self.user_callback(epics_args, user_args) + + def connect(self): + '''initiate the connection with EPICS''' + if IMPORTED_CACHANNEL: + if len(self.pv) > 0: + self.chan = CaChannel.CaChannel() + self.chan.search(str(self.pv)) + + def connectw(self): + '''initiate the connection with EPICS, standard wait for the connection''' + if IMPORTED_CACHANNEL: + if len(self.pv) > 0: + self.chan = CaChannel.CaChannel() + self.chan.searchw(str(self.pv)) + + def release(self): + '''release the connection with EPICS + @note: Release ALL channels before calling on_exit()''' + if self.chan != None: + del self.chan + self.chan = None + + def monitor(self): + '''Initiate a monitor on the EPICS channel, delivering the + CaChannel callback to the supplied function. + + @note: Example: + ch = EpicsPv(test_pv) + ch.connectw() + uargs = test_pv, widget.SetLabel + ch.SetUserArgs(uargs) + ch.SetUserCallback(myCallback) + ch.monitor() + + @warning: At this time, there is not an easy way to turn off monitors. + Instead, ch.release() the channel (which will set self.chan = None), + To re-start a monitor after a ch.release(), connect as usual and start + the monitor again, as the first time. + ''' + if IMPORTED_CACHANNEL and self.chan != None: + type = CaChannel.ca.dbf_type_to_DBR_GR(self.chan.field_type()) + # call supplied callback routine with default argument list + # self.user_callback(epics_args, user_args) + self.chan.add_masked_array_event(type, + None, self.mask, self.callback, self.user_args) + + def GetPv(self): + '''@return: PV name''' + return self.pv + + def GetValue(self): + '''@return: value from EPICS from the most recent monitor event''' + return self.value + + def SetPv(self, name): + '''redefine the PV name only if there is no connection + @param name: valid EPICS PV name''' + if self.chan == None: + self.pv = name + + def GetChan(self): + '''@return: CaChannel channel''' + return self.chan + + def GetEpicsArgs(self): + '''@return: epics_args from the most recent monitor event''' + return self.epics_args + + def GetUserArgs(self): + '''@return: user_args from the most recent monitor event''' + return self.user_args + + def SetUserArgs(self, user_args): + '''define the user_args tuple to use when monitoring + @param user_args: tuple of user data (for use in user_callback function)''' + self.user_args = user_args + + def SetMask(self, mask): + '''Define the mask used when applying a channel monitor. + The default is: self.mask = CaChannel.ca.DBE_VALUE + @param mask: as defined in the CaChannel manual''' + self.pv = mask + + def GetUserCallback(self): + '''return the callback function supplied by the caller + values will be set by self.user_callback(value) + @return: function object''' + return self.user_callback + + def SetUserCallback(self, user_callback): + '''Set the callback function supplied by the caller + values will be set by self.user_callback(value) + @param user_callback: function object''' + self.user_callback = user_callback + + +def on_exit(timer = None): + '''Exit handler to stop the ca.poll() + @param timer: CaPollWx object + + Call this to cleanup when program is exiting. + ONLY call this function during a program's exit handling. + If ca.task_exit() is not called, then expect to see the errors: + FATAL: exception not rethrown + Abort + ''' + if IMPORTED_CACHANNEL: # only if ca binding was loaded + CaChannel.ca.task_exit() + try: # fail no matter what + if timer != None: + timer.stop() + except: + pass + + +def CaPoll(): + '''Use in non-GUI scripts to call ca.poll() in the background''' + if IMPORTED_CACHANNEL: + CaChannel.ca.poll() + + +def GetRTYP(pv): + '''Returns the record type of "pv" + @param pv:[string] + @return: [string] EPICS record type or None if cannot connect''' + if not IMPORTED_CACHANNEL: + return None + if len(pv) == 0: + return None + base = pv.split('.')[0] + if testConnect(base): + rtyp_pv = base + '.RTYP' + ch = EpicsPv(rtyp_pv) + ch.connectw() + rtyp = ch.chan.getw() + del ch + return rtyp + else: + return None + + +def testConnect(pv): + '''Tests if a CaChannel connection can be established to "pv" + @param pv:[string] + @return: True if can connect, otherwise False''' + result = False + if not IMPORTED_CACHANNEL: + return result + try: + #print 'testConnect:', type(pv), pv + chan = CaChannel.CaChannel() + chan.searchw(str(pv)) + val = chan.getw() + del chan + result = True + except (TypeError, CaChannel.CaChannelException), status: + # python3: (TypeError, CaChannel.CaChannelException) as status + #print 'testConnect:', status + pass + return result + + +def receiver(epics_args, user_args): + '''Example response to an EPICS monitor on the channel + @param value: str(epics_args['pv_value'])''' + value = epics_args['pv_value'] + print 'receiver', 'updated value:', str(value) + + +if __name__ == '__main__': + if IMPORTED_CACHANNEL: + test_pv = 'S:SRcurrentAI' + if testConnect(test_pv): + print "recordType(%s) = %s" % (test_pv, GetRTYP(test_pv)) + ch = EpicsPv(test_pv) + ch.connectw() + ch.SetUserCallback(receiver) + ch.monitor() + ch.chan.pend_event() + import time + count = 5 + for seconds in range(count): + time.sleep(1) + ch.chan.pend_event() + print count - seconds - 1, ch.GetPv(), '=', ch.GetValue() + ch.release() + on_exit() + else: + print "CaChannel is missing, cannot run" diff --git a/pydoc/menuLauncher.html b/pydoc/menuLauncher.html new file mode 100644 index 0000000..30b6814 --- /dev/null +++ b/pydoc/menuLauncher.html @@ -0,0 +1,1885 @@ + + +Python: module menuLauncher + + + + +
 
+ 
menuLauncher
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/menuLauncher.py
+

menuLauncher: Launch command-line statements from a wxPython menu

+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/menuLauncher.py $
+# $Id: menuLauncher.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+

+ + + + + +
 
+Modules
       
os
+
pprint
+
subprocess
+
wx
+

+ + + + + +
 
+Classes
       
+
wx._windows.Frame(wx._windows.TopLevelWindow) +
+
+
Frame1 +
+
+
+

+ + + + + +
 
+class Frame1(wx._windows.Frame)
    
Method resolution order:
+
Frame1
+
wx._windows.Frame
+
wx._windows.TopLevelWindow
+
wx._core.Window
+
wx._core.EvtHandler
+
wx._core.Object
+
__builtin__.object
+
+
+Methods defined here:
+
OnClick(self, event)
+ +
OnTheMenuGenericMenu(self, event)
+ +
__init__(self, parent, label='Command-line tools ...', contents=None)
+ +
appendMenuItem(self, id, menu=None, text='text string', help='help string', handler=None, cmd='')
add an item to the menu
+@param id: (int) to associate with handler
+@param menu: (menu object) usually self.theMenu
+@param text: (string) label for the menu item
+@param help: (string) describe actio to be performed
+@param cmd: (string) full command to be called
+@param handler: (method object) function that will receive event
+ +
appendSeparator(self, menu=None)
add a separator line to the menu
+ +
+Methods inherited from wx._windows.Frame:
+
Command = ProcessCommand(*args, **kwargs)
ProcessCommand(self, int winid) -> bool
+ +
Create(*args, **kwargs)
Create(self, Window parent, int id=-1, String title=EmptyString, 
+    Point pos=DefaultPosition, Size size=DefaultSize, 
+    long style=DEFAULT_FRAME_STYLE, String name=FrameNameStr) -> bool
+ +
CreateStatusBar(*args, **kwargs)
CreateStatusBar(self, int number=1, long style=DEFAULT_STATUSBAR_STYLE, int winid=0, 
+    String name=StatusLineNameStr) -> StatusBar
+ +
CreateToolBar(*args, **kwargs)
CreateToolBar(self, long style=-1, int winid=-1, String name=ToolBarNameStr) -> wxToolBar
+ +
DoGiveHelp(*args, **kwargs)
DoGiveHelp(self, String text, bool show)
+ +
DoMenuUpdates(*args, **kwargs)
DoMenuUpdates(self, Menu menu=None)
+ +
GetMenuBar(*args, **kwargs)
GetMenuBar(self) -> MenuBar
+ +
GetStatusBar(*args, **kwargs)
GetStatusBar(self) -> StatusBar
+ +
GetStatusBarPane(*args, **kwargs)
GetStatusBarPane(self) -> int
+ +
GetToolBar(*args, **kwargs)
GetToolBar(self) -> wxToolBar
+ +
PopStatusText(*args, **kwargs)
PopStatusText(self, int number=0)
+ +
ProcessCommand(*args, **kwargs)
ProcessCommand(self, int winid) -> bool
+ +
PushStatusText(*args, **kwargs)
PushStatusText(self, String text, int number=0)
+ +
SendSizeEvent(*args, **kwargs)
SendSizeEvent(self)
+ +
SetMenuBar(*args, **kwargs)
SetMenuBar(self, MenuBar menubar)
+ +
SetStatusBar(*args, **kwargs)
SetStatusBar(self, StatusBar statBar)
+ +
SetStatusBarPane(*args, **kwargs)
SetStatusBarPane(self, int n)
+ +
SetStatusText(*args, **kwargs)
SetStatusText(self, String text, int number=0)
+ +
SetStatusWidths(*args, **kwargs)
SetStatusWidths(self, int widths)
+ +
SetToolBar(*args, **kwargs)
SetToolBar(self, wxToolBar toolbar)
+ +
__repr__ = _swig_repr(self)
+ +
+Static methods inherited from wx._windows.Frame:
+
GetClassDefaultAttributes(*args, **kwargs)
GetClassDefaultAttributes(int variant=WINDOW_VARIANT_NORMAL) -> VisualAttributes

+Get the default attributes for this class.  This is useful if you want
+to use the same font or colour in your own control as in a standard
+control -- which is a much better idea than hard coding specific
+colours or fonts which might look completely out of place on the
+user's system, especially if it uses themes.

+The variant parameter is only relevant under Mac currently and is
+ignore under other platforms. Under Mac, it will change the size of
+the returned font. See `wx.Window.SetWindowVariant` for more about
+this.
+ +
+Data descriptors inherited from wx._windows.Frame:
+
MenuBar
+
See `GetMenuBar` and `SetMenuBar`
+
+
StatusBar
+
See `GetStatusBar` and `SetStatusBar`
+
+
StatusBarPane
+
See `GetStatusBarPane` and `SetStatusBarPane`
+
+
ToolBar
+
See `GetToolBar` and `SetToolBar`
+
+
thisown
+
The membership flag
+
+
+Methods inherited from wx._windows.TopLevelWindow:
+
CenterOnScreen(*args, **kwargs)
CenterOnScreen(self, int dir=BOTH)

+Center the window on screen
+ +
CentreOnScreen = CenterOnScreen(*args, **kwargs)
CenterOnScreen(self, int dir=BOTH)

+Center the window on screen
+ +
EnableCloseButton(*args, **kwargs)
EnableCloseButton(self, bool enable) -> bool
+ +
GetDefaultItem(*args, **kwargs)
GetDefaultItem(self) -> Window

+Get the default child of this parent, i.e. the one which is activated
+by pressing <Enter> such as the OK button on a wx.Dialog.
+ +
GetIcon(*args, **kwargs)
GetIcon(self) -> Icon
+ +
GetTitle(*args, **kwargs)
GetTitle(self) -> String
+ +
GetTmpDefaultItem(*args, **kwargs)
GetTmpDefaultItem(self) -> Window

+Return the temporary default item, which can be None.
+ +
Iconize(*args, **kwargs)
Iconize(self, bool iconize=True)
+ +
IsActive(*args, **kwargs)
IsActive(self) -> bool
+ +
IsAlwaysMaximized(*args, **kwargs)
IsAlwaysMaximized(self) -> bool
+ +
IsFullScreen(*args, **kwargs)
IsFullScreen(self) -> bool
+ +
IsIconized(*args, **kwargs)
IsIconized(self) -> bool
+ +
IsMaximized(*args, **kwargs)
IsMaximized(self) -> bool
+ +
MacGetMetalAppearance(*args, **kwargs)
MacGetMetalAppearance(self) -> bool
+ +
MacGetUnifiedAppearance(*args, **kwargs)
MacGetUnifiedAppearance(self) -> bool
+ +
MacSetMetalAppearance(*args, **kwargs)
MacSetMetalAppearance(self, bool on)
+ +
Maximize(*args, **kwargs)
Maximize(self, bool maximize=True)
+ +
RequestUserAttention(*args, **kwargs)
RequestUserAttention(self, int flags=USER_ATTENTION_INFO)
+ +
Restore(*args, **kwargs)
Restore(self)
+ +
SetDefaultItem(*args, **kwargs)
SetDefaultItem(self, Window child) -> Window

+Set this child as default, return the old default.
+ +
SetIcon(*args, **kwargs)
SetIcon(self, Icon icon)
+ +
SetIcons(*args, **kwargs)
SetIcons(self, wxIconBundle icons)
+ +
SetShape(*args, **kwargs)
SetShape(self, Region region) -> bool
+ +
SetTitle(*args, **kwargs)
SetTitle(self, String title)
+ +
SetTmpDefaultItem(*args, **kwargs)
SetTmpDefaultItem(self, Window win)

+Set this child as temporary default
+ +
ShowFullScreen(*args, **kwargs)
ShowFullScreen(self, bool show, long style=FULLSCREEN_ALL) -> bool
+ +
+Data descriptors inherited from wx._windows.TopLevelWindow:
+
DefaultItem
+
See `GetDefaultItem` and `SetDefaultItem`
+
+
Icon
+
See `GetIcon` and `SetIcon`
+
+
Title
+
See `GetTitle` and `SetTitle`
+
+
TmpDefaultItem
+
See `GetTmpDefaultItem` and `SetTmpDefaultItem`
+
+
+Methods inherited from wx._core.Window:
+
AcceptsFocus(*args, **kwargs)
AcceptsFocus(self) -> bool

+Can this window have focus?
+ +
AcceptsFocusFromKeyboard(*args, **kwargs)
AcceptsFocusFromKeyboard(self) -> bool

+Can this window be given focus by keyboard navigation? if not, the
+only way to give it focus (provided it accepts it at all) is to click
+it.
+ +
AddChild(*args, **kwargs)
AddChild(self, Window child)

+Adds a child window. This is called automatically by window creation
+functions so should not be required by the application programmer.
+ +
AdjustForLayoutDirection(*args, **kwargs)
AdjustForLayoutDirection(self, int x, int width, int widthTotal) -> int

+Mirror coordinates for RTL layout if this window uses it and if the
+mirroring is not done automatically like Win32.
+ +
AssociateHandle(*args, **kwargs)
AssociateHandle(self, long handle)

+Associate the window with a new native handle
+ +
CacheBestSize(*args, **kwargs)
CacheBestSize(self, Size size)

+Cache the best size so it doesn't need to be calculated again, (at least until
+some properties of the window change.)
+ +
CanSetTransparent(*args, **kwargs)
CanSetTransparent(self) -> bool

+Returns ``True`` if the platform supports setting the transparency for
+this window.  Note that this method will err on the side of caution,
+so it is possible that this will return ``False`` when it is in fact
+possible to set the transparency.

+NOTE: On X-windows systems the X server must have the composite
+extension loaded, and there must be a composite manager program (such
+as xcompmgr) running.
+ +
CaptureMouse(*args, **kwargs)
CaptureMouse(self)

+Directs all mouse input to this window. Call wx.Window.ReleaseMouse to
+release the capture.

+Note that wxWindows maintains the stack of windows having captured the
+mouse and when the mouse is released the capture returns to the window
+which had had captured it previously and it is only really released if
+there were no previous window. In particular, this means that you must
+release the mouse as many times as you capture it, unless the window
+receives the `wx.MouseCaptureLostEvent` event.

+Any application which captures the mouse in the beginning of some
+operation *must* handle `wx.MouseCaptureLostEvent` and cancel this
+operation when it receives the event. The event handler must not
+recapture mouse.
+ +
Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
Centre = Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CentreOnParent = CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
ClearBackground(*args, **kwargs)
ClearBackground(self)

+Clears the window by filling it with the current background
+colour. Does not cause an erase background event to be generated.
+ +
ClientToScreen(*args, **kwargs)
ClientToScreen(self, Point pt) -> Point

+Converts to screen coordinates from coordinates relative to this window.
+ +
ClientToScreenXY(*args, **kwargs)
ClientToScreenXY(int x, int y) -> (x,y)

+Converts to screen coordinates from coordinates relative to this window.
+ +
Close(*args, **kwargs)
Close(self, bool force=False) -> bool

+This function simply generates a EVT_CLOSE event whose handler usually
+tries to close the window. It doesn't close the window itself,
+however.  If force is False (the default) then the window's close
+handler will be allowed to veto the destruction of the window.
+ +
ConvertDialogPointToPixels(*args, **kwargs)
ConvertDialogPointToPixels(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertDialogSizeToPixels(*args, **kwargs)
ConvertDialogSizeToPixels(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertPixelPointToDialog(*args, **kwargs)
ConvertPixelPointToDialog(self, Point pt) -> Point
+ +
ConvertPixelSizeToDialog(*args, **kwargs)
ConvertPixelSizeToDialog(self, Size sz) -> Size
+ +
DLG_PNT(*args, **kwargs)
DLG_PNT(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
DLG_SZE(*args, **kwargs)
DLG_SZE(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
Destroy(*args, **kwargs)
Destroy(self) -> bool

+Destroys the window safely.  Frames and dialogs are not destroyed
+immediately when this function is called -- they are added to a list
+of windows to be deleted on idle time, when all the window's events
+have been processed. This prevents problems with events being sent to
+non-existent windows.

+Returns True if the window has either been successfully deleted, or it
+has been added to the list of windows pending real deletion.
+ +
DestroyChildren(*args, **kwargs)
DestroyChildren(self) -> bool

+Destroys all children of a window. Called automatically by the
+destructor.
+ +
Disable(*args, **kwargs)
Disable(self) -> bool

+Disables the window, same as Enable(false).
+ +
DissociateHandle(*args, **kwargs)
DissociateHandle(self)

+Dissociate the current native handle from the window
+ +
DragAcceptFiles(*args, **kwargs)
DragAcceptFiles(self, bool accept)

+Enables or disables eligibility for drop file events, EVT_DROP_FILES.
+Only functional on Windows.
+ +
Enable(*args, **kwargs)
Enable(self, bool enable=True) -> bool

+Enable or disable the window for user input. Note that when a parent
+window is disabled, all of its children are disabled as well and they
+are reenabled again when the parent is.  Returns true if the window
+has been enabled or disabled, false if nothing was done, i.e. if the
+window had already been in the specified state.
+ +
FindWindowById(*args, **kwargs)
FindWindowById(self, long winid) -> Window

+Find a child of this window by window ID
+ +
FindWindowByName(*args, **kwargs)
FindWindowByName(self, String name) -> Window

+Find a child of this window by name
+ +
Fit(*args, **kwargs)
Fit(self)

+Sizes the window so that it fits around its subwindows. This function
+won't do anything if there are no subwindows and will only really work
+correctly if sizers are used for the subwindows layout. Also, if the
+window has exactly one subwindow it is better (faster and the result
+is more precise as Fit adds some margin to account for fuzziness of
+its calculations) to call window.SetClientSize(child.GetSize())
+instead of calling Fit.
+ +
FitInside(*args, **kwargs)
FitInside(self)

+Similar to Fit, but sizes the interior (virtual) size of a
+window. Mainly useful with scrolled windows to reset scrollbars after
+sizing changes that do not trigger a size event, and/or scrolled
+windows without an interior sizer. This function similarly won't do
+anything if there are no subwindows.
+ +
Freeze(*args, **kwargs)
Freeze(self)

+Freezes the window or, in other words, prevents any updates from
+taking place on screen, the window is not redrawn at all. Thaw must be
+called to reenable window redrawing.  Calls to Freeze/Thaw may be
+nested, with the actual Thaw being delayed until all the nesting has
+been undone.

+This method is useful for visual appearance optimization (for example,
+it is a good idea to use it before inserting large amount of text into
+a wxTextCtrl under wxGTK) but is not implemented on all platforms nor
+for all controls so it is mostly just a hint to wxWindows and not a
+mandatory directive.
+ +
GetAcceleratorTable(*args, **kwargs)
GetAcceleratorTable(self) -> AcceleratorTable

+Gets the accelerator table for this window.
+ +
GetAdjustedBestSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetAutoLayout(*args, **kwargs)
GetAutoLayout(self) -> bool

+Returns the current autoLayout setting
+ +
GetBackgroundColour(*args, **kwargs)
GetBackgroundColour(self) -> Colour

+Returns the background colour of the window.
+ +
GetBackgroundStyle(*args, **kwargs)
GetBackgroundStyle(self) -> int

+Returns the background style of the window.

+:see: `SetBackgroundStyle`
+ +
GetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetBestSize(*args, **kwargs)
GetBestSize(self) -> Size

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestSizeTuple(*args, **kwargs)
GetBestSizeTuple() -> (width, height)

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestVirtualSize(*args, **kwargs)
GetBestVirtualSize(self) -> Size

+Return the largest of ClientSize and BestSize (as determined by a
+sizer, interior children, or other means)
+ +
GetBorder(*args)
GetBorder(self, long flags) -> int
+GetBorder(self) -> int

+Get border for the flags of this window
+ +
GetCaret(*args, **kwargs)
GetCaret(self) -> Caret

+Returns the caret associated with the window.
+ +
GetCharHeight(*args, **kwargs)
GetCharHeight(self) -> int

+Get the (average) character size for the current font.
+ +
GetCharWidth(*args, **kwargs)
GetCharWidth(self) -> int

+Get the (average) character size for the current font.
+ +
GetChildren(*args, **kwargs)
GetChildren(self) -> WindowList

+Returns an object containing a list of the window's children.  The
+object provides a Python sequence-like interface over the internal
+list maintained by the window..
+ +
GetClientAreaOrigin(*args, **kwargs)
GetClientAreaOrigin(self) -> Point

+Get the origin of the client area of the window relative to the
+window's top left corner (the client area may be shifted because of
+the borders, scrollbars, other decorations...)
+ +
GetClientRect(*args, **kwargs)
GetClientRect(self) -> Rect

+Get the client area position and size as a `wx.Rect` object.
+ +
GetClientSize(*args, **kwargs)
GetClientSize(self) -> Size

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetClientSizeTuple(*args, **kwargs)
GetClientSizeTuple() -> (width, height)

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetConstraints(*args, **kwargs)
GetConstraints(self) -> LayoutConstraints

+Returns a pointer to the window's layout constraints, or None if there
+are none.
+ +
GetContainingSizer(*args, **kwargs)
GetContainingSizer(self) -> Sizer

+Return the sizer that this window is a member of, if any, otherwise None.
+ +
GetCursor(*args, **kwargs)
GetCursor(self) -> Cursor

+Return the cursor associated with this window.
+ +
GetDefaultAttributes(*args, **kwargs)
GetDefaultAttributes(self) -> VisualAttributes

+Get the default attributes for an instance of this class.  This is
+useful if you want to use the same font or colour in your own control
+as in a standard control -- which is a much better idea than hard
+coding specific colours or fonts which might look completely out of
+place on the user's system, especially if it uses themes.
+ +
GetDropTarget(*args, **kwargs)
GetDropTarget(self) -> DropTarget

+Returns the associated drop target, which may be None.
+ +
GetEffectiveMinSize(*args, **kwargs)
GetEffectiveMinSize(self) -> Size

+This function will merge the window's best size into the window's
+minimum size, giving priority to the min size components, and returns
+the results.
+ +
GetEventHandler(*args, **kwargs)
GetEventHandler(self) -> EvtHandler

+Returns the event handler for this window. By default, the window is
+its own event handler.
+ +
GetExtraStyle(*args, **kwargs)
GetExtraStyle(self) -> long

+Returns the extra style bits for the window.
+ +
GetFont(*args, **kwargs)
GetFont(self) -> Font

+Returns the default font used for this window.
+ +
GetForegroundColour(*args, **kwargs)
GetForegroundColour(self) -> Colour

+Returns the foreground colour of the window.  The interpretation of
+foreground colour is dependent on the window class; it may be the text
+colour or other colour, or it may not be used at all.
+ +
GetFullTextExtent(*args, **kwargs)
GetFullTextExtent(String string, Font font=None) ->
+   (width, height, descent, externalLeading)

+Get the width, height, decent and leading of the text using the
+current or specified font.
+ +
GetGrandParent(*args, **kwargs)
GetGrandParent(self) -> Window

+Returns the parent of the parent of this window, or None if there
+isn't one.
+ +
GetGtkWidget(*args, **kwargs)
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+ +
GetHandle(*args, **kwargs)
GetHandle(self) -> long

+Returns the platform-specific handle (as a long integer) of the
+physical window.  On wxMSW this is the win32 window handle, on wxGTK
+it is the XWindow ID, and on wxMac it is the ControlRef.
+ +
GetHelpText(*args, **kwargs)
GetHelpText(self) -> String

+Gets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
GetHelpTextAtPoint(*args, **kwargs)
GetHelpTextAtPoint(self, Point pt, wxHelpEvent::Origin origin) -> String

+Get the help string associated with the given position in this window.

+Notice that pt may be invalid if event origin is keyboard or unknown
+and this method should return the global window help text then
+ +
GetId(*args, **kwargs)
GetId(self) -> int

+Returns the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one (or the default Id
+-1 is used) then an unique identifier with a negative value will be
+generated.
+ +
GetLabel(*args, **kwargs)
GetLabel(self) -> String

+Generic way of getting a label from any window, for identification
+purposes.  The interpretation of this function differs from class to
+class. For frames and dialogs, the value returned is the title. For
+buttons or static text controls, it is the button text. This function
+can be useful for meta-programs such as testing tools or special-needs
+access programs)which need to identify windows by name.
+ +
GetLayoutDirection(*args, **kwargs)
GetLayoutDirection(self) -> int

+Get the layout direction (LTR or RTL) for this window.  Returns
+``wx.Layout_Default`` if layout direction is not supported.
+ +
GetMaxHeight(*args, **kwargs)
GetMaxHeight(self) -> int
+ +
GetMaxSize(*args, **kwargs)
GetMaxSize(self) -> Size
+ +
GetMaxWidth(*args, **kwargs)
GetMaxWidth(self) -> int
+ +
GetMinHeight(*args, **kwargs)
GetMinHeight(self) -> int
+ +
GetMinSize(*args, **kwargs)
GetMinSize(self) -> Size
+ +
GetMinWidth(*args, **kwargs)
GetMinWidth(self) -> int
+ +
GetName(*args, **kwargs)
GetName(self) -> String

+Returns the windows name.  This name is not guaranteed to be unique;
+it is up to the programmer to supply an appropriate name in the window
+constructor or via wx.Window.SetName.
+ +
GetParent(*args, **kwargs)
GetParent(self) -> Window

+Returns the parent window of this window, or None if there isn't one.
+ +
GetPosition(*args, **kwargs)
GetPosition(self) -> Point

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetPositionTuple(*args, **kwargs)
GetPositionTuple() -> (x,y)

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetRect(*args, **kwargs)
GetRect(self) -> Rect

+Returns the size and position of the window as a `wx.Rect` object.
+ +
GetScreenPosition(*args, **kwargs)
GetScreenPosition(self) -> Point

+Get the position of the window in screen coordinantes.
+ +
GetScreenPositionTuple(*args, **kwargs)
GetScreenPositionTuple() -> (x,y)

+Get the position of the window in screen coordinantes.
+ +
GetScreenRect(*args, **kwargs)
GetScreenRect(self) -> Rect

+Returns the size and position of the window in screen coordinantes as
+a `wx.Rect` object.
+ +
GetScrollPos(*args, **kwargs)
GetScrollPos(self, int orientation) -> int

+Returns the built-in scrollbar position.
+ +
GetScrollRange(*args, **kwargs)
GetScrollRange(self, int orientation) -> int

+Returns the built-in scrollbar range.
+ +
GetScrollThumb(*args, **kwargs)
GetScrollThumb(self, int orientation) -> int

+Returns the built-in scrollbar thumb size.
+ +
GetSize(*args, **kwargs)
GetSize(self) -> Size

+Get the window size.
+ +
GetSizeTuple(*args, **kwargs)
GetSizeTuple() -> (width, height)

+Get the window size.
+ +
GetSizer(*args, **kwargs)
GetSizer(self) -> Sizer

+Return the sizer associated with the window by a previous call to
+SetSizer or None if there isn't one.
+ +
GetTextExtent(*args, **kwargs)
GetTextExtent(String string) -> (width, height)

+Get the width and height of the text using the current font.
+ +
GetThemeEnabled(*args, **kwargs)
GetThemeEnabled(self) -> bool

+Return the themeEnabled flag.
+ +
GetToolTip(*args, **kwargs)
GetToolTip(self) -> ToolTip

+get the associated tooltip or None if none
+ +
GetTopLevelParent(*args, **kwargs)
GetTopLevelParent(self) -> Window

+Returns the first frame or dialog in this window's parental hierarchy.
+ +
GetUpdateClientRect(*args, **kwargs)
GetUpdateClientRect(self) -> Rect

+Get the update rectangle region bounding box in client coords.
+ +
GetUpdateRegion(*args, **kwargs)
GetUpdateRegion(self) -> Region

+Returns the region specifying which parts of the window have been
+damaged. Should only be called within an EVT_PAINT handler.
+ +
GetValidator(*args, **kwargs)
GetValidator(self) -> Validator

+Returns a pointer to the current validator for the window, or None if
+there is none.
+ +
GetVirtualSize(*args, **kwargs)
GetVirtualSize(self) -> Size

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetVirtualSizeTuple(*args, **kwargs)
GetVirtualSizeTuple() -> (width, height)

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetWindowBorderSize(*args, **kwargs)
GetWindowBorderSize(self) -> Size

+Return the size of the left/right and top/bottom borders.
+ +
GetWindowStyle = GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowVariant(*args, **kwargs)
GetWindowVariant(self) -> int
+ +
HasCapture(*args, **kwargs)
HasCapture(self) -> bool

+Returns true if this window has the current mouse capture.
+ +
HasFlag(*args, **kwargs)
HasFlag(self, int flag) -> bool

+Test if the given style is set for this window.
+ +
HasMultiplePages(*args, **kwargs)
HasMultiplePages(self) -> bool
+ +
HasScrollbar(*args, **kwargs)
HasScrollbar(self, int orient) -> bool

+Does the window have the scrollbar for this orientation?
+ +
HasTransparentBackground(*args, **kwargs)
HasTransparentBackground(self) -> bool

+Returns True if this window's background is transparent (as, for
+example, for `wx.StaticText`) and should show the parent window's
+background.

+This method is mostly used internally by the library itself and you
+normally shouldn't have to call it. You may, however, have to override
+it in your custom control classes to ensure that background is painted
+correctly.
+ +
Hide(*args, **kwargs)
Hide(self) -> bool

+Equivalent to calling Show(False).
+ +
HitTest(*args, **kwargs)
HitTest(self, Point pt) -> int

+Test where the given (in client coords) point lies
+ +
HitTestXY(*args, **kwargs)
HitTestXY(self, int x, int y) -> int

+Test where the given (in client coords) point lies
+ +
InheritAttributes(*args, **kwargs)
InheritAttributes(self)

+This function is (or should be, in case of custom controls) called
+during window creation to intelligently set up the window visual
+attributes, that is the font and the foreground and background
+colours.

+By 'intelligently' the following is meant: by default, all windows use
+their own default attributes. However if some of the parent's
+attributes are explicitly changed (that is, using SetFont and not
+SetOwnFont) and if the corresponding attribute hadn't been
+explicitly set for this window itself, then this window takes the same
+value as used by the parent. In addition, if the window overrides
+ShouldInheritColours to return false, the colours will not be changed
+no matter what and only the font might.

+This rather complicated logic is necessary in order to accommodate the
+different usage scenarios. The most common one is when all default
+attributes are used and in this case, nothing should be inherited as
+in modern GUIs different controls use different fonts (and colours)
+than their siblings so they can't inherit the same value from the
+parent. However it was also deemed desirable to allow to simply change
+the attributes of all children at once by just changing the font or
+colour of their common parent, hence in this case we do inherit the
+parents attributes.
+ +
InheritsBackgroundColour(*args, **kwargs)
InheritsBackgroundColour(self) -> bool
+ +
InitDialog(*args, **kwargs)
InitDialog(self)

+Sends an EVT_INIT_DIALOG event, whose handler usually transfers data
+to the dialog via validators.
+ +
InvalidateBestSize(*args, **kwargs)
InvalidateBestSize(self)

+Reset the cached best size value so it will be recalculated the next
+time it is needed.
+ +
IsBeingDeleted(*args, **kwargs)
IsBeingDeleted(self) -> bool

+Is the window in the process of being deleted?
+ +
IsDoubleBuffered(*args, **kwargs)
IsDoubleBuffered(self) -> bool

+Returns ``True`` if the window contents is double-buffered by the
+system, i.e. if any drawing done on the window is really done on a
+temporary backing surface and transferred to the screen all at once
+later.
+ +
IsEnabled(*args, **kwargs)
IsEnabled(self) -> bool

+Returns true if the window is enabled for input, false otherwise.
+ +
IsExposed(*args, **kwargs)
IsExposed(self, int x, int y, int w=1, int h=1) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedPoint(*args, **kwargs)
IsExposedPoint(self, Point pt) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedRect(*args, **kwargs)
IsExposedRect(self, Rect rect) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsFrozen(*args, **kwargs)
IsFrozen(self) -> bool

+Returns ``True`` if the window has been frozen and not thawed yet.

+:see: `Freeze` and `Thaw`
+ +
IsRetained(*args, **kwargs)
IsRetained(self) -> bool

+Returns true if the window is retained, false otherwise.  Retained
+windows are only available on X platforms.
+ +
IsShown(*args, **kwargs)
IsShown(self) -> bool

+Returns true if the window is shown, false if it has been hidden.
+ +
IsShownOnScreen(*args, **kwargs)
IsShownOnScreen(self) -> bool

+Returns ``True`` if the window is physically visible on the screen,
+i.e. it is shown and all its parents up to the toplevel window are
+shown as well.
+ +
IsTopLevel(*args, **kwargs)
IsTopLevel(self) -> bool

+Returns true if the given window is a top-level one. Currently all
+frames and dialogs are always considered to be top-level windows (even
+if they have a parent window).
+ +
Layout(*args, **kwargs)
Layout(self) -> bool

+Invokes the constraint-based layout algorithm or the sizer-based
+algorithm for this window.  See SetAutoLayout: when auto layout is on,
+this function gets called automatically by the default EVT_SIZE
+handler when the window is resized.
+ +
LineDown(*args, **kwargs)
LineDown(self) -> bool

+This is just a wrapper for ScrollLines(1).
+ +
LineUp(*args, **kwargs)
LineUp(self) -> bool

+This is just a wrapper for ScrollLines(-1).
+ +
Lower(*args, **kwargs)
Lower(self)

+Lowers the window to the bottom of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
MakeModal(*args, **kwargs)
MakeModal(self, bool modal=True)

+Disables all other windows in the application so that the user can
+only interact with this window.  Passing False will reverse this
+effect.
+ +
Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
MoveAfterInTabOrder(*args, **kwargs)
MoveAfterInTabOrder(self, Window win)

+Moves this window in the tab navigation order after the specified
+sibling window.  This means that when the user presses the TAB key on
+that other window, the focus switches to this window.

+The default tab order is the same as creation order.  This function
+and `MoveBeforeInTabOrder` allow to change it after creating all the
+windows.
+ +
MoveBeforeInTabOrder(*args, **kwargs)
MoveBeforeInTabOrder(self, Window win)

+Same as `MoveAfterInTabOrder` except that it inserts this window just
+before win instead of putting it right after it.
+ +
MoveXY(*args, **kwargs)
MoveXY(self, int x, int y, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
Navigate(*args, **kwargs)
Navigate(self, int flags=NavigationKeyEvent.IsForward) -> bool

+Does keyboard navigation from this window to another, by sending a
+`wx.NavigationKeyEvent`.
+ +
PageDown(*args, **kwargs)
PageDown(self) -> bool

+This is just a wrapper for ScrollPages(1).
+ +
PageUp(*args, **kwargs)
PageUp(self) -> bool

+This is just a wrapper for ScrollPages(-1).
+ +
PopEventHandler(*args, **kwargs)
PopEventHandler(self, bool deleteHandler=False) -> EvtHandler

+Removes and returns the top-most event handler on the event handler
+stack.  If deleteHandler is True then the wx.EvtHandler object will be
+destroyed after it is popped, and ``None`` will be returned instead.
+ +
PopupMenu(*args, **kwargs)
PopupMenu(self, Menu menu, Point pos=DefaultPosition) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PopupMenuXY(*args, **kwargs)
PopupMenuXY(self, Menu menu, int x=-1, int y=-1) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PostCreate(self, pre)
Phase 3 of the 2-phase create <wink!>
+Call this method after precreating the window with the 2-phase create method.
+ +
PrepareDC(*args, **kwargs)
PrepareDC(self, DC dc)

+Call this function to prepare the device context for drawing a
+scrolled image. It sets the device origin according to the current
+scroll position.
+ +
PushEventHandler(*args, **kwargs)
PushEventHandler(self, EvtHandler handler)

+Pushes this event handler onto the event handler stack for the window.
+An event handler is an object that is capable of processing the events
+sent to a window.  (In other words, is able to dispatch the events to a
+handler function.)  By default, the window is its own event handler,
+but an application may wish to substitute another, for example to
+allow central implementation of event-handling for a variety of
+different window classes.

+wx.Window.PushEventHandler allows an application to set up a chain of
+event handlers, where an event not handled by one event handler is
+handed to the next one in the chain.  Use `wx.Window.PopEventHandler`
+to remove the event handler.  Ownership of the handler is *not* given
+to the window, so you should be sure to pop the handler before the
+window is destroyed and either let PopEventHandler destroy it, or call
+its Destroy method yourself.
+ +
Raise(*args, **kwargs)
Raise(self)

+Raises the window to the top of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
Refresh(*args, **kwargs)
Refresh(self, bool eraseBackground=True, Rect rect=None)

+Mark the specified rectangle (or the whole window) as "dirty" so it
+will be repainted.  Causes an EVT_PAINT event to be generated and sent
+to the window.
+ +
RefreshRect(*args, **kwargs)
RefreshRect(self, Rect rect, bool eraseBackground=True)

+Redraws the contents of the given rectangle: the area inside it will
+be repainted.  This is the same as Refresh but has a nicer syntax.
+ +
RegisterHotKey(*args, **kwargs)
RegisterHotKey(self, int hotkeyId, int modifiers, int keycode) -> bool

+Registers a system wide hotkey. Every time the user presses the hotkey
+registered here, this window will receive a hotkey event. It will
+receive the event even if the application is in the background and
+does not have the input focus because the user is working with some
+other application.  To bind an event handler function to this hotkey
+use EVT_HOTKEY with an id equal to hotkeyId.  Returns True if the
+hotkey was registered successfully.
+ +
ReleaseMouse(*args, **kwargs)
ReleaseMouse(self)

+Releases mouse input captured with wx.Window.CaptureMouse.
+ +
RemoveChild(*args, **kwargs)
RemoveChild(self, Window child)

+Removes a child window. This is called automatically by window
+deletion functions so should not be required by the application
+programmer.
+ +
RemoveEventHandler(*args, **kwargs)
RemoveEventHandler(self, EvtHandler handler) -> bool

+Find the given handler in the event handler chain and remove (but not
+delete) it from the event handler chain, returns True if it was found
+and False otherwise (this also results in an assert failure so this
+function should only be called when the handler is supposed to be
+there.)
+ +
Reparent(*args, **kwargs)
Reparent(self, Window newParent) -> bool

+Reparents the window, i.e the window will be removed from its current
+parent window (e.g. a non-standard toolbar in a wxFrame) and then
+re-inserted into another. Available on Windows and GTK.  Returns True
+if the parent was changed, False otherwise (error or newParent ==
+oldParent)
+ +
ScreenToClient(*args, **kwargs)
ScreenToClient(self, Point pt) -> Point

+Converts from screen to client window coordinates.
+ +
ScreenToClientXY(*args, **kwargs)
ScreenToClientXY(int x, int y) -> (x,y)

+Converts from screen to client window coordinates.
+ +
ScrollLines(*args, **kwargs)
ScrollLines(self, int lines) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of lines down, if lines is positive, or up if lines
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollPages(*args, **kwargs)
ScrollPages(self, int pages) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of pages down, if pages is positive, or up if pages
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollWindow(*args, **kwargs)
ScrollWindow(self, int dx, int dy, Rect rect=None)

+Physically scrolls the pixels in the window and move child windows
+accordingly.  Use this function to optimise your scrolling
+implementations, to minimise the area that must be redrawn. Note that
+it is rarely required to call this function from a user program.
+ +
SetAcceleratorTable(*args, **kwargs)
SetAcceleratorTable(self, AcceleratorTable accel)

+Sets the accelerator table for this window.
+ +
SetAutoLayout(*args, **kwargs)
SetAutoLayout(self, bool autoLayout)

+Determines whether the Layout function will be called automatically
+when the window is resized.  lease note that this only happens for the
+windows usually used to contain children, namely `wx.Panel` and
+`wx.TopLevelWindow` (and the classes deriving from them).

+This method is called implicitly by `SetSizer` but if you use
+`SetConstraints` you should call it manually or otherwise the window
+layout won't be correctly updated when its size changes.
+ +
SetBackgroundColour(*args, **kwargs)
SetBackgroundColour(self, Colour colour) -> bool

+Sets the background colour of the window.  Returns True if the colour
+was changed.  The background colour is usually painted by the default
+EVT_ERASE_BACKGROUND event handler function under Windows and
+automatically under GTK.  Using `wx.NullColour` will reset the window
+to the default background colour.

+Note that setting the background colour may not cause an immediate
+refresh, so you may wish to call `ClearBackground` or `Refresh` after
+calling this function.

+Using this function will disable attempts to use themes for this
+window, if the system supports them.  Use with care since usually the
+themes represent the appearance chosen by the user to be used for all
+applications on the system.
+ +
SetBackgroundStyle(*args, **kwargs)
SetBackgroundStyle(self, int style) -> bool

+Returns the background style of the window. The background style
+indicates how the background of the window is drawn.

+    ======================  ========================================
+    wx.BG_STYLE_SYSTEM      The background colour or pattern should
+                            be determined by the system
+    wx.BG_STYLE_COLOUR      The background should be a solid colour
+    wx.BG_STYLE_CUSTOM      The background will be implemented by the
+                            application.
+    ======================  ========================================

+On GTK+, use of wx.BG_STYLE_CUSTOM allows the flicker-free drawing of
+a custom background, such as a tiled bitmap. Currently the style has
+no effect on other platforms.

+:see: `GetBackgroundStyle`, `SetBackgroundColour`
+ +
SetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `SetInitialSize`
+ +
SetCaret(*args, **kwargs)
SetCaret(self, Caret caret)

+Sets the caret associated with the window.
+ +
SetClientRect(*args, **kwargs)
SetClientRect(self, Rect rect)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSize(*args, **kwargs)
SetClientSize(self, Size size)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSizeWH(*args, **kwargs)
SetClientSizeWH(self, int width, int height)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetConstraints(*args, **kwargs)
SetConstraints(self, LayoutConstraints constraints)

+Sets the window to have the given layout constraints. If an existing
+layout constraints object is already owned by the window, it will be
+deleted.  Pass None to disassociate and delete the window's current
+constraints.

+You must call SetAutoLayout to tell a window to use the constraints
+automatically in its default EVT_SIZE handler; otherwise, you must
+handle EVT_SIZE yourself and call Layout() explicitly. When setting
+both a wx.LayoutConstraints and a wx.Sizer, only the sizer will have
+effect.
+ +
SetContainingSizer(*args, **kwargs)
SetContainingSizer(self, Sizer sizer)

+This normally does not need to be called by application code. It is
+called internally when a window is added to a sizer, and is used so
+the window can remove itself from the sizer when it is destroyed.
+ +
SetCursor(*args, **kwargs)
SetCursor(self, Cursor cursor) -> bool

+Sets the window's cursor. Notice that the window cursor also sets it
+for the children of the window implicitly.

+The cursor may be wx.NullCursor in which case the window cursor will
+be reset back to default.
+ +
SetDimensions(*args, **kwargs)
SetDimensions(self, int x, int y, int width, int height, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels.  The sizeFlags
+parameter indicates the interpretation of the other params if they are
+equal to -1.

+    ========================  ======================================
+    wx.SIZE_AUTO              A -1 indicates that a class-specific
+                              default should be used.
+    wx.SIZE_USE_EXISTING      Axisting dimensions should be used if
+                              -1 values are supplied.
+    wxSIZE_ALLOW_MINUS_ONE    Allow dimensions of -1 and less to be
+                              interpreted as real dimensions, not
+                              default values.
+    ========================  ======================================
+ +
SetDoubleBuffered(*args, **kwargs)
SetDoubleBuffered(self, bool on)

+Currently wxGTK2 only.
+ +
SetDropTarget(*args, **kwargs)
SetDropTarget(self, DropTarget dropTarget)

+Associates a drop target with this window.  If the window already has
+a drop target, it is deleted.
+ +
SetEventHandler(*args, **kwargs)
SetEventHandler(self, EvtHandler handler)

+Sets the event handler for this window.  An event handler is an object
+that is capable of processing the events sent to a window.  (In other
+words, is able to dispatch the events to handler function.)  By
+default, the window is its own event handler, but an application may
+wish to substitute another, for example to allow central
+implementation of event-handling for a variety of different window
+classes.

+It is usually better to use `wx.Window.PushEventHandler` since this sets
+up a chain of event handlers, where an event not handled by one event
+handler is handed off to the next one in the chain.
+ +
SetExtraStyle(*args, **kwargs)
SetExtraStyle(self, long exStyle)

+Sets the extra style bits for the window.  Extra styles are the less
+often used style bits which can't be set with the constructor or with
+SetWindowStyleFlag()
+ +
SetFocus(*args, **kwargs)
SetFocus(self)

+Set's the focus to this window, allowing it to receive keyboard input.
+ +
SetFocusFromKbd(*args, **kwargs)
SetFocusFromKbd(self)

+Set focus to this window as the result of a keyboard action.  Normally
+only called internally.
+ +
SetFont(*args, **kwargs)
SetFont(self, Font font) -> bool

+Sets the font for this window.
+ +
SetForegroundColour(*args, **kwargs)
SetForegroundColour(self, Colour colour) -> bool

+Sets the foreground colour of the window.  Returns True is the colour
+was changed.  The interpretation of foreground colour is dependent on
+the window class; it may be the text colour or other colour, or it may
+not be used at all.
+ +
SetHelpText(*args, **kwargs)
SetHelpText(self, String text)

+Sets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
SetHelpTextForId(*args, **kwargs)
SetHelpTextForId(self, String text)

+Associate this help text with all windows with the same id as this
+one.
+ +
SetId(*args, **kwargs)
SetId(self, int winid)

+Sets the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one, an identifier
+will be generated. Normally, the identifier should be provided on
+creation and should not be modified subsequently.
+ +
SetInitialSize(*args, **kwargs)
SetInitialSize(self, Size size=DefaultSize)

+A 'Smart' SetSize that will fill in default size components with the
+window's *best size* values.  Also set's the minsize for use with sizers.
+ +
SetLabel(*args, **kwargs)
SetLabel(self, String label)

+Set the text which the window shows in its label if applicable.
+ +
SetLayoutDirection(*args, **kwargs)
SetLayoutDirection(self, int dir)

+Set the layout direction (LTR or RTL) for this window.
+ +
SetMaxSize(*args, **kwargs)
SetMaxSize(self, Size maxSize)

+A more convenient method than `SetSizeHints` for setting just the
+max size.
+ +
SetMinSize(*args, **kwargs)
SetMinSize(self, Size minSize)

+A more convenient method than `SetSizeHints` for setting just the
+min size.
+ +
SetName(*args, **kwargs)
SetName(self, String name)

+Sets the window's name.  The window name is used for ressource setting
+in X, it is not the same as the window title/label
+ +
SetOwnBackgroundColour(*args, **kwargs)
SetOwnBackgroundColour(self, Colour colour)
+ +
SetOwnFont(*args, **kwargs)
SetOwnFont(self, Font font)
+ +
SetOwnForegroundColour(*args, **kwargs)
SetOwnForegroundColour(self, Colour colour)
+ +
SetPosition = Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
SetRect(*args, **kwargs)
SetRect(self, Rect rect, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels using a wx.Rect.
+ +
SetScrollPos(*args, **kwargs)
SetScrollPos(self, int orientation, int pos, bool refresh=True)

+Sets the position of one of the built-in scrollbars.
+ +
SetScrollbar(*args, **kwargs)
SetScrollbar(self, int orientation, int position, int thumbSize, int range, 
+    bool refresh=True)

+Sets the scrollbar properties of a built-in scrollbar.
+ +
SetSize(*args, **kwargs)
SetSize(self, Size size)

+Sets the size of the window in pixels.
+ +
SetSizeHints(*args, **kwargs)
SetSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1, int incW=-1, 
+    int incH=-1)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeHintsSz(*args, **kwargs)
SetSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize, Size incSize=DefaultSize)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeWH(*args, **kwargs)
SetSizeWH(self, int width, int height)

+Sets the size of the window in pixels.
+ +
SetSizer(*args, **kwargs)
SetSizer(self, Sizer sizer, bool deleteOld=True)

+Sets the window to have the given layout sizer. The window will then
+own the object, and will take care of its deletion. If an existing
+layout sizer object is already owned by the window, it will be deleted
+if the deleteOld parameter is true. Note that this function will also
+call SetAutoLayout implicitly with a True parameter if the sizer is
+non-None, and False otherwise.
+ +
SetSizerAndFit(*args, **kwargs)
SetSizerAndFit(self, Sizer sizer, bool deleteOld=True)

+The same as SetSizer, except it also sets the size hints for the
+window based on the sizer's minimum size.
+ +
SetThemeEnabled(*args, **kwargs)
SetThemeEnabled(self, bool enableTheme)

+This function tells a window if it should use the system's "theme"
+ code to draw the windows' background instead if its own background
+ drawing code. This will only have an effect on platforms that support
+ the notion of themes in user defined windows. One such platform is
+ GTK+ where windows can have (very colourful) backgrounds defined by a
+ user's selected theme.

+Dialogs, notebook pages and the status bar have this flag set to true
+by default so that the default look and feel is simulated best.
+ +
SetToolTip(*args, **kwargs)
SetToolTip(self, ToolTip tip)

+Attach a tooltip to the window.
+ +
SetToolTipString(*args, **kwargs)
SetToolTipString(self, String tip)

+Attach a tooltip to the window.
+ +
SetTransparent(*args, **kwargs)
SetTransparent(self, byte alpha) -> bool

+Attempt to set the transparency of this window to the ``alpha`` value,
+returns True on success.  The ``alpha`` value is an integer in the
+range of 0 to 255, where 0 is fully transparent and 255 is fully
+opaque.
+ +
SetValidator(*args, **kwargs)
SetValidator(self, Validator validator)

+Deletes the current validator (if any) and sets the window validator,
+having called wx.Validator.Clone to create a new validator of this
+type.
+ +
SetVirtualSize(*args, **kwargs)
SetVirtualSize(self, Size size)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetVirtualSizeHints(*args, **kwargs)
SetVirtualSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeHintsSz(*args, **kwargs)
SetVirtualSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeWH(*args, **kwargs)
SetVirtualSizeWH(self, int w, int h)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetWindowStyle = SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowVariant(*args, **kwargs)
SetWindowVariant(self, int variant)

+Sets the variant of the window/font size to use for this window, if
+the platform supports variants, for example, wxMac.
+ +
ShouldInheritColours(*args, **kwargs)
ShouldInheritColours(self) -> bool

+Return true from here to allow the colours of this window to be
+changed by InheritAttributes, returning false forbids inheriting them
+from the parent window.

+The base class version returns false, but this method is overridden in
+wxControl where it returns true.
+ +
Show(*args, **kwargs)
Show(self, bool show=True) -> bool

+Shows or hides the window. You may need to call Raise for a top level
+window if you want to bring it to top, although this is not needed if
+Show is called immediately after the frame creation.  Returns True if
+the window has been shown or hidden or False if nothing was done
+because it already was in the requested state.
+ +
Thaw(*args, **kwargs)
Thaw(self)

+Reenables window updating after a previous call to Freeze.  Calls to
+Freeze/Thaw may be nested, so Thaw must be called the same number of
+times that Freeze was before the window will be updated.
+ +
ToggleWindowStyle(*args, **kwargs)
ToggleWindowStyle(self, int flag) -> bool

+Turn the flag on if it had been turned off before and vice versa,
+returns True if the flag is turned on by this function call.
+ +
TransferDataFromWindow(*args, **kwargs)
TransferDataFromWindow(self) -> bool

+Transfers values from child controls to data areas specified by their
+validators. Returns false if a transfer failed.  If the window has
+wx.WS_EX_VALIDATE_RECURSIVELY extra style flag set, the method will
+also call TransferDataFromWindow() of all child windows.
+ +
TransferDataToWindow(*args, **kwargs)
TransferDataToWindow(self) -> bool

+Transfers values to child controls from data areas specified by their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call TransferDataToWindow() of
+all child windows.
+ +
UnregisterHotKey(*args, **kwargs)
UnregisterHotKey(self, int hotkeyId) -> bool

+Unregisters a system wide hotkey.
+ +
Update(*args, **kwargs)
Update(self)

+Calling this method immediately repaints the invalidated area of the
+window instead of waiting for the EVT_PAINT event to happen, (normally
+this would usually only happen when the flow of control returns to the
+event loop.)  Notice that this function doesn't refresh the window and
+does nothing if the window has been already repainted.  Use `Refresh`
+first if you want to immediately redraw the window (or some portion of
+it) unconditionally.
+ +
UpdateWindowUI(*args, **kwargs)
UpdateWindowUI(self, long flags=UPDATE_UI_NONE)

+This function sends EVT_UPDATE_UI events to the window. The particular
+implementation depends on the window; for example a wx.ToolBar will
+send an update UI event for each toolbar button, and a wx.Frame will
+send an update UI event for each menubar menu item. You can call this
+function from your application to ensure that your UI is up-to-date at
+a particular point in time (as far as your EVT_UPDATE_UI handlers are
+concerned). This may be necessary if you have called
+`wx.UpdateUIEvent.SetMode` or `wx.UpdateUIEvent.SetUpdateInterval` to
+limit the overhead that wxWindows incurs by sending update UI events
+in idle time.
+ +
UseBgCol(*args, **kwargs)
UseBgCol(self) -> bool
+ +
Validate(*args, **kwargs)
Validate(self) -> bool

+Validates the current values of the child controls using their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call Validate() of all child
+windows.  Returns false if any of the validations failed.
+ +
WarpPointer(*args, **kwargs)
WarpPointer(self, int x, int y)

+Moves the pointer to the given position on the window.

+NOTE: This function is not supported under Mac because Apple Human
+Interface Guidelines forbid moving the mouse cursor programmatically.
+ +
+Static methods inherited from wx._core.Window:
+
FindFocus(*args, **kwargs)
FindFocus() -> Window

+Returns the window or control that currently has the keyboard focus,
+or None.
+ +
GetCapture(*args, **kwargs)
GetCapture() -> Window

+Returns the window which currently captures the mouse or None
+ +
NewControlId(*args, **kwargs)
NewControlId() -> int

+Generate a control id for the controls which were not given one.
+ +
NextControlId(*args, **kwargs)
NextControlId(int winid) -> int

+Get the id of the control following the one with the given
+autogenerated) id
+ +
PrevControlId(*args, **kwargs)
PrevControlId(int winid) -> int

+Get the id of the control preceding the one with the given
+autogenerated) id
+ +
+Data descriptors inherited from wx._core.Window:
+
AcceleratorTable
+
See `GetAcceleratorTable` and `SetAcceleratorTable`
+
+
AutoLayout
+
See `GetAutoLayout` and `SetAutoLayout`
+
+
BackgroundColour
+
See `GetBackgroundColour` and `SetBackgroundColour`
+
+
BackgroundStyle
+
See `GetBackgroundStyle` and `SetBackgroundStyle`
+
+
BestSize
+
See `GetBestSize`
+
+
BestVirtualSize
+
See `GetBestVirtualSize`
+
+
Border
+
See `GetBorder`
+
+
Caret
+
See `GetCaret` and `SetCaret`
+
+
CharHeight
+
See `GetCharHeight`
+
+
CharWidth
+
See `GetCharWidth`
+
+
Children
+
See `GetChildren`
+
+
ClientAreaOrigin
+
See `GetClientAreaOrigin`
+
+
ClientRect
+
See `GetClientRect` and `SetClientRect`
+
+
ClientSize
+
See `GetClientSize` and `SetClientSize`
+
+
Constraints
+
See `GetConstraints` and `SetConstraints`
+
+
ContainingSizer
+
See `GetContainingSizer` and `SetContainingSizer`
+
+
Cursor
+
See `GetCursor` and `SetCursor`
+
+
DefaultAttributes
+
See `GetDefaultAttributes`
+
+
DropTarget
+
See `GetDropTarget` and `SetDropTarget`
+
+
EffectiveMinSize
+
See `GetEffectiveMinSize`
+
+
Enabled
+
See `IsEnabled` and `Enable`
+
+
EventHandler
+
See `GetEventHandler` and `SetEventHandler`
+
+
ExtraStyle
+
See `GetExtraStyle` and `SetExtraStyle`
+
+
Font
+
See `GetFont` and `SetFont`
+
+
ForegroundColour
+
See `GetForegroundColour` and `SetForegroundColour`
+
+
GrandParent
+
See `GetGrandParent`
+
+
GtkWidget
+
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+
+
Handle
+
See `GetHandle`
+
+
HelpText
+
See `GetHelpText` and `SetHelpText`
+
+
Id
+
See `GetId` and `SetId`
+
+
Label
+
See `GetLabel` and `SetLabel`
+
+
LayoutDirection
+
See `GetLayoutDirection` and `SetLayoutDirection`
+
+
MaxHeight
+
See `GetMaxHeight`
+
+
MaxSize
+
See `GetMaxSize` and `SetMaxSize`
+
+
MaxWidth
+
See `GetMaxWidth`
+
+
MinHeight
+
See `GetMinHeight`
+
+
MinSize
+
See `GetMinSize` and `SetMinSize`
+
+
MinWidth
+
See `GetMinWidth`
+
+
Name
+
See `GetName` and `SetName`
+
+
Parent
+
See `GetParent`
+
+
Position
+
See `GetPosition` and `SetPosition`
+
+
Rect
+
See `GetRect` and `SetRect`
+
+
ScreenPosition
+
See `GetScreenPosition`
+
+
ScreenRect
+
See `GetScreenRect`
+
+
Shown
+
See `IsShown` and `Show`
+
+
Size
+
See `GetSize` and `SetSize`
+
+
Sizer
+
See `GetSizer` and `SetSizer`
+
+
ThemeEnabled
+
See `GetThemeEnabled` and `SetThemeEnabled`
+
+
ToolTip
+
See `GetToolTip` and `SetToolTip`
+
+
TopLevel
+
See `IsTopLevel`
+
+
TopLevelParent
+
See `GetTopLevelParent`
+
+
UpdateClientRect
+
See `GetUpdateClientRect`
+
+
UpdateRegion
+
See `GetUpdateRegion`
+
+
Validator
+
See `GetValidator` and `SetValidator`
+
+
VirtualSize
+
See `GetVirtualSize` and `SetVirtualSize`
+
+
WindowStyle
+
See `GetWindowStyle` and `SetWindowStyle`
+
+
WindowStyleFlag
+
See `GetWindowStyleFlag` and `SetWindowStyleFlag`
+
+
WindowVariant
+
See `GetWindowVariant` and `SetWindowVariant`
+
+
+Methods inherited from wx._core.EvtHandler:
+
AddPendingEvent(*args, **kwargs)
AddPendingEvent(self, Event event)
+ +
Bind(self, event, handler, source=None, id=-1, id2=-1)
Bind an event to an event handler.

+:param event: One of the EVT_* objects that specifies the
+              type of event to bind,

+:param handler: A callable object to be invoked when the
+              event is delivered to self.  Pass None to
+              disconnect an event handler.

+:param source: Sometimes the event originates from a
+              different window than self, but you still
+              want to catch it in self.  (For example, a
+              button event delivered to a frame.)  By
+              passing the source of the event, the event
+              handling system is able to differentiate
+              between the same event type from different
+              controls.

+:param id: Used to spcify the event source by ID instead
+           of instance.

+:param id2: Used when it is desirable to bind a handler
+              to a range of IDs, such as with EVT_MENU_RANGE.
+ +
Connect(*args, **kwargs)
Connect(self, int id, int lastId, int eventType, PyObject func)
+ +
Disconnect(*args, **kwargs)
Disconnect(self, int id, int lastId=-1, EventType eventType=wxEVT_NULL) -> bool
+ +
GetEvtHandlerEnabled(*args, **kwargs)
GetEvtHandlerEnabled(self) -> bool
+ +
GetNextHandler(*args, **kwargs)
GetNextHandler(self) -> EvtHandler
+ +
GetPreviousHandler(*args, **kwargs)
GetPreviousHandler(self) -> EvtHandler
+ +
ProcessEvent(*args, **kwargs)
ProcessEvent(self, Event event) -> bool
+ +
ProcessPendingEvents(*args, **kwargs)
ProcessPendingEvents(self)
+ +
SetEvtHandlerEnabled(*args, **kwargs)
SetEvtHandlerEnabled(self, bool enabled)
+ +
SetNextHandler(*args, **kwargs)
SetNextHandler(self, EvtHandler handler)
+ +
SetPreviousHandler(*args, **kwargs)
SetPreviousHandler(self, EvtHandler handler)
+ +
Unbind(self, event, source=None, id=-1, id2=-1)
Disconencts the event handler binding for event from self.
+Returns True if successful.
+ +
+Data descriptors inherited from wx._core.EvtHandler:
+
EvtHandlerEnabled
+
See `GetEvtHandlerEnabled` and `SetEvtHandlerEnabled`
+
+
NextHandler
+
See `GetNextHandler` and `SetNextHandler`
+
+
PreviousHandler
+
See `GetPreviousHandler` and `SetPreviousHandler`
+
+
+Methods inherited from wx._core.Object:
+
GetClassName(*args, **kwargs)
GetClassName(self) -> String

+Returns the class name of the C++ class using wxRTTI.
+ +
IsSameAs(*args, **kwargs)
IsSameAs(self, Object p) -> bool

+For wx.Objects that use C++ reference counting internally, this method
+can be used to determine if two objects are referencing the same data
+object.
+ +
+Data descriptors inherited from wx._core.Object:
+
ClassName
+
See `GetClassName`
+
+
__dict__
+
dictionary for instance variables (if defined)
+
+
__weakref__
+
list of weak references to the object (if defined)
+
+

+ + + + + +
 
+Functions
       
create(parent)
+

+ + + + + +
 
+Data
       DEFAULT_MENU_ITEMS = (('xcalc RPN', 'HP-style', 'xcalc -rpn'), ('xcalc', 'TI-style', 'xcalc'), ('gcalc', 'Gnome calculator', 'gcalctool'), ('nedit-client', 'window editor', 'nedit-client'), ('nedit-nc', 'window editor', 'nedit-nc'), ('xman', 'X11 man pages', 'xman -bothshown'), ('xeyes', "Here's looking at you, kid!", 'xeyes'), ('wxmtxy', 'motor tool', '/APSshare/bin/python ./wxmtxy.py'), ('separator',), ('xclock', 'conventional analog clock', 'xclock'))
+wxID_FRAME1 = 100
+wxID_FRAME1BUTTON1 = 101
+wxID_FRAME1PANEL = 102
+wxID_FRAME1THEMENUITEMS0 = 103
+wxID_FRAME1THEMENUITEMS1 = 104
+ \ No newline at end of file diff --git a/pydoc/pvConnect.html b/pydoc/pvConnect.html new file mode 100644 index 0000000..9cf930b --- /dev/null +++ b/pydoc/pvConnect.html @@ -0,0 +1,215 @@ + + +Python: module pvConnect + + + + +
 
+ 
pvConnect
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/pvConnect.py
+

simplified connections to an EPICS PV using CaChannel

+Provides these classes:

+    CaPollWx
+        Use in WX-based GUIs to call ca.poll() in the background
+        @param interval_s: [float] interval between calls to ca.poll()

+    EpicsPv
+        manage a CaChannel connection with an EPICS PV
+        @param name: [string] EPICS PV to connect

+Provides these utility routines:

+    on_exit(timer)
+        Exit handler to stop the ca.poll()
+        @param timer: CaPollWx object

+    CaPoll()
+        Use in non-GUI scripts to call ca.poll() in the background

+    GetRTYP(pv)
+        Returns the record type of "pv"
+        @param pv:[string]
+        @return: [string] EPICS record type or None if cannot connect

+    testConnect(pv)
+        Tests if a CaChannel connection can be established to "pv"
+        @param pv:[string]
+        @return: True if can connect, otherwise False

+    receiver(value)
+        Example response to an EPICS monitor on the channel
+        @param value: str(epics_args['pv_value'])

+@version: 
+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/pvConnect.py $
+# $Id: pvConnect.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+

+ + + + + +
 
+Modules
       
CaChannel
+
sys
+
time
+
wx
+

+ + + + + +
 
+Classes
       
+
CaPollWx +
EpicsPv +
+

+ + + + + + + +
 
+class CaPollWx
   Use in WX-based GUIs to call ca.poll() in the background

+Set up a separate thread to trigger periodic calls to the 
+EPICS CaChannel.ca.poll() connection.  Awaiting (a.k.a., 
+outstanding or pending) channel access background 
+activity executes during the poll.  Calls pend_event() 
+with a timeout short enough to poll.  

+The default polling interval is 0.1 second.

+@note: The code will silently do nothing if wx was not imported.
+This routine use the wx.PyTimer() to call ca.poll() frequently 
+during the main WX event loop.

+@warning: Only use this in a routine that has already called 
+wx.App() or an exception will occur.  
+Command line code will need to call ca.poll() using a different 
+method (such as CaPoll() below).
 
 Methods defined here:
+
GetInterval(self)
return the current interval between calls to CaChannel.ca.poll()
+ +
SetInterval(self, interval_s)
set the next interval between calls to CaChannel.ca.poll()
+ +
__init__(self, interval_s=0.10000000000000001)
@param interval_s: [float] interval between calls to ca.poll()
+ +
poll(self)
Poll for changes in Channel
+ +
start(self)
start polling
+ +
stop(self)
stop polling
+ +

+ + + + + + + +
 
+class EpicsPv
   manage a connection with an EPICS PV
 
 Methods defined here:
+
GetChan(self)
@return: CaChannel channel
+ +
GetEpicsArgs(self)
@return: epics_args from the most recent monitor event
+ +
GetPv(self)
@return: PV name
+ +
GetUserArgs(self)
@return: user_args from the most recent monitor event
+ +
GetUserCallback(self)
return the callback function supplied by the caller
+values will be set by user_callback(value)
+@return: function object
+ +
GetValue(self)
@return: value from EPICS from the most recent monitor event
+ +
SetMask(self, mask)
Define the mask used when applying a channel monitor.
+The default is: self.mask = CaChannel.ca.DBE_VALUE
+@param mask: as defined in the CaChannel manual
+ +
SetPv(self, name)
redefine the PV name only if there is no connection
+@param name: valid EPICS PV name
+ +
SetUserArgs(self, user_args)
define the user_args tuple to use when monitoring
+@param user_args: tuple of user data (for use in user_callback function)
+ +
SetUserCallback(self, user_callback)
Set the callback function supplied by the caller
+values will be set by user_callback(value)
+@param user_callback: function object
+ +
__init__(self, name)
initialize the class and set default values
+@param name: [string] EPICS PV to connect
+ +
callback(self, epics_args, user_args)
receive an EPICS callback, copy epics_args and user_args, then call user
+ +
connect(self)
initiate the connection with EPICS
+ +
connectw(self)
initiate the connection with EPICS, standard wait for the connection
+ +
monitor(self)
Initiate a monitor on the EPICS channel, delivering the 
+CaChannel callback to the supplied function.

+@note: Example:
+    ch = EpicsPv(test_pv)
+    ch.connectw()
+    uargs = test_pv, widget.SetLabel
+    ch.SetUserArgs(uargs)
+    ch.SetUserCallback(myCallback)
+    ch.monitor()

+@warning: At this time, there is not an easy way to turn off monitors.
+    Instead, ch.release() the channel (which will set self.chan = None),
+    To re-start a monitor after a ch.release(), connect as usual and start
+    the monitor again, as the first time.
+ +
release(self)
release the connection with EPICS
+@note: Release ALL channels before calling on_exit()
+ +

+ + + + + +
 
+Functions
       
CaPoll()
Use in non-GUI scripts to call ca.poll() in the background
+
GetRTYP(pv)
Returns the record type of "pv"
+@param pv:[string]
+@return: [string] EPICS record type or None if cannot connect
+
on_exit(timer=None)
Exit handler to stop the ca.poll()
+@param timer: CaPollWx object

+Call this to cleanup when program is exiting.
+ONLY call this function during a program's exit handling.
+If ca.task_exit() is not called, then expect to see the errors:
+     FATAL: exception not rethrown
+     Abort
+
receiver(epics_args, user_args)
Example response to an EPICS monitor on the channel
+@param value: str(epics_args['pv_value'])
+
testConnect(pv)
Tests if a CaChannel connection can be established to "pv"
+@param pv:[string]
+@return: True if can connect, otherwise False
+

+ + + + + +
 
+Data
       IMPORTED_CACHANNEL = True
+IMPORTED_WX = True
+ \ No newline at end of file diff --git a/pydoc/setup.html b/pydoc/setup.html new file mode 100644 index 0000000..5faed01 --- /dev/null +++ b/pydoc/setup.html @@ -0,0 +1,51 @@ + + +Python: module setup + + + + +
 
+ 
setup
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/setup.py
+

configuration for the distutils installation method

+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/setup.py $
+# $Id: setup.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+  for more help, see:
+  http://wiki.python.org/moin/Distutils/Tutorial
+  http://www.py2exe.org/index.cgi/Tutorial
+  http://www.linux.com/feature/118439
+  http://wiki.python.org/moin/Distutils

+

+ + + + + +
 
+Modules
       
pydoc
+
wxmtxy_version
+

+ + + + + +
 
+Data
       data_files = [('examples', ['examples/USAXS_XY.xml', 'examples/standard-paddle.txt', 'examples/test-settings.xml']), ('graphics', ['graphics/delete.bmp', 'graphics/set.bmp', 'graphics/go.bmp']), ('.', 'LICENSE')]
+examples = ['examples/USAXS_XY.xml', 'examples/standard-paddle.txt', 'examples/test-settings.xml']
+examples_dir = 'examples'
+graphics = ['graphics/delete.bmp', 'graphics/set.bmp', 'graphics/go.bmp']
+graphics_dir = 'graphics'
+packages = []
+py2exe_options = {'ascii': 1, 'bundle_files': 1, 'compressed': 1, 'optimize': 2}
+scripts = ['wxmtxy.py', 'wxmtxy_root.py', 'wxmtxy_pair.py', 'wxmtxy_tab.py', 'wxmtxy_row.py', 'wxmtxy_xml.py', 'wxmtxy_pvsetup.py', 'wxmtxy_axis.py', 'wxmtxy_version.py', 'wxmtxy_htmlview.py', 'pvConnect.py']
+ \ No newline at end of file diff --git a/pydoc/wxmtxy.html b/pydoc/wxmtxy.html new file mode 100644 index 0000000..fbac303 --- /dev/null +++ b/pydoc/wxmtxy.html @@ -0,0 +1,490 @@ + + +Python: module wxmtxy + + + + +
 
+ 
wxmtxy
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy.py
+

start the wxmtxy GUI

+@version: 
+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy.py $
+# $Id: wxmtxy.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+README

+    *wxmtxy* (an EPICS GUI tool) provides support for an X,Y positioner 
+    (motor) pair by allowing users to define a table of known positions 
+    and providing a one-button click to drive a chosen X,Y pair to a specific
+    table setting.  Also can record current position into a setting.

+    Several sets of X,Y positioners can be configured.  (Each set is 
+    separate.)  In fact, the positioners do not have to be motors,
+    but can be any type of EPICS PV that will accept a numeric value.


+    wxmtxy is based on wxPython and relies on CaChannel to communicate 
+    with EPICS. 
+    
+    In the Graphical User Interface (GUI), tooltips are provided for 
+    most items.  Moving and pausing the mouse over a widget (GUI 
+    component such as a button or a label) will cause a terse description 
+    of that widget to be displayed. Moving the mouse away will cause that 
+    tooltip to disappear. 
+    
+    For more help, explanations are provided in the HTML pages.
+    
+    TRAC wiki
+    @see: https://subversion.xor.aps.anl.gov/trac/bcdaext/wiki/wxmtxy
+    
+    @note: subversion checkout:  svn co https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/

+----
+ @note: wxPython does not provide standard tear-off windows
+ @see: http://wiki.python.org/moin/Distutils/Tutorial
+ @see: http://www.py2exe.org/index.cgi/Tutorial
+ @note: for an undo example, see: http://wiki.wxpython.org/AnotherTutorial

+

+ + + + + +
 
+Modules
       
pvConnect
+
sys
+
wx
+
wxmtxy_root
+

+ + + + + +
 
+Classes
       
+
wx._core.App(wx._core.PyApp) +
+
+
BoaApp +
+
+
+

+ + + + + + + +
 
+class BoaApp(wx._core.App)
   Built using Boa-constructor (as a subclass of wx.App)
 
 
Method resolution order:
+
BoaApp
+
wx._core.App
+
wx._core.PyApp
+
wx._core.EvtHandler
+
wx._core.Object
+
__builtin__.object
+
+
+Methods defined here:
+
OnInit(self)
demonstrate the use of this tool
+ +
+Methods inherited from wx._core.App:
+
Destroy(self)
+ +
MainLoop(self)
Execute the main GUI event loop
+ +
OnPreInit(self)
Things that must be done after _BootstrapApp has done its
+thing, but would be nice if they were already done by the time
+that OnInit is called.
+ +
RedirectStdio(self, filename=None)
Redirect sys.stdout and sys.stderr to a file or a popup window.
+ +
RestoreStdio(self)
+ +
SetOutputWindowAttributes(self, title=None, pos=None, size=None)
Set the title, position and/or size of the output window if
+the stdio has been redirected.  This should be called before
+any output would cause the output window to be created.
+ +
SetTopWindow(self, frame)
Set the "main" top level window
+ +
__del__(self, destroy=<unbound method PyApp.<lambda>>)
+ +
__init__(self, redirect=False, filename=None, useBestVisual=False, clearSigInt=True)
Construct a ``wx.App`` object.  

+:param redirect: Should ``sys.stdout`` and ``sys.stderr`` be
+    redirected?  Defaults to True on Windows and Mac, False
+    otherwise.  If `filename` is None then output will be
+    redirected to a window that pops up as needed.  (You can
+    control what kind of window is created for the output by
+    resetting the class variable ``outputWindowClass`` to a
+    class of your choosing.)

+:param filename: The name of a file to redirect output to, if
+    redirect is True.

+:param useBestVisual: Should the app try to use the best
+    available visual provided by the system (only relevant on
+    systems that have more than one visual.)  This parameter
+    must be used instead of calling `SetUseBestVisual` later
+    on because it must be set before the underlying GUI
+    toolkit is initialized.

+:param clearSigInt: Should SIGINT be cleared?  This allows the
+    app to terminate upon a Ctrl-C in the console like other
+    GUI apps will.

+:note: You should override OnInit to do applicaition
+    initialization to ensure that the system, toolkit and
+    wxWidgets are fully initialized.
+ +
+Data and other attributes inherited from wx._core.App:
+
outputWindowClass = <class wx._core.PyOnDemandOutputWindow at 0xf7b3295c>
A class that can be used for redirecting Python's stdout and
+stderr streams.  It will do nothing until something is wrriten to
+the stream at which point it will create a Frame with a text area
+and write the text there.
+ +
+Methods inherited from wx._core.PyApp:
+
Dispatch(*args, **kwargs)
Dispatch(self) -> bool

+Process the first event in the event queue (blocks until an event
+appears if there are none currently)
+ +
Exit(*args, **kwargs)
Exit(self)

+Exit the main loop thus terminating the application.
+:see: `wx.Exit`
+ +
ExitMainLoop(*args, **kwargs)
ExitMainLoop(self)

+Exit the main GUI loop during the next iteration of the main
+loop, (i.e. it does not stop the program immediately!)
+ +
GetAppName(*args, **kwargs)
GetAppName(self) -> String

+Get the application name.
+ +
GetAssertMode(*args, **kwargs)
GetAssertMode(self) -> int

+Get the current OnAssert behaviour setting.
+ +
GetClassName(*args, **kwargs)
GetClassName(self) -> String

+Get the application's class name.
+ +
GetExitOnFrameDelete(*args, **kwargs)
GetExitOnFrameDelete(self) -> bool

+Get the current exit behaviour setting.
+ +
GetLayoutDirection(*args, **kwargs)
GetLayoutDirection(self) -> int

+Return the layout direction for the current locale.
+ +
GetPrintMode(*args, **kwargs)
GetPrintMode(self) -> int
+ +
GetTopWindow(*args, **kwargs)
GetTopWindow(self) -> Window

+Return the *main* top level window (if it hadn't been set previously
+with SetTopWindow(), will return just some top level window and, if
+there not any, will return None)
+ +
GetTraits(*args, **kwargs)
GetTraits(self) -> wxAppTraits

+Return (and create if necessary) the app traits object to which we
+delegate for everything which either should be configurable by the
+user (then he can change the default behaviour simply by overriding
+CreateTraits() and returning his own traits object) or which is
+GUI/console dependent as then wx.AppTraits allows us to abstract the
+differences behind the common facade.

+:todo: Add support for overriding CreateAppTraits in wxPython.
+ +
GetUseBestVisual(*args, **kwargs)
GetUseBestVisual(self) -> bool

+Get current UseBestVisual setting.
+ +
GetVendorName(*args, **kwargs)
GetVendorName(self) -> String

+Get the application's vendor name.
+ +
IsActive(*args, **kwargs)
IsActive(self) -> bool

+Return True if our app has focus.
+ +
Pending(*args, **kwargs)
Pending(self) -> bool

+Returns True if there are unprocessed events in the event queue.
+ +
ProcessIdle(*args, **kwargs)
ProcessIdle(self) -> bool

+Called from the MainLoop when the application becomes idle (there are
+no pending events) and sends a `wx.IdleEvent` to all interested
+parties.  Returns True if more idle events are needed, False if not.
+ +
ProcessPendingEvents(*args, **kwargs)
ProcessPendingEvents(self)

+Process all events in the Pending Events list -- it is necessary to
+call this function to process posted events. This normally happens
+during each event loop iteration.
+ +
SendIdleEvents(*args, **kwargs)
SendIdleEvents(self, Window win, IdleEvent event) -> bool

+Send idle event to window and all subwindows.  Returns True if more
+idle time is requested.
+ +
SetAppName(*args, **kwargs)
SetAppName(self, String name)

+Set the application name. This value may be used automatically by
+`wx.Config` and such.
+ +
SetAssertMode(*args, **kwargs)
SetAssertMode(self, int mode)

+Set the OnAssert behaviour for debug and hybrid builds.
+ +
SetClassName(*args, **kwargs)
SetClassName(self, String name)

+Set the application's class name. This value may be used for
+X-resources if applicable for the platform
+ +
SetExitOnFrameDelete(*args, **kwargs)
SetExitOnFrameDelete(self, bool flag)

+Control the exit behaviour: by default, the program will exit the main
+loop (and so, usually, terminate) when the last top-level program
+window is deleted.  Beware that if you disable this behaviour (with
+SetExitOnFrameDelete(False)), you'll have to call ExitMainLoop()
+explicitly from somewhere.
+ +
SetPrintMode(*args, **kwargs)
SetPrintMode(self, int mode)
+ +
SetUseBestVisual(*args, **kwargs)
SetUseBestVisual(self, bool flag, bool forceTrueColour=False)

+Set whether the app should try to use the best available visual on
+systems where more than one is available, (Sun, SGI, XFree86 4, etc.)
+ +
SetVendorName(*args, **kwargs)
SetVendorName(self, String name)

+Set the application's vendor name. This value may be used
+automatically by `wx.Config` and such.
+ +
WakeUpIdle(*args, **kwargs)
WakeUpIdle(self)

+Make sure that idle events are sent again.
+:see: `wx.WakeUpIdle`
+ +
Yield(*args, **kwargs)
Yield(self, bool onlyIfNeeded=False) -> bool

+Process all currently pending events right now, instead of waiting
+until return to the event loop.  It is an error to call ``Yield``
+recursively unless the value of ``onlyIfNeeded`` is True.

+:warning: This function is dangerous as it can lead to unexpected
+      reentrancies (i.e. when called from an event handler it may
+      result in calling the same event handler again), use with
+      extreme care or, better, don't use at all!

+:see: `wx.Yield`, `wx.YieldIfNeeded`, `wx.SafeYield`
+ +
__repr__ = _swig_repr(self)
+ +
+Static methods inherited from wx._core.PyApp:
+
GetComCtl32Version(*args, **kwargs)
GetComCtl32Version() -> int

+Returns 400, 470, 471, etc. for comctl32.dll 4.00, 4.70, 4.71 or 0 if
+it wasn't found at all.  Raises an exception on non-Windows platforms.
+ +
GetMacAboutMenuItemId(*args, **kwargs)
GetMacAboutMenuItemId() -> long
+ +
GetMacExitMenuItemId(*args, **kwargs)
GetMacExitMenuItemId() -> long
+ +
GetMacHelpMenuTitleName(*args, **kwargs)
GetMacHelpMenuTitleName() -> String
+ +
GetMacPreferencesMenuItemId(*args, **kwargs)
GetMacPreferencesMenuItemId() -> long
+ +
GetMacSupportPCMenuShortcuts(*args, **kwargs)
GetMacSupportPCMenuShortcuts() -> bool
+ +
IsDisplayAvailable(*args, **kwargs)
IsDisplayAvailable() -> bool

+Tests if it is possible to create a GUI in the current environment.
+This will mean different things on the different platforms.

+   * On X Windows systems this function will return ``False`` if it is
+     not able to open a connection to the X display, which can happen
+     if $DISPLAY is not set, or is not set correctly.

+   * On Mac OS X a ``False`` return value will mean that wx is not
+     able to access the window manager, which can happen if logged in
+     remotely or if running from the normal version of python instead
+     of the framework version, (i.e., pythonw.)

+   * On MS Windows...
+ +
IsMainLoopRunning(*args, **kwargs)
IsMainLoopRunning() -> bool

+Returns True if we're running the main loop, i.e. if the events can
+currently be dispatched.
+ +
SetMacAboutMenuItemId(*args, **kwargs)
SetMacAboutMenuItemId(long val)
+ +
SetMacExitMenuItemId(*args, **kwargs)
SetMacExitMenuItemId(long val)
+ +
SetMacHelpMenuTitleName(*args, **kwargs)
SetMacHelpMenuTitleName(String val)
+ +
SetMacPreferencesMenuItemId(*args, **kwargs)
SetMacPreferencesMenuItemId(long val)
+ +
SetMacSupportPCMenuShortcuts(*args, **kwargs)
SetMacSupportPCMenuShortcuts(bool val)
+ +
+Data descriptors inherited from wx._core.PyApp:
+
Active
+
IsActive(self) -> bool

+Return True if our app has focus.
+
+
AppName
+
See `GetAppName` and `SetAppName`
+
+
AssertMode
+
See `GetAssertMode` and `SetAssertMode`
+
+
ClassName
+
See `GetClassName` and `SetClassName`
+
+
ExitOnFrameDelete
+
See `GetExitOnFrameDelete` and `SetExitOnFrameDelete`
+
+
LayoutDirection
+
See `GetLayoutDirection`
+
+
PrintMode
+
See `GetPrintMode` and `SetPrintMode`
+
+
TopWindow
+
See `GetTopWindow` and `SetTopWindow`
+
+
Traits
+
See `GetTraits`
+
+
UseBestVisual
+
See `GetUseBestVisual` and `SetUseBestVisual`
+
+
VendorName
+
See `GetVendorName` and `SetVendorName`
+
+
thisown
+
The membership flag
+
+
+Data and other attributes inherited from wx._core.PyApp:
+
__swig_destroy__ = <built-in function delete_PyApp>
+ +
+Methods inherited from wx._core.EvtHandler:
+
AddPendingEvent(*args, **kwargs)
AddPendingEvent(self, Event event)
+ +
Bind(self, event, handler, source=None, id=-1, id2=-1)
Bind an event to an event handler.

+:param event: One of the EVT_* objects that specifies the
+              type of event to bind,

+:param handler: A callable object to be invoked when the
+              event is delivered to self.  Pass None to
+              disconnect an event handler.

+:param source: Sometimes the event originates from a
+              different window than self, but you still
+              want to catch it in self.  (For example, a
+              button event delivered to a frame.)  By
+              passing the source of the event, the event
+              handling system is able to differentiate
+              between the same event type from different
+              controls.

+:param id: Used to spcify the event source by ID instead
+           of instance.

+:param id2: Used when it is desirable to bind a handler
+              to a range of IDs, such as with EVT_MENU_RANGE.
+ +
Connect(*args, **kwargs)
Connect(self, int id, int lastId, int eventType, PyObject func)
+ +
Disconnect(*args, **kwargs)
Disconnect(self, int id, int lastId=-1, EventType eventType=wxEVT_NULL) -> bool
+ +
GetEvtHandlerEnabled(*args, **kwargs)
GetEvtHandlerEnabled(self) -> bool
+ +
GetNextHandler(*args, **kwargs)
GetNextHandler(self) -> EvtHandler
+ +
GetPreviousHandler(*args, **kwargs)
GetPreviousHandler(self) -> EvtHandler
+ +
ProcessEvent(*args, **kwargs)
ProcessEvent(self, Event event) -> bool
+ +
SetEvtHandlerEnabled(*args, **kwargs)
SetEvtHandlerEnabled(self, bool enabled)
+ +
SetNextHandler(*args, **kwargs)
SetNextHandler(self, EvtHandler handler)
+ +
SetPreviousHandler(*args, **kwargs)
SetPreviousHandler(self, EvtHandler handler)
+ +
Unbind(self, event, source=None, id=-1, id2=-1)
Disconencts the event handler binding for event from self.
+Returns True if successful.
+ +
+Data descriptors inherited from wx._core.EvtHandler:
+
EvtHandlerEnabled
+
See `GetEvtHandlerEnabled` and `SetEvtHandlerEnabled`
+
+
NextHandler
+
See `GetNextHandler` and `SetNextHandler`
+
+
PreviousHandler
+
See `GetPreviousHandler` and `SetPreviousHandler`
+
+
+Methods inherited from wx._core.Object:
+
IsSameAs(*args, **kwargs)
IsSameAs(self, Object p) -> bool

+For wx.Objects that use C++ reference counting internally, this method
+can be used to determine if two objects are referencing the same data
+object.
+ +
+Data descriptors inherited from wx._core.Object:
+
__dict__
+
dictionary for instance variables (if defined)
+
+
__weakref__
+
list of weak references to the object (if defined)
+
+

+ + + + + +
 
+Functions
       
main()
operate the tool
+
on_exit(timer, epics_db)
Exit handler to stop the ca.poll()
+@param timer: CaPollWx object
+@param epics_db: Python list of pvConnect.EpicsPv objects to be released
+

+ + + + + +
 
+Data
       modules = {u'wxmtxy_htmlview': [0, 'HtmlView to view HTML-formatted help files', u'wxmtxy_htmlview.py'], u'wxmtxy_pair': [0, 'configuration for X,Y pair of EPICS positioners', u'wxmtxy_pair.py'], u'wxmtxy_pvsetup': [0, 'configure EPICS for X,Y pair', u'wxmtxy_pvsetup.py'], u'wxmtxy_root': [1, 'Main frame of Application', u'wxmtxy_root.py'], u'wxmtxy_row': [0, 'one row of settings', u'wxmtxy_row.py'], u'wxmtxy_tab': [0, 'set of rows with positioner settings', u'wxmtxy_tab.py']}
+ \ No newline at end of file diff --git a/pydoc/wxmtxy_axis.html b/pydoc/wxmtxy_axis.html new file mode 100644 index 0000000..e49cb09 --- /dev/null +++ b/pydoc/wxmtxy_axis.html @@ -0,0 +1,69 @@ + + +Python: module wxmtxy_axis + + + + +
 
+ 
wxmtxy_axis
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy_axis.py
+

+

+ + + + + +
 
+Modules
       
copy
+
pprint
+
pvConnect
+
time
+

+ + + + + +
 
+Classes
       
+
Axis +
+

+ + + + + + + +
 
+class Axis
   EPICS PVs and connections for one axis
 
 Methods defined here:
+
Connect(self)
Try to initiate EPICS connection with named PVs
+@return: [Boolean] if all axes connected
+ +
Disconnect(self)
Terminate EPICS connection with named PVs
+ +
GetConfigure(self)
Get the EPICS PVs for this X,Y pair
+@return: Python dictionary of EPICS PV configuration
+ +
Move(self, position)
Send new position to VAL field of EPICS
+ +
SetConfigure(self, config)
Define the EPICS PVs for this X,Y pair
+@param config: Python dictionary of EPICS PV configuration
+ +
Stop(self)
Send a STOP to EPICS
+ +
__init__(self)
declare initial storage
+ +

+ + + + + +
 
+Data
       field_list = ['VAL', 'RBV', 'EGU', 'DESC', 'DMOV', 'STOP']
+ \ No newline at end of file diff --git a/pydoc/wxmtxy_htmlview.html b/pydoc/wxmtxy_htmlview.html new file mode 100644 index 0000000..72f2f7b --- /dev/null +++ b/pydoc/wxmtxy_htmlview.html @@ -0,0 +1,1900 @@ + + +Python: module wxmtxy_htmlview + + + + +
 
+ 
wxmtxy_htmlview
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy_htmlview.py
+

HtmlView to view HTML-formatted help files

+@version: 
+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_htmlview.py $
+# $Id: wxmtxy_htmlview.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+

+ + + + + +
 
+Modules
       
inspect
+
os
+
wx
+

+ + + + + +
 
+Classes
       
+
wx._windows.Frame(wx._windows.TopLevelWindow) +
+
+
HtmlView +
+
+
+

+ + + + + + + +
 
+class HtmlView(wx._windows.Frame)
   HtmlView to view HTML-formatted help files
 
 
Method resolution order:
+
HtmlView
+
wx._windows.Frame
+
wx._windows.TopLevelWindow
+
wx._core.Window
+
wx._core.EvtHandler
+
wx._core.Object
+
__builtin__.object
+
+
+Methods defined here:
+
OnBackButton(self, event)
user pressed the Back button
+@param event: wxPython event object
+ +
OnForwardButton(self, event)
user pressed the Forward button
+@param event: wxPython event object
+ +
OnHomeButton(self, event)
user pressed the Home button
+@param event: wxPython event object
+ +
OnOpeningURL(self, type, url)
page was opened
+@param type: "WxPython in Action": page 491
+@param url: [str] Uniform Resource Locator

+@note: this code is not called yet
+ +
OnRefreshButton(self, event)
page was opened
+@param type: "WxPython in Action": page 491
+@param url: [str] Uniform Resource Locator

+@note: this code is not implemented yet
+ +
__init__(self, parent=None, homepage='index.html', id=-1, title='')
set up the mini WWW browser to view HTML-formatted help files
+@param parent: widget that owns this window
+@param homepage: local file name of HTML Help (exception if blank)
+@param id: widget identifier
+@param title: text for window bar
+ +
+Methods inherited from wx._windows.Frame:
+
Command = ProcessCommand(*args, **kwargs)
ProcessCommand(self, int winid) -> bool
+ +
Create(*args, **kwargs)
Create(self, Window parent, int id=-1, String title=EmptyString, 
+    Point pos=DefaultPosition, Size size=DefaultSize, 
+    long style=DEFAULT_FRAME_STYLE, String name=FrameNameStr) -> bool
+ +
CreateStatusBar(*args, **kwargs)
CreateStatusBar(self, int number=1, long style=DEFAULT_STATUSBAR_STYLE, int winid=0, 
+    String name=StatusLineNameStr) -> StatusBar
+ +
CreateToolBar(*args, **kwargs)
CreateToolBar(self, long style=-1, int winid=-1, String name=ToolBarNameStr) -> wxToolBar
+ +
DoGiveHelp(*args, **kwargs)
DoGiveHelp(self, String text, bool show)
+ +
DoMenuUpdates(*args, **kwargs)
DoMenuUpdates(self, Menu menu=None)
+ +
GetMenuBar(*args, **kwargs)
GetMenuBar(self) -> MenuBar
+ +
GetStatusBar(*args, **kwargs)
GetStatusBar(self) -> StatusBar
+ +
GetStatusBarPane(*args, **kwargs)
GetStatusBarPane(self) -> int
+ +
GetToolBar(*args, **kwargs)
GetToolBar(self) -> wxToolBar
+ +
PopStatusText(*args, **kwargs)
PopStatusText(self, int number=0)
+ +
ProcessCommand(*args, **kwargs)
ProcessCommand(self, int winid) -> bool
+ +
PushStatusText(*args, **kwargs)
PushStatusText(self, String text, int number=0)
+ +
SendSizeEvent(*args, **kwargs)
SendSizeEvent(self)
+ +
SetMenuBar(*args, **kwargs)
SetMenuBar(self, MenuBar menubar)
+ +
SetStatusBar(*args, **kwargs)
SetStatusBar(self, StatusBar statBar)
+ +
SetStatusBarPane(*args, **kwargs)
SetStatusBarPane(self, int n)
+ +
SetStatusText(*args, **kwargs)
SetStatusText(self, String text, int number=0)
+ +
SetStatusWidths(*args, **kwargs)
SetStatusWidths(self, int widths)
+ +
SetToolBar(*args, **kwargs)
SetToolBar(self, wxToolBar toolbar)
+ +
__repr__ = _swig_repr(self)
+ +
+Static methods inherited from wx._windows.Frame:
+
GetClassDefaultAttributes(*args, **kwargs)
GetClassDefaultAttributes(int variant=WINDOW_VARIANT_NORMAL) -> VisualAttributes

+Get the default attributes for this class.  This is useful if you want
+to use the same font or colour in your own control as in a standard
+control -- which is a much better idea than hard coding specific
+colours or fonts which might look completely out of place on the
+user's system, especially if it uses themes.

+The variant parameter is only relevant under Mac currently and is
+ignore under other platforms. Under Mac, it will change the size of
+the returned font. See `wx.Window.SetWindowVariant` for more about
+this.
+ +
+Data descriptors inherited from wx._windows.Frame:
+
MenuBar
+
See `GetMenuBar` and `SetMenuBar`
+
+
StatusBar
+
See `GetStatusBar` and `SetStatusBar`
+
+
StatusBarPane
+
See `GetStatusBarPane` and `SetStatusBarPane`
+
+
ToolBar
+
See `GetToolBar` and `SetToolBar`
+
+
thisown
+
The membership flag
+
+
+Methods inherited from wx._windows.TopLevelWindow:
+
CenterOnScreen(*args, **kwargs)
CenterOnScreen(self, int dir=BOTH)

+Center the window on screen
+ +
CentreOnScreen = CenterOnScreen(*args, **kwargs)
CenterOnScreen(self, int dir=BOTH)

+Center the window on screen
+ +
EnableCloseButton(*args, **kwargs)
EnableCloseButton(self, bool enable) -> bool
+ +
GetDefaultItem(*args, **kwargs)
GetDefaultItem(self) -> Window

+Get the default child of this parent, i.e. the one which is activated
+by pressing <Enter> such as the OK button on a wx.Dialog.
+ +
GetIcon(*args, **kwargs)
GetIcon(self) -> Icon
+ +
GetTitle(*args, **kwargs)
GetTitle(self) -> String
+ +
GetTmpDefaultItem(*args, **kwargs)
GetTmpDefaultItem(self) -> Window

+Return the temporary default item, which can be None.
+ +
Iconize(*args, **kwargs)
Iconize(self, bool iconize=True)
+ +
IsActive(*args, **kwargs)
IsActive(self) -> bool
+ +
IsAlwaysMaximized(*args, **kwargs)
IsAlwaysMaximized(self) -> bool
+ +
IsFullScreen(*args, **kwargs)
IsFullScreen(self) -> bool
+ +
IsIconized(*args, **kwargs)
IsIconized(self) -> bool
+ +
IsMaximized(*args, **kwargs)
IsMaximized(self) -> bool
+ +
MacGetMetalAppearance(*args, **kwargs)
MacGetMetalAppearance(self) -> bool
+ +
MacGetUnifiedAppearance(*args, **kwargs)
MacGetUnifiedAppearance(self) -> bool
+ +
MacSetMetalAppearance(*args, **kwargs)
MacSetMetalAppearance(self, bool on)
+ +
Maximize(*args, **kwargs)
Maximize(self, bool maximize=True)
+ +
RequestUserAttention(*args, **kwargs)
RequestUserAttention(self, int flags=USER_ATTENTION_INFO)
+ +
Restore(*args, **kwargs)
Restore(self)
+ +
SetDefaultItem(*args, **kwargs)
SetDefaultItem(self, Window child) -> Window

+Set this child as default, return the old default.
+ +
SetIcon(*args, **kwargs)
SetIcon(self, Icon icon)
+ +
SetIcons(*args, **kwargs)
SetIcons(self, wxIconBundle icons)
+ +
SetShape(*args, **kwargs)
SetShape(self, Region region) -> bool
+ +
SetTitle(*args, **kwargs)
SetTitle(self, String title)
+ +
SetTmpDefaultItem(*args, **kwargs)
SetTmpDefaultItem(self, Window win)

+Set this child as temporary default
+ +
ShowFullScreen(*args, **kwargs)
ShowFullScreen(self, bool show, long style=FULLSCREEN_ALL) -> bool
+ +
+Data descriptors inherited from wx._windows.TopLevelWindow:
+
DefaultItem
+
See `GetDefaultItem` and `SetDefaultItem`
+
+
Icon
+
See `GetIcon` and `SetIcon`
+
+
Title
+
See `GetTitle` and `SetTitle`
+
+
TmpDefaultItem
+
See `GetTmpDefaultItem` and `SetTmpDefaultItem`
+
+
+Methods inherited from wx._core.Window:
+
AcceptsFocus(*args, **kwargs)
AcceptsFocus(self) -> bool

+Can this window have focus?
+ +
AcceptsFocusFromKeyboard(*args, **kwargs)
AcceptsFocusFromKeyboard(self) -> bool

+Can this window be given focus by keyboard navigation? if not, the
+only way to give it focus (provided it accepts it at all) is to click
+it.
+ +
AddChild(*args, **kwargs)
AddChild(self, Window child)

+Adds a child window. This is called automatically by window creation
+functions so should not be required by the application programmer.
+ +
AdjustForLayoutDirection(*args, **kwargs)
AdjustForLayoutDirection(self, int x, int width, int widthTotal) -> int

+Mirror coordinates for RTL layout if this window uses it and if the
+mirroring is not done automatically like Win32.
+ +
AssociateHandle(*args, **kwargs)
AssociateHandle(self, long handle)

+Associate the window with a new native handle
+ +
CacheBestSize(*args, **kwargs)
CacheBestSize(self, Size size)

+Cache the best size so it doesn't need to be calculated again, (at least until
+some properties of the window change.)
+ +
CanSetTransparent(*args, **kwargs)
CanSetTransparent(self) -> bool

+Returns ``True`` if the platform supports setting the transparency for
+this window.  Note that this method will err on the side of caution,
+so it is possible that this will return ``False`` when it is in fact
+possible to set the transparency.

+NOTE: On X-windows systems the X server must have the composite
+extension loaded, and there must be a composite manager program (such
+as xcompmgr) running.
+ +
CaptureMouse(*args, **kwargs)
CaptureMouse(self)

+Directs all mouse input to this window. Call wx.Window.ReleaseMouse to
+release the capture.

+Note that wxWindows maintains the stack of windows having captured the
+mouse and when the mouse is released the capture returns to the window
+which had had captured it previously and it is only really released if
+there were no previous window. In particular, this means that you must
+release the mouse as many times as you capture it, unless the window
+receives the `wx.MouseCaptureLostEvent` event.

+Any application which captures the mouse in the beginning of some
+operation *must* handle `wx.MouseCaptureLostEvent` and cancel this
+operation when it receives the event. The event handler must not
+recapture mouse.
+ +
Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
Centre = Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CentreOnParent = CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
ClearBackground(*args, **kwargs)
ClearBackground(self)

+Clears the window by filling it with the current background
+colour. Does not cause an erase background event to be generated.
+ +
ClientToScreen(*args, **kwargs)
ClientToScreen(self, Point pt) -> Point

+Converts to screen coordinates from coordinates relative to this window.
+ +
ClientToScreenXY(*args, **kwargs)
ClientToScreenXY(int x, int y) -> (x,y)

+Converts to screen coordinates from coordinates relative to this window.
+ +
Close(*args, **kwargs)
Close(self, bool force=False) -> bool

+This function simply generates a EVT_CLOSE event whose handler usually
+tries to close the window. It doesn't close the window itself,
+however.  If force is False (the default) then the window's close
+handler will be allowed to veto the destruction of the window.
+ +
ConvertDialogPointToPixels(*args, **kwargs)
ConvertDialogPointToPixels(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertDialogSizeToPixels(*args, **kwargs)
ConvertDialogSizeToPixels(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertPixelPointToDialog(*args, **kwargs)
ConvertPixelPointToDialog(self, Point pt) -> Point
+ +
ConvertPixelSizeToDialog(*args, **kwargs)
ConvertPixelSizeToDialog(self, Size sz) -> Size
+ +
DLG_PNT(*args, **kwargs)
DLG_PNT(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
DLG_SZE(*args, **kwargs)
DLG_SZE(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
Destroy(*args, **kwargs)
Destroy(self) -> bool

+Destroys the window safely.  Frames and dialogs are not destroyed
+immediately when this function is called -- they are added to a list
+of windows to be deleted on idle time, when all the window's events
+have been processed. This prevents problems with events being sent to
+non-existent windows.

+Returns True if the window has either been successfully deleted, or it
+has been added to the list of windows pending real deletion.
+ +
DestroyChildren(*args, **kwargs)
DestroyChildren(self) -> bool

+Destroys all children of a window. Called automatically by the
+destructor.
+ +
Disable(*args, **kwargs)
Disable(self) -> bool

+Disables the window, same as Enable(false).
+ +
DissociateHandle(*args, **kwargs)
DissociateHandle(self)

+Dissociate the current native handle from the window
+ +
DragAcceptFiles(*args, **kwargs)
DragAcceptFiles(self, bool accept)

+Enables or disables eligibility for drop file events, EVT_DROP_FILES.
+Only functional on Windows.
+ +
Enable(*args, **kwargs)
Enable(self, bool enable=True) -> bool

+Enable or disable the window for user input. Note that when a parent
+window is disabled, all of its children are disabled as well and they
+are reenabled again when the parent is.  Returns true if the window
+has been enabled or disabled, false if nothing was done, i.e. if the
+window had already been in the specified state.
+ +
FindWindowById(*args, **kwargs)
FindWindowById(self, long winid) -> Window

+Find a child of this window by window ID
+ +
FindWindowByName(*args, **kwargs)
FindWindowByName(self, String name) -> Window

+Find a child of this window by name
+ +
Fit(*args, **kwargs)
Fit(self)

+Sizes the window so that it fits around its subwindows. This function
+won't do anything if there are no subwindows and will only really work
+correctly if sizers are used for the subwindows layout. Also, if the
+window has exactly one subwindow it is better (faster and the result
+is more precise as Fit adds some margin to account for fuzziness of
+its calculations) to call window.SetClientSize(child.GetSize())
+instead of calling Fit.
+ +
FitInside(*args, **kwargs)
FitInside(self)

+Similar to Fit, but sizes the interior (virtual) size of a
+window. Mainly useful with scrolled windows to reset scrollbars after
+sizing changes that do not trigger a size event, and/or scrolled
+windows without an interior sizer. This function similarly won't do
+anything if there are no subwindows.
+ +
Freeze(*args, **kwargs)
Freeze(self)

+Freezes the window or, in other words, prevents any updates from
+taking place on screen, the window is not redrawn at all. Thaw must be
+called to reenable window redrawing.  Calls to Freeze/Thaw may be
+nested, with the actual Thaw being delayed until all the nesting has
+been undone.

+This method is useful for visual appearance optimization (for example,
+it is a good idea to use it before inserting large amount of text into
+a wxTextCtrl under wxGTK) but is not implemented on all platforms nor
+for all controls so it is mostly just a hint to wxWindows and not a
+mandatory directive.
+ +
GetAcceleratorTable(*args, **kwargs)
GetAcceleratorTable(self) -> AcceleratorTable

+Gets the accelerator table for this window.
+ +
GetAdjustedBestSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetAutoLayout(*args, **kwargs)
GetAutoLayout(self) -> bool

+Returns the current autoLayout setting
+ +
GetBackgroundColour(*args, **kwargs)
GetBackgroundColour(self) -> Colour

+Returns the background colour of the window.
+ +
GetBackgroundStyle(*args, **kwargs)
GetBackgroundStyle(self) -> int

+Returns the background style of the window.

+:see: `SetBackgroundStyle`
+ +
GetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetBestSize(*args, **kwargs)
GetBestSize(self) -> Size

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestSizeTuple(*args, **kwargs)
GetBestSizeTuple() -> (width, height)

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestVirtualSize(*args, **kwargs)
GetBestVirtualSize(self) -> Size

+Return the largest of ClientSize and BestSize (as determined by a
+sizer, interior children, or other means)
+ +
GetBorder(*args)
GetBorder(self, long flags) -> int
+GetBorder(self) -> int

+Get border for the flags of this window
+ +
GetCaret(*args, **kwargs)
GetCaret(self) -> Caret

+Returns the caret associated with the window.
+ +
GetCharHeight(*args, **kwargs)
GetCharHeight(self) -> int

+Get the (average) character size for the current font.
+ +
GetCharWidth(*args, **kwargs)
GetCharWidth(self) -> int

+Get the (average) character size for the current font.
+ +
GetChildren(*args, **kwargs)
GetChildren(self) -> WindowList

+Returns an object containing a list of the window's children.  The
+object provides a Python sequence-like interface over the internal
+list maintained by the window..
+ +
GetClientAreaOrigin(*args, **kwargs)
GetClientAreaOrigin(self) -> Point

+Get the origin of the client area of the window relative to the
+window's top left corner (the client area may be shifted because of
+the borders, scrollbars, other decorations...)
+ +
GetClientRect(*args, **kwargs)
GetClientRect(self) -> Rect

+Get the client area position and size as a `wx.Rect` object.
+ +
GetClientSize(*args, **kwargs)
GetClientSize(self) -> Size

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetClientSizeTuple(*args, **kwargs)
GetClientSizeTuple() -> (width, height)

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetConstraints(*args, **kwargs)
GetConstraints(self) -> LayoutConstraints

+Returns a pointer to the window's layout constraints, or None if there
+are none.
+ +
GetContainingSizer(*args, **kwargs)
GetContainingSizer(self) -> Sizer

+Return the sizer that this window is a member of, if any, otherwise None.
+ +
GetCursor(*args, **kwargs)
GetCursor(self) -> Cursor

+Return the cursor associated with this window.
+ +
GetDefaultAttributes(*args, **kwargs)
GetDefaultAttributes(self) -> VisualAttributes

+Get the default attributes for an instance of this class.  This is
+useful if you want to use the same font or colour in your own control
+as in a standard control -- which is a much better idea than hard
+coding specific colours or fonts which might look completely out of
+place on the user's system, especially if it uses themes.
+ +
GetDropTarget(*args, **kwargs)
GetDropTarget(self) -> DropTarget

+Returns the associated drop target, which may be None.
+ +
GetEffectiveMinSize(*args, **kwargs)
GetEffectiveMinSize(self) -> Size

+This function will merge the window's best size into the window's
+minimum size, giving priority to the min size components, and returns
+the results.
+ +
GetEventHandler(*args, **kwargs)
GetEventHandler(self) -> EvtHandler

+Returns the event handler for this window. By default, the window is
+its own event handler.
+ +
GetExtraStyle(*args, **kwargs)
GetExtraStyle(self) -> long

+Returns the extra style bits for the window.
+ +
GetFont(*args, **kwargs)
GetFont(self) -> Font

+Returns the default font used for this window.
+ +
GetForegroundColour(*args, **kwargs)
GetForegroundColour(self) -> Colour

+Returns the foreground colour of the window.  The interpretation of
+foreground colour is dependent on the window class; it may be the text
+colour or other colour, or it may not be used at all.
+ +
GetFullTextExtent(*args, **kwargs)
GetFullTextExtent(String string, Font font=None) ->
+   (width, height, descent, externalLeading)

+Get the width, height, decent and leading of the text using the
+current or specified font.
+ +
GetGrandParent(*args, **kwargs)
GetGrandParent(self) -> Window

+Returns the parent of the parent of this window, or None if there
+isn't one.
+ +
GetGtkWidget(*args, **kwargs)
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+ +
GetHandle(*args, **kwargs)
GetHandle(self) -> long

+Returns the platform-specific handle (as a long integer) of the
+physical window.  On wxMSW this is the win32 window handle, on wxGTK
+it is the XWindow ID, and on wxMac it is the ControlRef.
+ +
GetHelpText(*args, **kwargs)
GetHelpText(self) -> String

+Gets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
GetHelpTextAtPoint(*args, **kwargs)
GetHelpTextAtPoint(self, Point pt, wxHelpEvent::Origin origin) -> String

+Get the help string associated with the given position in this window.

+Notice that pt may be invalid if event origin is keyboard or unknown
+and this method should return the global window help text then
+ +
GetId(*args, **kwargs)
GetId(self) -> int

+Returns the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one (or the default Id
+-1 is used) then an unique identifier with a negative value will be
+generated.
+ +
GetLabel(*args, **kwargs)
GetLabel(self) -> String

+Generic way of getting a label from any window, for identification
+purposes.  The interpretation of this function differs from class to
+class. For frames and dialogs, the value returned is the title. For
+buttons or static text controls, it is the button text. This function
+can be useful for meta-programs such as testing tools or special-needs
+access programs)which need to identify windows by name.
+ +
GetLayoutDirection(*args, **kwargs)
GetLayoutDirection(self) -> int

+Get the layout direction (LTR or RTL) for this window.  Returns
+``wx.Layout_Default`` if layout direction is not supported.
+ +
GetMaxHeight(*args, **kwargs)
GetMaxHeight(self) -> int
+ +
GetMaxSize(*args, **kwargs)
GetMaxSize(self) -> Size
+ +
GetMaxWidth(*args, **kwargs)
GetMaxWidth(self) -> int
+ +
GetMinHeight(*args, **kwargs)
GetMinHeight(self) -> int
+ +
GetMinSize(*args, **kwargs)
GetMinSize(self) -> Size
+ +
GetMinWidth(*args, **kwargs)
GetMinWidth(self) -> int
+ +
GetName(*args, **kwargs)
GetName(self) -> String

+Returns the windows name.  This name is not guaranteed to be unique;
+it is up to the programmer to supply an appropriate name in the window
+constructor or via wx.Window.SetName.
+ +
GetParent(*args, **kwargs)
GetParent(self) -> Window

+Returns the parent window of this window, or None if there isn't one.
+ +
GetPosition(*args, **kwargs)
GetPosition(self) -> Point

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetPositionTuple(*args, **kwargs)
GetPositionTuple() -> (x,y)

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetRect(*args, **kwargs)
GetRect(self) -> Rect

+Returns the size and position of the window as a `wx.Rect` object.
+ +
GetScreenPosition(*args, **kwargs)
GetScreenPosition(self) -> Point

+Get the position of the window in screen coordinantes.
+ +
GetScreenPositionTuple(*args, **kwargs)
GetScreenPositionTuple() -> (x,y)

+Get the position of the window in screen coordinantes.
+ +
GetScreenRect(*args, **kwargs)
GetScreenRect(self) -> Rect

+Returns the size and position of the window in screen coordinantes as
+a `wx.Rect` object.
+ +
GetScrollPos(*args, **kwargs)
GetScrollPos(self, int orientation) -> int

+Returns the built-in scrollbar position.
+ +
GetScrollRange(*args, **kwargs)
GetScrollRange(self, int orientation) -> int

+Returns the built-in scrollbar range.
+ +
GetScrollThumb(*args, **kwargs)
GetScrollThumb(self, int orientation) -> int

+Returns the built-in scrollbar thumb size.
+ +
GetSize(*args, **kwargs)
GetSize(self) -> Size

+Get the window size.
+ +
GetSizeTuple(*args, **kwargs)
GetSizeTuple() -> (width, height)

+Get the window size.
+ +
GetSizer(*args, **kwargs)
GetSizer(self) -> Sizer

+Return the sizer associated with the window by a previous call to
+SetSizer or None if there isn't one.
+ +
GetTextExtent(*args, **kwargs)
GetTextExtent(String string) -> (width, height)

+Get the width and height of the text using the current font.
+ +
GetThemeEnabled(*args, **kwargs)
GetThemeEnabled(self) -> bool

+Return the themeEnabled flag.
+ +
GetToolTip(*args, **kwargs)
GetToolTip(self) -> ToolTip

+get the associated tooltip or None if none
+ +
GetTopLevelParent(*args, **kwargs)
GetTopLevelParent(self) -> Window

+Returns the first frame or dialog in this window's parental hierarchy.
+ +
GetUpdateClientRect(*args, **kwargs)
GetUpdateClientRect(self) -> Rect

+Get the update rectangle region bounding box in client coords.
+ +
GetUpdateRegion(*args, **kwargs)
GetUpdateRegion(self) -> Region

+Returns the region specifying which parts of the window have been
+damaged. Should only be called within an EVT_PAINT handler.
+ +
GetValidator(*args, **kwargs)
GetValidator(self) -> Validator

+Returns a pointer to the current validator for the window, or None if
+there is none.
+ +
GetVirtualSize(*args, **kwargs)
GetVirtualSize(self) -> Size

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetVirtualSizeTuple(*args, **kwargs)
GetVirtualSizeTuple() -> (width, height)

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetWindowBorderSize(*args, **kwargs)
GetWindowBorderSize(self) -> Size

+Return the size of the left/right and top/bottom borders.
+ +
GetWindowStyle = GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowVariant(*args, **kwargs)
GetWindowVariant(self) -> int
+ +
HasCapture(*args, **kwargs)
HasCapture(self) -> bool

+Returns true if this window has the current mouse capture.
+ +
HasFlag(*args, **kwargs)
HasFlag(self, int flag) -> bool

+Test if the given style is set for this window.
+ +
HasMultiplePages(*args, **kwargs)
HasMultiplePages(self) -> bool
+ +
HasScrollbar(*args, **kwargs)
HasScrollbar(self, int orient) -> bool

+Does the window have the scrollbar for this orientation?
+ +
HasTransparentBackground(*args, **kwargs)
HasTransparentBackground(self) -> bool

+Returns True if this window's background is transparent (as, for
+example, for `wx.StaticText`) and should show the parent window's
+background.

+This method is mostly used internally by the library itself and you
+normally shouldn't have to call it. You may, however, have to override
+it in your custom control classes to ensure that background is painted
+correctly.
+ +
Hide(*args, **kwargs)
Hide(self) -> bool

+Equivalent to calling Show(False).
+ +
HitTest(*args, **kwargs)
HitTest(self, Point pt) -> int

+Test where the given (in client coords) point lies
+ +
HitTestXY(*args, **kwargs)
HitTestXY(self, int x, int y) -> int

+Test where the given (in client coords) point lies
+ +
InheritAttributes(*args, **kwargs)
InheritAttributes(self)

+This function is (or should be, in case of custom controls) called
+during window creation to intelligently set up the window visual
+attributes, that is the font and the foreground and background
+colours.

+By 'intelligently' the following is meant: by default, all windows use
+their own default attributes. However if some of the parent's
+attributes are explicitly changed (that is, using SetFont and not
+SetOwnFont) and if the corresponding attribute hadn't been
+explicitly set for this window itself, then this window takes the same
+value as used by the parent. In addition, if the window overrides
+ShouldInheritColours to return false, the colours will not be changed
+no matter what and only the font might.

+This rather complicated logic is necessary in order to accommodate the
+different usage scenarios. The most common one is when all default
+attributes are used and in this case, nothing should be inherited as
+in modern GUIs different controls use different fonts (and colours)
+than their siblings so they can't inherit the same value from the
+parent. However it was also deemed desirable to allow to simply change
+the attributes of all children at once by just changing the font or
+colour of their common parent, hence in this case we do inherit the
+parents attributes.
+ +
InheritsBackgroundColour(*args, **kwargs)
InheritsBackgroundColour(self) -> bool
+ +
InitDialog(*args, **kwargs)
InitDialog(self)

+Sends an EVT_INIT_DIALOG event, whose handler usually transfers data
+to the dialog via validators.
+ +
InvalidateBestSize(*args, **kwargs)
InvalidateBestSize(self)

+Reset the cached best size value so it will be recalculated the next
+time it is needed.
+ +
IsBeingDeleted(*args, **kwargs)
IsBeingDeleted(self) -> bool

+Is the window in the process of being deleted?
+ +
IsDoubleBuffered(*args, **kwargs)
IsDoubleBuffered(self) -> bool

+Returns ``True`` if the window contents is double-buffered by the
+system, i.e. if any drawing done on the window is really done on a
+temporary backing surface and transferred to the screen all at once
+later.
+ +
IsEnabled(*args, **kwargs)
IsEnabled(self) -> bool

+Returns true if the window is enabled for input, false otherwise.
+ +
IsExposed(*args, **kwargs)
IsExposed(self, int x, int y, int w=1, int h=1) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedPoint(*args, **kwargs)
IsExposedPoint(self, Point pt) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedRect(*args, **kwargs)
IsExposedRect(self, Rect rect) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsFrozen(*args, **kwargs)
IsFrozen(self) -> bool

+Returns ``True`` if the window has been frozen and not thawed yet.

+:see: `Freeze` and `Thaw`
+ +
IsRetained(*args, **kwargs)
IsRetained(self) -> bool

+Returns true if the window is retained, false otherwise.  Retained
+windows are only available on X platforms.
+ +
IsShown(*args, **kwargs)
IsShown(self) -> bool

+Returns true if the window is shown, false if it has been hidden.
+ +
IsShownOnScreen(*args, **kwargs)
IsShownOnScreen(self) -> bool

+Returns ``True`` if the window is physically visible on the screen,
+i.e. it is shown and all its parents up to the toplevel window are
+shown as well.
+ +
IsTopLevel(*args, **kwargs)
IsTopLevel(self) -> bool

+Returns true if the given window is a top-level one. Currently all
+frames and dialogs are always considered to be top-level windows (even
+if they have a parent window).
+ +
Layout(*args, **kwargs)
Layout(self) -> bool

+Invokes the constraint-based layout algorithm or the sizer-based
+algorithm for this window.  See SetAutoLayout: when auto layout is on,
+this function gets called automatically by the default EVT_SIZE
+handler when the window is resized.
+ +
LineDown(*args, **kwargs)
LineDown(self) -> bool

+This is just a wrapper for ScrollLines(1).
+ +
LineUp(*args, **kwargs)
LineUp(self) -> bool

+This is just a wrapper for ScrollLines(-1).
+ +
Lower(*args, **kwargs)
Lower(self)

+Lowers the window to the bottom of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
MakeModal(*args, **kwargs)
MakeModal(self, bool modal=True)

+Disables all other windows in the application so that the user can
+only interact with this window.  Passing False will reverse this
+effect.
+ +
Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
MoveAfterInTabOrder(*args, **kwargs)
MoveAfterInTabOrder(self, Window win)

+Moves this window in the tab navigation order after the specified
+sibling window.  This means that when the user presses the TAB key on
+that other window, the focus switches to this window.

+The default tab order is the same as creation order.  This function
+and `MoveBeforeInTabOrder` allow to change it after creating all the
+windows.
+ +
MoveBeforeInTabOrder(*args, **kwargs)
MoveBeforeInTabOrder(self, Window win)

+Same as `MoveAfterInTabOrder` except that it inserts this window just
+before win instead of putting it right after it.
+ +
MoveXY(*args, **kwargs)
MoveXY(self, int x, int y, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
Navigate(*args, **kwargs)
Navigate(self, int flags=NavigationKeyEvent.IsForward) -> bool

+Does keyboard navigation from this window to another, by sending a
+`wx.NavigationKeyEvent`.
+ +
PageDown(*args, **kwargs)
PageDown(self) -> bool

+This is just a wrapper for ScrollPages(1).
+ +
PageUp(*args, **kwargs)
PageUp(self) -> bool

+This is just a wrapper for ScrollPages(-1).
+ +
PopEventHandler(*args, **kwargs)
PopEventHandler(self, bool deleteHandler=False) -> EvtHandler

+Removes and returns the top-most event handler on the event handler
+stack.  If deleteHandler is True then the wx.EvtHandler object will be
+destroyed after it is popped, and ``None`` will be returned instead.
+ +
PopupMenu(*args, **kwargs)
PopupMenu(self, Menu menu, Point pos=DefaultPosition) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PopupMenuXY(*args, **kwargs)
PopupMenuXY(self, Menu menu, int x=-1, int y=-1) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PostCreate(self, pre)
Phase 3 of the 2-phase create <wink!>
+Call this method after precreating the window with the 2-phase create method.
+ +
PrepareDC(*args, **kwargs)
PrepareDC(self, DC dc)

+Call this function to prepare the device context for drawing a
+scrolled image. It sets the device origin according to the current
+scroll position.
+ +
PushEventHandler(*args, **kwargs)
PushEventHandler(self, EvtHandler handler)

+Pushes this event handler onto the event handler stack for the window.
+An event handler is an object that is capable of processing the events
+sent to a window.  (In other words, is able to dispatch the events to a
+handler function.)  By default, the window is its own event handler,
+but an application may wish to substitute another, for example to
+allow central implementation of event-handling for a variety of
+different window classes.

+wx.Window.PushEventHandler allows an application to set up a chain of
+event handlers, where an event not handled by one event handler is
+handed to the next one in the chain.  Use `wx.Window.PopEventHandler`
+to remove the event handler.  Ownership of the handler is *not* given
+to the window, so you should be sure to pop the handler before the
+window is destroyed and either let PopEventHandler destroy it, or call
+its Destroy method yourself.
+ +
Raise(*args, **kwargs)
Raise(self)

+Raises the window to the top of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
Refresh(*args, **kwargs)
Refresh(self, bool eraseBackground=True, Rect rect=None)

+Mark the specified rectangle (or the whole window) as "dirty" so it
+will be repainted.  Causes an EVT_PAINT event to be generated and sent
+to the window.
+ +
RefreshRect(*args, **kwargs)
RefreshRect(self, Rect rect, bool eraseBackground=True)

+Redraws the contents of the given rectangle: the area inside it will
+be repainted.  This is the same as Refresh but has a nicer syntax.
+ +
RegisterHotKey(*args, **kwargs)
RegisterHotKey(self, int hotkeyId, int modifiers, int keycode) -> bool

+Registers a system wide hotkey. Every time the user presses the hotkey
+registered here, this window will receive a hotkey event. It will
+receive the event even if the application is in the background and
+does not have the input focus because the user is working with some
+other application.  To bind an event handler function to this hotkey
+use EVT_HOTKEY with an id equal to hotkeyId.  Returns True if the
+hotkey was registered successfully.
+ +
ReleaseMouse(*args, **kwargs)
ReleaseMouse(self)

+Releases mouse input captured with wx.Window.CaptureMouse.
+ +
RemoveChild(*args, **kwargs)
RemoveChild(self, Window child)

+Removes a child window. This is called automatically by window
+deletion functions so should not be required by the application
+programmer.
+ +
RemoveEventHandler(*args, **kwargs)
RemoveEventHandler(self, EvtHandler handler) -> bool

+Find the given handler in the event handler chain and remove (but not
+delete) it from the event handler chain, returns True if it was found
+and False otherwise (this also results in an assert failure so this
+function should only be called when the handler is supposed to be
+there.)
+ +
Reparent(*args, **kwargs)
Reparent(self, Window newParent) -> bool

+Reparents the window, i.e the window will be removed from its current
+parent window (e.g. a non-standard toolbar in a wxFrame) and then
+re-inserted into another. Available on Windows and GTK.  Returns True
+if the parent was changed, False otherwise (error or newParent ==
+oldParent)
+ +
ScreenToClient(*args, **kwargs)
ScreenToClient(self, Point pt) -> Point

+Converts from screen to client window coordinates.
+ +
ScreenToClientXY(*args, **kwargs)
ScreenToClientXY(int x, int y) -> (x,y)

+Converts from screen to client window coordinates.
+ +
ScrollLines(*args, **kwargs)
ScrollLines(self, int lines) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of lines down, if lines is positive, or up if lines
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollPages(*args, **kwargs)
ScrollPages(self, int pages) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of pages down, if pages is positive, or up if pages
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollWindow(*args, **kwargs)
ScrollWindow(self, int dx, int dy, Rect rect=None)

+Physically scrolls the pixels in the window and move child windows
+accordingly.  Use this function to optimise your scrolling
+implementations, to minimise the area that must be redrawn. Note that
+it is rarely required to call this function from a user program.
+ +
SetAcceleratorTable(*args, **kwargs)
SetAcceleratorTable(self, AcceleratorTable accel)

+Sets the accelerator table for this window.
+ +
SetAutoLayout(*args, **kwargs)
SetAutoLayout(self, bool autoLayout)

+Determines whether the Layout function will be called automatically
+when the window is resized.  lease note that this only happens for the
+windows usually used to contain children, namely `wx.Panel` and
+`wx.TopLevelWindow` (and the classes deriving from them).

+This method is called implicitly by `SetSizer` but if you use
+`SetConstraints` you should call it manually or otherwise the window
+layout won't be correctly updated when its size changes.
+ +
SetBackgroundColour(*args, **kwargs)
SetBackgroundColour(self, Colour colour) -> bool

+Sets the background colour of the window.  Returns True if the colour
+was changed.  The background colour is usually painted by the default
+EVT_ERASE_BACKGROUND event handler function under Windows and
+automatically under GTK.  Using `wx.NullColour` will reset the window
+to the default background colour.

+Note that setting the background colour may not cause an immediate
+refresh, so you may wish to call `ClearBackground` or `Refresh` after
+calling this function.

+Using this function will disable attempts to use themes for this
+window, if the system supports them.  Use with care since usually the
+themes represent the appearance chosen by the user to be used for all
+applications on the system.
+ +
SetBackgroundStyle(*args, **kwargs)
SetBackgroundStyle(self, int style) -> bool

+Returns the background style of the window. The background style
+indicates how the background of the window is drawn.

+    ======================  ========================================
+    wx.BG_STYLE_SYSTEM      The background colour or pattern should
+                            be determined by the system
+    wx.BG_STYLE_COLOUR      The background should be a solid colour
+    wx.BG_STYLE_CUSTOM      The background will be implemented by the
+                            application.
+    ======================  ========================================

+On GTK+, use of wx.BG_STYLE_CUSTOM allows the flicker-free drawing of
+a custom background, such as a tiled bitmap. Currently the style has
+no effect on other platforms.

+:see: `GetBackgroundStyle`, `SetBackgroundColour`
+ +
SetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `SetInitialSize`
+ +
SetCaret(*args, **kwargs)
SetCaret(self, Caret caret)

+Sets the caret associated with the window.
+ +
SetClientRect(*args, **kwargs)
SetClientRect(self, Rect rect)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSize(*args, **kwargs)
SetClientSize(self, Size size)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSizeWH(*args, **kwargs)
SetClientSizeWH(self, int width, int height)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetConstraints(*args, **kwargs)
SetConstraints(self, LayoutConstraints constraints)

+Sets the window to have the given layout constraints. If an existing
+layout constraints object is already owned by the window, it will be
+deleted.  Pass None to disassociate and delete the window's current
+constraints.

+You must call SetAutoLayout to tell a window to use the constraints
+automatically in its default EVT_SIZE handler; otherwise, you must
+handle EVT_SIZE yourself and call Layout() explicitly. When setting
+both a wx.LayoutConstraints and a wx.Sizer, only the sizer will have
+effect.
+ +
SetContainingSizer(*args, **kwargs)
SetContainingSizer(self, Sizer sizer)

+This normally does not need to be called by application code. It is
+called internally when a window is added to a sizer, and is used so
+the window can remove itself from the sizer when it is destroyed.
+ +
SetCursor(*args, **kwargs)
SetCursor(self, Cursor cursor) -> bool

+Sets the window's cursor. Notice that the window cursor also sets it
+for the children of the window implicitly.

+The cursor may be wx.NullCursor in which case the window cursor will
+be reset back to default.
+ +
SetDimensions(*args, **kwargs)
SetDimensions(self, int x, int y, int width, int height, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels.  The sizeFlags
+parameter indicates the interpretation of the other params if they are
+equal to -1.

+    ========================  ======================================
+    wx.SIZE_AUTO              A -1 indicates that a class-specific
+                              default should be used.
+    wx.SIZE_USE_EXISTING      Axisting dimensions should be used if
+                              -1 values are supplied.
+    wxSIZE_ALLOW_MINUS_ONE    Allow dimensions of -1 and less to be
+                              interpreted as real dimensions, not
+                              default values.
+    ========================  ======================================
+ +
SetDoubleBuffered(*args, **kwargs)
SetDoubleBuffered(self, bool on)

+Currently wxGTK2 only.
+ +
SetDropTarget(*args, **kwargs)
SetDropTarget(self, DropTarget dropTarget)

+Associates a drop target with this window.  If the window already has
+a drop target, it is deleted.
+ +
SetEventHandler(*args, **kwargs)
SetEventHandler(self, EvtHandler handler)

+Sets the event handler for this window.  An event handler is an object
+that is capable of processing the events sent to a window.  (In other
+words, is able to dispatch the events to handler function.)  By
+default, the window is its own event handler, but an application may
+wish to substitute another, for example to allow central
+implementation of event-handling for a variety of different window
+classes.

+It is usually better to use `wx.Window.PushEventHandler` since this sets
+up a chain of event handlers, where an event not handled by one event
+handler is handed off to the next one in the chain.
+ +
SetExtraStyle(*args, **kwargs)
SetExtraStyle(self, long exStyle)

+Sets the extra style bits for the window.  Extra styles are the less
+often used style bits which can't be set with the constructor or with
+SetWindowStyleFlag()
+ +
SetFocus(*args, **kwargs)
SetFocus(self)

+Set's the focus to this window, allowing it to receive keyboard input.
+ +
SetFocusFromKbd(*args, **kwargs)
SetFocusFromKbd(self)

+Set focus to this window as the result of a keyboard action.  Normally
+only called internally.
+ +
SetFont(*args, **kwargs)
SetFont(self, Font font) -> bool

+Sets the font for this window.
+ +
SetForegroundColour(*args, **kwargs)
SetForegroundColour(self, Colour colour) -> bool

+Sets the foreground colour of the window.  Returns True is the colour
+was changed.  The interpretation of foreground colour is dependent on
+the window class; it may be the text colour or other colour, or it may
+not be used at all.
+ +
SetHelpText(*args, **kwargs)
SetHelpText(self, String text)

+Sets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
SetHelpTextForId(*args, **kwargs)
SetHelpTextForId(self, String text)

+Associate this help text with all windows with the same id as this
+one.
+ +
SetId(*args, **kwargs)
SetId(self, int winid)

+Sets the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one, an identifier
+will be generated. Normally, the identifier should be provided on
+creation and should not be modified subsequently.
+ +
SetInitialSize(*args, **kwargs)
SetInitialSize(self, Size size=DefaultSize)

+A 'Smart' SetSize that will fill in default size components with the
+window's *best size* values.  Also set's the minsize for use with sizers.
+ +
SetLabel(*args, **kwargs)
SetLabel(self, String label)

+Set the text which the window shows in its label if applicable.
+ +
SetLayoutDirection(*args, **kwargs)
SetLayoutDirection(self, int dir)

+Set the layout direction (LTR or RTL) for this window.
+ +
SetMaxSize(*args, **kwargs)
SetMaxSize(self, Size maxSize)

+A more convenient method than `SetSizeHints` for setting just the
+max size.
+ +
SetMinSize(*args, **kwargs)
SetMinSize(self, Size minSize)

+A more convenient method than `SetSizeHints` for setting just the
+min size.
+ +
SetName(*args, **kwargs)
SetName(self, String name)

+Sets the window's name.  The window name is used for ressource setting
+in X, it is not the same as the window title/label
+ +
SetOwnBackgroundColour(*args, **kwargs)
SetOwnBackgroundColour(self, Colour colour)
+ +
SetOwnFont(*args, **kwargs)
SetOwnFont(self, Font font)
+ +
SetOwnForegroundColour(*args, **kwargs)
SetOwnForegroundColour(self, Colour colour)
+ +
SetPosition = Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
SetRect(*args, **kwargs)
SetRect(self, Rect rect, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels using a wx.Rect.
+ +
SetScrollPos(*args, **kwargs)
SetScrollPos(self, int orientation, int pos, bool refresh=True)

+Sets the position of one of the built-in scrollbars.
+ +
SetScrollbar(*args, **kwargs)
SetScrollbar(self, int orientation, int position, int thumbSize, int range, 
+    bool refresh=True)

+Sets the scrollbar properties of a built-in scrollbar.
+ +
SetSize(*args, **kwargs)
SetSize(self, Size size)

+Sets the size of the window in pixels.
+ +
SetSizeHints(*args, **kwargs)
SetSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1, int incW=-1, 
+    int incH=-1)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeHintsSz(*args, **kwargs)
SetSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize, Size incSize=DefaultSize)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeWH(*args, **kwargs)
SetSizeWH(self, int width, int height)

+Sets the size of the window in pixels.
+ +
SetSizer(*args, **kwargs)
SetSizer(self, Sizer sizer, bool deleteOld=True)

+Sets the window to have the given layout sizer. The window will then
+own the object, and will take care of its deletion. If an existing
+layout sizer object is already owned by the window, it will be deleted
+if the deleteOld parameter is true. Note that this function will also
+call SetAutoLayout implicitly with a True parameter if the sizer is
+non-None, and False otherwise.
+ +
SetSizerAndFit(*args, **kwargs)
SetSizerAndFit(self, Sizer sizer, bool deleteOld=True)

+The same as SetSizer, except it also sets the size hints for the
+window based on the sizer's minimum size.
+ +
SetThemeEnabled(*args, **kwargs)
SetThemeEnabled(self, bool enableTheme)

+This function tells a window if it should use the system's "theme"
+ code to draw the windows' background instead if its own background
+ drawing code. This will only have an effect on platforms that support
+ the notion of themes in user defined windows. One such platform is
+ GTK+ where windows can have (very colourful) backgrounds defined by a
+ user's selected theme.

+Dialogs, notebook pages and the status bar have this flag set to true
+by default so that the default look and feel is simulated best.
+ +
SetToolTip(*args, **kwargs)
SetToolTip(self, ToolTip tip)

+Attach a tooltip to the window.
+ +
SetToolTipString(*args, **kwargs)
SetToolTipString(self, String tip)

+Attach a tooltip to the window.
+ +
SetTransparent(*args, **kwargs)
SetTransparent(self, byte alpha) -> bool

+Attempt to set the transparency of this window to the ``alpha`` value,
+returns True on success.  The ``alpha`` value is an integer in the
+range of 0 to 255, where 0 is fully transparent and 255 is fully
+opaque.
+ +
SetValidator(*args, **kwargs)
SetValidator(self, Validator validator)

+Deletes the current validator (if any) and sets the window validator,
+having called wx.Validator.Clone to create a new validator of this
+type.
+ +
SetVirtualSize(*args, **kwargs)
SetVirtualSize(self, Size size)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetVirtualSizeHints(*args, **kwargs)
SetVirtualSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeHintsSz(*args, **kwargs)
SetVirtualSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeWH(*args, **kwargs)
SetVirtualSizeWH(self, int w, int h)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetWindowStyle = SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowVariant(*args, **kwargs)
SetWindowVariant(self, int variant)

+Sets the variant of the window/font size to use for this window, if
+the platform supports variants, for example, wxMac.
+ +
ShouldInheritColours(*args, **kwargs)
ShouldInheritColours(self) -> bool

+Return true from here to allow the colours of this window to be
+changed by InheritAttributes, returning false forbids inheriting them
+from the parent window.

+The base class version returns false, but this method is overridden in
+wxControl where it returns true.
+ +
Show(*args, **kwargs)
Show(self, bool show=True) -> bool

+Shows or hides the window. You may need to call Raise for a top level
+window if you want to bring it to top, although this is not needed if
+Show is called immediately after the frame creation.  Returns True if
+the window has been shown or hidden or False if nothing was done
+because it already was in the requested state.
+ +
Thaw(*args, **kwargs)
Thaw(self)

+Reenables window updating after a previous call to Freeze.  Calls to
+Freeze/Thaw may be nested, so Thaw must be called the same number of
+times that Freeze was before the window will be updated.
+ +
ToggleWindowStyle(*args, **kwargs)
ToggleWindowStyle(self, int flag) -> bool

+Turn the flag on if it had been turned off before and vice versa,
+returns True if the flag is turned on by this function call.
+ +
TransferDataFromWindow(*args, **kwargs)
TransferDataFromWindow(self) -> bool

+Transfers values from child controls to data areas specified by their
+validators. Returns false if a transfer failed.  If the window has
+wx.WS_EX_VALIDATE_RECURSIVELY extra style flag set, the method will
+also call TransferDataFromWindow() of all child windows.
+ +
TransferDataToWindow(*args, **kwargs)
TransferDataToWindow(self) -> bool

+Transfers values to child controls from data areas specified by their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call TransferDataToWindow() of
+all child windows.
+ +
UnregisterHotKey(*args, **kwargs)
UnregisterHotKey(self, int hotkeyId) -> bool

+Unregisters a system wide hotkey.
+ +
Update(*args, **kwargs)
Update(self)

+Calling this method immediately repaints the invalidated area of the
+window instead of waiting for the EVT_PAINT event to happen, (normally
+this would usually only happen when the flow of control returns to the
+event loop.)  Notice that this function doesn't refresh the window and
+does nothing if the window has been already repainted.  Use `Refresh`
+first if you want to immediately redraw the window (or some portion of
+it) unconditionally.
+ +
UpdateWindowUI(*args, **kwargs)
UpdateWindowUI(self, long flags=UPDATE_UI_NONE)

+This function sends EVT_UPDATE_UI events to the window. The particular
+implementation depends on the window; for example a wx.ToolBar will
+send an update UI event for each toolbar button, and a wx.Frame will
+send an update UI event for each menubar menu item. You can call this
+function from your application to ensure that your UI is up-to-date at
+a particular point in time (as far as your EVT_UPDATE_UI handlers are
+concerned). This may be necessary if you have called
+`wx.UpdateUIEvent.SetMode` or `wx.UpdateUIEvent.SetUpdateInterval` to
+limit the overhead that wxWindows incurs by sending update UI events
+in idle time.
+ +
UseBgCol(*args, **kwargs)
UseBgCol(self) -> bool
+ +
Validate(*args, **kwargs)
Validate(self) -> bool

+Validates the current values of the child controls using their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call Validate() of all child
+windows.  Returns false if any of the validations failed.
+ +
WarpPointer(*args, **kwargs)
WarpPointer(self, int x, int y)

+Moves the pointer to the given position on the window.

+NOTE: This function is not supported under Mac because Apple Human
+Interface Guidelines forbid moving the mouse cursor programmatically.
+ +
+Static methods inherited from wx._core.Window:
+
FindFocus(*args, **kwargs)
FindFocus() -> Window

+Returns the window or control that currently has the keyboard focus,
+or None.
+ +
GetCapture(*args, **kwargs)
GetCapture() -> Window

+Returns the window which currently captures the mouse or None
+ +
NewControlId(*args, **kwargs)
NewControlId() -> int

+Generate a control id for the controls which were not given one.
+ +
NextControlId(*args, **kwargs)
NextControlId(int winid) -> int

+Get the id of the control following the one with the given
+autogenerated) id
+ +
PrevControlId(*args, **kwargs)
PrevControlId(int winid) -> int

+Get the id of the control preceding the one with the given
+autogenerated) id
+ +
+Data descriptors inherited from wx._core.Window:
+
AcceleratorTable
+
See `GetAcceleratorTable` and `SetAcceleratorTable`
+
+
AutoLayout
+
See `GetAutoLayout` and `SetAutoLayout`
+
+
BackgroundColour
+
See `GetBackgroundColour` and `SetBackgroundColour`
+
+
BackgroundStyle
+
See `GetBackgroundStyle` and `SetBackgroundStyle`
+
+
BestSize
+
See `GetBestSize`
+
+
BestVirtualSize
+
See `GetBestVirtualSize`
+
+
Border
+
See `GetBorder`
+
+
Caret
+
See `GetCaret` and `SetCaret`
+
+
CharHeight
+
See `GetCharHeight`
+
+
CharWidth
+
See `GetCharWidth`
+
+
Children
+
See `GetChildren`
+
+
ClientAreaOrigin
+
See `GetClientAreaOrigin`
+
+
ClientRect
+
See `GetClientRect` and `SetClientRect`
+
+
ClientSize
+
See `GetClientSize` and `SetClientSize`
+
+
Constraints
+
See `GetConstraints` and `SetConstraints`
+
+
ContainingSizer
+
See `GetContainingSizer` and `SetContainingSizer`
+
+
Cursor
+
See `GetCursor` and `SetCursor`
+
+
DefaultAttributes
+
See `GetDefaultAttributes`
+
+
DropTarget
+
See `GetDropTarget` and `SetDropTarget`
+
+
EffectiveMinSize
+
See `GetEffectiveMinSize`
+
+
Enabled
+
See `IsEnabled` and `Enable`
+
+
EventHandler
+
See `GetEventHandler` and `SetEventHandler`
+
+
ExtraStyle
+
See `GetExtraStyle` and `SetExtraStyle`
+
+
Font
+
See `GetFont` and `SetFont`
+
+
ForegroundColour
+
See `GetForegroundColour` and `SetForegroundColour`
+
+
GrandParent
+
See `GetGrandParent`
+
+
GtkWidget
+
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+
+
Handle
+
See `GetHandle`
+
+
HelpText
+
See `GetHelpText` and `SetHelpText`
+
+
Id
+
See `GetId` and `SetId`
+
+
Label
+
See `GetLabel` and `SetLabel`
+
+
LayoutDirection
+
See `GetLayoutDirection` and `SetLayoutDirection`
+
+
MaxHeight
+
See `GetMaxHeight`
+
+
MaxSize
+
See `GetMaxSize` and `SetMaxSize`
+
+
MaxWidth
+
See `GetMaxWidth`
+
+
MinHeight
+
See `GetMinHeight`
+
+
MinSize
+
See `GetMinSize` and `SetMinSize`
+
+
MinWidth
+
See `GetMinWidth`
+
+
Name
+
See `GetName` and `SetName`
+
+
Parent
+
See `GetParent`
+
+
Position
+
See `GetPosition` and `SetPosition`
+
+
Rect
+
See `GetRect` and `SetRect`
+
+
ScreenPosition
+
See `GetScreenPosition`
+
+
ScreenRect
+
See `GetScreenRect`
+
+
Shown
+
See `IsShown` and `Show`
+
+
Size
+
See `GetSize` and `SetSize`
+
+
Sizer
+
See `GetSizer` and `SetSizer`
+
+
ThemeEnabled
+
See `GetThemeEnabled` and `SetThemeEnabled`
+
+
ToolTip
+
See `GetToolTip` and `SetToolTip`
+
+
TopLevel
+
See `IsTopLevel`
+
+
TopLevelParent
+
See `GetTopLevelParent`
+
+
UpdateClientRect
+
See `GetUpdateClientRect`
+
+
UpdateRegion
+
See `GetUpdateRegion`
+
+
Validator
+
See `GetValidator` and `SetValidator`
+
+
VirtualSize
+
See `GetVirtualSize` and `SetVirtualSize`
+
+
WindowStyle
+
See `GetWindowStyle` and `SetWindowStyle`
+
+
WindowStyleFlag
+
See `GetWindowStyleFlag` and `SetWindowStyleFlag`
+
+
WindowVariant
+
See `GetWindowVariant` and `SetWindowVariant`
+
+
+Methods inherited from wx._core.EvtHandler:
+
AddPendingEvent(*args, **kwargs)
AddPendingEvent(self, Event event)
+ +
Bind(self, event, handler, source=None, id=-1, id2=-1)
Bind an event to an event handler.

+:param event: One of the EVT_* objects that specifies the
+              type of event to bind,

+:param handler: A callable object to be invoked when the
+              event is delivered to self.  Pass None to
+              disconnect an event handler.

+:param source: Sometimes the event originates from a
+              different window than self, but you still
+              want to catch it in self.  (For example, a
+              button event delivered to a frame.)  By
+              passing the source of the event, the event
+              handling system is able to differentiate
+              between the same event type from different
+              controls.

+:param id: Used to spcify the event source by ID instead
+           of instance.

+:param id2: Used when it is desirable to bind a handler
+              to a range of IDs, such as with EVT_MENU_RANGE.
+ +
Connect(*args, **kwargs)
Connect(self, int id, int lastId, int eventType, PyObject func)
+ +
Disconnect(*args, **kwargs)
Disconnect(self, int id, int lastId=-1, EventType eventType=wxEVT_NULL) -> bool
+ +
GetEvtHandlerEnabled(*args, **kwargs)
GetEvtHandlerEnabled(self) -> bool
+ +
GetNextHandler(*args, **kwargs)
GetNextHandler(self) -> EvtHandler
+ +
GetPreviousHandler(*args, **kwargs)
GetPreviousHandler(self) -> EvtHandler
+ +
ProcessEvent(*args, **kwargs)
ProcessEvent(self, Event event) -> bool
+ +
ProcessPendingEvents(*args, **kwargs)
ProcessPendingEvents(self)
+ +
SetEvtHandlerEnabled(*args, **kwargs)
SetEvtHandlerEnabled(self, bool enabled)
+ +
SetNextHandler(*args, **kwargs)
SetNextHandler(self, EvtHandler handler)
+ +
SetPreviousHandler(*args, **kwargs)
SetPreviousHandler(self, EvtHandler handler)
+ +
Unbind(self, event, source=None, id=-1, id2=-1)
Disconencts the event handler binding for event from self.
+Returns True if successful.
+ +
+Data descriptors inherited from wx._core.EvtHandler:
+
EvtHandlerEnabled
+
See `GetEvtHandlerEnabled` and `SetEvtHandlerEnabled`
+
+
NextHandler
+
See `GetNextHandler` and `SetNextHandler`
+
+
PreviousHandler
+
See `GetPreviousHandler` and `SetPreviousHandler`
+
+
+Methods inherited from wx._core.Object:
+
GetClassName(*args, **kwargs)
GetClassName(self) -> String

+Returns the class name of the C++ class using wxRTTI.
+ +
IsSameAs(*args, **kwargs)
IsSameAs(self, Object p) -> bool

+For wx.Objects that use C++ reference counting internally, this method
+can be used to determine if two objects are referencing the same data
+object.
+ +
+Data descriptors inherited from wx._core.Object:
+
ClassName
+
See `GetClassName`
+
+
__dict__
+
dictionary for instance variables (if defined)
+
+
__weakref__
+
list of weak references to the object (if defined)
+
+

+ + + + + +
 
+Functions
       
create(parent)
+

+ + + + + +
 
+Data
       wxID_HTMLVIEW = 154
+wxID_HTMLVIEWBACK = 155
+wxID_HTMLVIEWFORWARD = 156
+wxID_HTMLVIEWGENSTATICTEXT1 = 157
+wxID_HTMLVIEWHOME = 158
+wxID_HTMLVIEWHTML = 159
+wxID_HTMLVIEWLBLPAGENAME = 160
+wxID_HTMLVIEWREFRESH = 161
+ \ No newline at end of file diff --git a/pydoc/wxmtxy_pair.html b/pydoc/wxmtxy_pair.html new file mode 100644 index 0000000..63a5012 --- /dev/null +++ b/pydoc/wxmtxy_pair.html @@ -0,0 +1,1831 @@ + + +Python: module wxmtxy_pair + + + + +
 
+ 
wxmtxy_pair
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy_pair.py
+

Define the GUI elements and interface for one X,Y pair

+@version: 
+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_pair.py $
+# $Id: wxmtxy_pair.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+

+ + + + + +
 
+Modules
       
copy
+pprint
+
wx
+wxmtxy_axis
+
wxmtxy_row
+wxmtxy_tab
+

+ + + + + +
 
+Classes
       
+
wx._windows.Panel(wx._core.Window) +
+
+
XYpair +
+
+
+

+ + + + + + + +
 
+class XYpair(wx._windows.Panel)
   Table of settings for a specified X,Y pair of EPICS motors
 
 
Method resolution order:
+
XYpair
+
wx._windows.Panel
+
wx._core.Window
+
wx._core.EvtHandler
+
wx._core.Object
+
__builtin__.object
+
+
+Methods defined here:
+
CallbackDMOV(self, epics_args, user_args)
receive a callback on the DMOV field
+ +
CallbackPositions(self, epics_args, user_args)
receive a callback on the VAL and RBV fields
+ +
CallbackTitle(self, epics_args, user_args)
receive a callback on the DESC and EGU fields
+ +
ConnectEpics(self)
try to connect the XY_pair PV names with EPICS
+ +
DeleteTab(self)
Delete the given tab
+ +
GetAxisTitleX(self)
@return X axis title
+ +
GetAxisTitleY(self)
@return Y axis title
+ +
GetEpicsConfig(self)
@return deep copy of EPICS PV configuration
+ +
GetPageTitle(self)
@return page title
+ +
GetRbvXY(self)
@return readback values for X and Y as a tuple
+ +
GetSelection(self)
@return index number of the selected tab object
+ +
GetTabSelection(self)
@return selected tab object
+ +
GetTabText(self, tabnum)
return the text of the tab numbered tabnum
+@param tabnum: [int] index of selected tab
+ +
MoveAxes(self, x, y)
Command both axes to move to new position
+@param x: [float] new X position
+@param y: [float] new Y position
+ +
NewTab(self, newrow=True)
make a new tab
+@param newrow: [Boolean] option to create a first row
+ +
OnStopButton(self, event)
user requested to stop the X and Y motors
+@param event: wxPython event object
+ +
ReleaseEpics(self)
release connections with the XY_pair EPICS PVs
+@note: When will this be called?
+ +
SetAxisTitles(self, x_title, y_title)
define the axis titles
+@param x_title: [string] X axis title
+@param y_title: [string] Y axis title
+ +
SetEpicsConfig(self, config)
define the EPICS PVs from a configuration
+@param config: Python dictionary with axes configurations
+ +
SetMotorColor(self, axis, state)
change the background color of the RBV and VAL widgets

+@param axis: [string] either "x" or "y"
+@param state: [Boolean], color is green if state == False, neutral if True
+ +
SetPageTitle(self, title)
define the page title
+@param title: [string] new page title
+ +
SetTabText(self, tabnum, text)
set the text of the tab numbered tabnum
+@param tabnum: [int] index of selected tab
+@param text: [string] new text
+ +
StopAxes(self)
Send a stop to both axes
+ +
TabHandler(self, theTab, theRow, command)
Callback function to handle a command from a tab
+@param theTab: wxmtxy_tab.Tab object
+@param theRow: wxmtxy_row.Row object
+@param command: [string] Row button action to pass upward for handling
+ +
__init__(self, parent, name, root, rootCallback, newtab=False)
initialize an instance of this class
+@param parent: object that owns this class
+@param name: display test that describes this XYpair
+@param root: root object
+@param rootCallback: routine in the parent to handle Button events from the Tab
+@param newtab: [Boolean] create a default Tab group?
+ +
__init_names__(self)
cross-reference the widgets to a dictionary
+ +
+Data and other attributes defined here:
+
COLOR_MOVING = wx.Colour(179, 250, 142, 255)
+ +
COLOR_NOT_MOVING = wx.Colour(237, 233, 227, 255)
+ +
+Methods inherited from wx._windows.Panel:
+
Create(*args, **kwargs)
Create(self, Window parent, int id=-1, Point pos=DefaultPosition, 
+    Size size=DefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER, 
+    String name=PanelNameStr) -> bool

+Create the GUI part of the Window for 2-phase creation mode.
+ +
SetFocusIgnoringChildren(*args, **kwargs)
SetFocusIgnoringChildren(self)

+In contrast to `SetFocus` (see above) this will set the focus to the
+panel even of there are child windows in the panel. This is only
+rarely needed.
+ +
__repr__ = _swig_repr(self)
+ +
+Static methods inherited from wx._windows.Panel:
+
GetClassDefaultAttributes(*args, **kwargs)
GetClassDefaultAttributes(int variant=WINDOW_VARIANT_NORMAL) -> VisualAttributes

+Get the default attributes for this class.  This is useful if you want
+to use the same font or colour in your own control as in a standard
+control -- which is a much better idea than hard coding specific
+colours or fonts which might look completely out of place on the
+user's system, especially if it uses themes.

+The variant parameter is only relevant under Mac currently and is
+ignore under other platforms. Under Mac, it will change the size of
+the returned font. See `wx.Window.SetWindowVariant` for more about
+this.
+ +
+Data descriptors inherited from wx._windows.Panel:
+
thisown
+
The membership flag
+
+
+Methods inherited from wx._core.Window:
+
AcceptsFocus(*args, **kwargs)
AcceptsFocus(self) -> bool

+Can this window have focus?
+ +
AcceptsFocusFromKeyboard(*args, **kwargs)
AcceptsFocusFromKeyboard(self) -> bool

+Can this window be given focus by keyboard navigation? if not, the
+only way to give it focus (provided it accepts it at all) is to click
+it.
+ +
AddChild(*args, **kwargs)
AddChild(self, Window child)

+Adds a child window. This is called automatically by window creation
+functions so should not be required by the application programmer.
+ +
AdjustForLayoutDirection(*args, **kwargs)
AdjustForLayoutDirection(self, int x, int width, int widthTotal) -> int

+Mirror coordinates for RTL layout if this window uses it and if the
+mirroring is not done automatically like Win32.
+ +
AssociateHandle(*args, **kwargs)
AssociateHandle(self, long handle)

+Associate the window with a new native handle
+ +
CacheBestSize(*args, **kwargs)
CacheBestSize(self, Size size)

+Cache the best size so it doesn't need to be calculated again, (at least until
+some properties of the window change.)
+ +
CanSetTransparent(*args, **kwargs)
CanSetTransparent(self) -> bool

+Returns ``True`` if the platform supports setting the transparency for
+this window.  Note that this method will err on the side of caution,
+so it is possible that this will return ``False`` when it is in fact
+possible to set the transparency.

+NOTE: On X-windows systems the X server must have the composite
+extension loaded, and there must be a composite manager program (such
+as xcompmgr) running.
+ +
CaptureMouse(*args, **kwargs)
CaptureMouse(self)

+Directs all mouse input to this window. Call wx.Window.ReleaseMouse to
+release the capture.

+Note that wxWindows maintains the stack of windows having captured the
+mouse and when the mouse is released the capture returns to the window
+which had had captured it previously and it is only really released if
+there were no previous window. In particular, this means that you must
+release the mouse as many times as you capture it, unless the window
+receives the `wx.MouseCaptureLostEvent` event.

+Any application which captures the mouse in the beginning of some
+operation *must* handle `wx.MouseCaptureLostEvent` and cancel this
+operation when it receives the event. The event handler must not
+recapture mouse.
+ +
Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
Centre = Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CentreOnParent = CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
ClearBackground(*args, **kwargs)
ClearBackground(self)

+Clears the window by filling it with the current background
+colour. Does not cause an erase background event to be generated.
+ +
ClientToScreen(*args, **kwargs)
ClientToScreen(self, Point pt) -> Point

+Converts to screen coordinates from coordinates relative to this window.
+ +
ClientToScreenXY(*args, **kwargs)
ClientToScreenXY(int x, int y) -> (x,y)

+Converts to screen coordinates from coordinates relative to this window.
+ +
Close(*args, **kwargs)
Close(self, bool force=False) -> bool

+This function simply generates a EVT_CLOSE event whose handler usually
+tries to close the window. It doesn't close the window itself,
+however.  If force is False (the default) then the window's close
+handler will be allowed to veto the destruction of the window.
+ +
ConvertDialogPointToPixels(*args, **kwargs)
ConvertDialogPointToPixels(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertDialogSizeToPixels(*args, **kwargs)
ConvertDialogSizeToPixels(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertPixelPointToDialog(*args, **kwargs)
ConvertPixelPointToDialog(self, Point pt) -> Point
+ +
ConvertPixelSizeToDialog(*args, **kwargs)
ConvertPixelSizeToDialog(self, Size sz) -> Size
+ +
DLG_PNT(*args, **kwargs)
DLG_PNT(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
DLG_SZE(*args, **kwargs)
DLG_SZE(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
Destroy(*args, **kwargs)
Destroy(self) -> bool

+Destroys the window safely.  Frames and dialogs are not destroyed
+immediately when this function is called -- they are added to a list
+of windows to be deleted on idle time, when all the window's events
+have been processed. This prevents problems with events being sent to
+non-existent windows.

+Returns True if the window has either been successfully deleted, or it
+has been added to the list of windows pending real deletion.
+ +
DestroyChildren(*args, **kwargs)
DestroyChildren(self) -> bool

+Destroys all children of a window. Called automatically by the
+destructor.
+ +
Disable(*args, **kwargs)
Disable(self) -> bool

+Disables the window, same as Enable(false).
+ +
DissociateHandle(*args, **kwargs)
DissociateHandle(self)

+Dissociate the current native handle from the window
+ +
DragAcceptFiles(*args, **kwargs)
DragAcceptFiles(self, bool accept)

+Enables or disables eligibility for drop file events, EVT_DROP_FILES.
+Only functional on Windows.
+ +
Enable(*args, **kwargs)
Enable(self, bool enable=True) -> bool

+Enable or disable the window for user input. Note that when a parent
+window is disabled, all of its children are disabled as well and they
+are reenabled again when the parent is.  Returns true if the window
+has been enabled or disabled, false if nothing was done, i.e. if the
+window had already been in the specified state.
+ +
FindWindowById(*args, **kwargs)
FindWindowById(self, long winid) -> Window

+Find a child of this window by window ID
+ +
FindWindowByName(*args, **kwargs)
FindWindowByName(self, String name) -> Window

+Find a child of this window by name
+ +
Fit(*args, **kwargs)
Fit(self)

+Sizes the window so that it fits around its subwindows. This function
+won't do anything if there are no subwindows and will only really work
+correctly if sizers are used for the subwindows layout. Also, if the
+window has exactly one subwindow it is better (faster and the result
+is more precise as Fit adds some margin to account for fuzziness of
+its calculations) to call window.SetClientSize(child.GetSize())
+instead of calling Fit.
+ +
FitInside(*args, **kwargs)
FitInside(self)

+Similar to Fit, but sizes the interior (virtual) size of a
+window. Mainly useful with scrolled windows to reset scrollbars after
+sizing changes that do not trigger a size event, and/or scrolled
+windows without an interior sizer. This function similarly won't do
+anything if there are no subwindows.
+ +
Freeze(*args, **kwargs)
Freeze(self)

+Freezes the window or, in other words, prevents any updates from
+taking place on screen, the window is not redrawn at all. Thaw must be
+called to reenable window redrawing.  Calls to Freeze/Thaw may be
+nested, with the actual Thaw being delayed until all the nesting has
+been undone.

+This method is useful for visual appearance optimization (for example,
+it is a good idea to use it before inserting large amount of text into
+a wxTextCtrl under wxGTK) but is not implemented on all platforms nor
+for all controls so it is mostly just a hint to wxWindows and not a
+mandatory directive.
+ +
GetAcceleratorTable(*args, **kwargs)
GetAcceleratorTable(self) -> AcceleratorTable

+Gets the accelerator table for this window.
+ +
GetAdjustedBestSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetAutoLayout(*args, **kwargs)
GetAutoLayout(self) -> bool

+Returns the current autoLayout setting
+ +
GetBackgroundColour(*args, **kwargs)
GetBackgroundColour(self) -> Colour

+Returns the background colour of the window.
+ +
GetBackgroundStyle(*args, **kwargs)
GetBackgroundStyle(self) -> int

+Returns the background style of the window.

+:see: `SetBackgroundStyle`
+ +
GetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetBestSize(*args, **kwargs)
GetBestSize(self) -> Size

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestSizeTuple(*args, **kwargs)
GetBestSizeTuple() -> (width, height)

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestVirtualSize(*args, **kwargs)
GetBestVirtualSize(self) -> Size

+Return the largest of ClientSize and BestSize (as determined by a
+sizer, interior children, or other means)
+ +
GetBorder(*args)
GetBorder(self, long flags) -> int
+GetBorder(self) -> int

+Get border for the flags of this window
+ +
GetCaret(*args, **kwargs)
GetCaret(self) -> Caret

+Returns the caret associated with the window.
+ +
GetCharHeight(*args, **kwargs)
GetCharHeight(self) -> int

+Get the (average) character size for the current font.
+ +
GetCharWidth(*args, **kwargs)
GetCharWidth(self) -> int

+Get the (average) character size for the current font.
+ +
GetChildren(*args, **kwargs)
GetChildren(self) -> WindowList

+Returns an object containing a list of the window's children.  The
+object provides a Python sequence-like interface over the internal
+list maintained by the window..
+ +
GetClientAreaOrigin(*args, **kwargs)
GetClientAreaOrigin(self) -> Point

+Get the origin of the client area of the window relative to the
+window's top left corner (the client area may be shifted because of
+the borders, scrollbars, other decorations...)
+ +
GetClientRect(*args, **kwargs)
GetClientRect(self) -> Rect

+Get the client area position and size as a `wx.Rect` object.
+ +
GetClientSize(*args, **kwargs)
GetClientSize(self) -> Size

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetClientSizeTuple(*args, **kwargs)
GetClientSizeTuple() -> (width, height)

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetConstraints(*args, **kwargs)
GetConstraints(self) -> LayoutConstraints

+Returns a pointer to the window's layout constraints, or None if there
+are none.
+ +
GetContainingSizer(*args, **kwargs)
GetContainingSizer(self) -> Sizer

+Return the sizer that this window is a member of, if any, otherwise None.
+ +
GetCursor(*args, **kwargs)
GetCursor(self) -> Cursor

+Return the cursor associated with this window.
+ +
GetDefaultAttributes(*args, **kwargs)
GetDefaultAttributes(self) -> VisualAttributes

+Get the default attributes for an instance of this class.  This is
+useful if you want to use the same font or colour in your own control
+as in a standard control -- which is a much better idea than hard
+coding specific colours or fonts which might look completely out of
+place on the user's system, especially if it uses themes.
+ +
GetDropTarget(*args, **kwargs)
GetDropTarget(self) -> DropTarget

+Returns the associated drop target, which may be None.
+ +
GetEffectiveMinSize(*args, **kwargs)
GetEffectiveMinSize(self) -> Size

+This function will merge the window's best size into the window's
+minimum size, giving priority to the min size components, and returns
+the results.
+ +
GetEventHandler(*args, **kwargs)
GetEventHandler(self) -> EvtHandler

+Returns the event handler for this window. By default, the window is
+its own event handler.
+ +
GetExtraStyle(*args, **kwargs)
GetExtraStyle(self) -> long

+Returns the extra style bits for the window.
+ +
GetFont(*args, **kwargs)
GetFont(self) -> Font

+Returns the default font used for this window.
+ +
GetForegroundColour(*args, **kwargs)
GetForegroundColour(self) -> Colour

+Returns the foreground colour of the window.  The interpretation of
+foreground colour is dependent on the window class; it may be the text
+colour or other colour, or it may not be used at all.
+ +
GetFullTextExtent(*args, **kwargs)
GetFullTextExtent(String string, Font font=None) ->
+   (width, height, descent, externalLeading)

+Get the width, height, decent and leading of the text using the
+current or specified font.
+ +
GetGrandParent(*args, **kwargs)
GetGrandParent(self) -> Window

+Returns the parent of the parent of this window, or None if there
+isn't one.
+ +
GetGtkWidget(*args, **kwargs)
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+ +
GetHandle(*args, **kwargs)
GetHandle(self) -> long

+Returns the platform-specific handle (as a long integer) of the
+physical window.  On wxMSW this is the win32 window handle, on wxGTK
+it is the XWindow ID, and on wxMac it is the ControlRef.
+ +
GetHelpText(*args, **kwargs)
GetHelpText(self) -> String

+Gets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
GetHelpTextAtPoint(*args, **kwargs)
GetHelpTextAtPoint(self, Point pt, wxHelpEvent::Origin origin) -> String

+Get the help string associated with the given position in this window.

+Notice that pt may be invalid if event origin is keyboard or unknown
+and this method should return the global window help text then
+ +
GetId(*args, **kwargs)
GetId(self) -> int

+Returns the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one (or the default Id
+-1 is used) then an unique identifier with a negative value will be
+generated.
+ +
GetLabel(*args, **kwargs)
GetLabel(self) -> String

+Generic way of getting a label from any window, for identification
+purposes.  The interpretation of this function differs from class to
+class. For frames and dialogs, the value returned is the title. For
+buttons or static text controls, it is the button text. This function
+can be useful for meta-programs such as testing tools or special-needs
+access programs)which need to identify windows by name.
+ +
GetLayoutDirection(*args, **kwargs)
GetLayoutDirection(self) -> int

+Get the layout direction (LTR or RTL) for this window.  Returns
+``wx.Layout_Default`` if layout direction is not supported.
+ +
GetMaxHeight(*args, **kwargs)
GetMaxHeight(self) -> int
+ +
GetMaxSize(*args, **kwargs)
GetMaxSize(self) -> Size
+ +
GetMaxWidth(*args, **kwargs)
GetMaxWidth(self) -> int
+ +
GetMinHeight(*args, **kwargs)
GetMinHeight(self) -> int
+ +
GetMinSize(*args, **kwargs)
GetMinSize(self) -> Size
+ +
GetMinWidth(*args, **kwargs)
GetMinWidth(self) -> int
+ +
GetName(*args, **kwargs)
GetName(self) -> String

+Returns the windows name.  This name is not guaranteed to be unique;
+it is up to the programmer to supply an appropriate name in the window
+constructor or via wx.Window.SetName.
+ +
GetParent(*args, **kwargs)
GetParent(self) -> Window

+Returns the parent window of this window, or None if there isn't one.
+ +
GetPosition(*args, **kwargs)
GetPosition(self) -> Point

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetPositionTuple(*args, **kwargs)
GetPositionTuple() -> (x,y)

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetRect(*args, **kwargs)
GetRect(self) -> Rect

+Returns the size and position of the window as a `wx.Rect` object.
+ +
GetScreenPosition(*args, **kwargs)
GetScreenPosition(self) -> Point

+Get the position of the window in screen coordinantes.
+ +
GetScreenPositionTuple(*args, **kwargs)
GetScreenPositionTuple() -> (x,y)

+Get the position of the window in screen coordinantes.
+ +
GetScreenRect(*args, **kwargs)
GetScreenRect(self) -> Rect

+Returns the size and position of the window in screen coordinantes as
+a `wx.Rect` object.
+ +
GetScrollPos(*args, **kwargs)
GetScrollPos(self, int orientation) -> int

+Returns the built-in scrollbar position.
+ +
GetScrollRange(*args, **kwargs)
GetScrollRange(self, int orientation) -> int

+Returns the built-in scrollbar range.
+ +
GetScrollThumb(*args, **kwargs)
GetScrollThumb(self, int orientation) -> int

+Returns the built-in scrollbar thumb size.
+ +
GetSize(*args, **kwargs)
GetSize(self) -> Size

+Get the window size.
+ +
GetSizeTuple(*args, **kwargs)
GetSizeTuple() -> (width, height)

+Get the window size.
+ +
GetSizer(*args, **kwargs)
GetSizer(self) -> Sizer

+Return the sizer associated with the window by a previous call to
+SetSizer or None if there isn't one.
+ +
GetTextExtent(*args, **kwargs)
GetTextExtent(String string) -> (width, height)

+Get the width and height of the text using the current font.
+ +
GetThemeEnabled(*args, **kwargs)
GetThemeEnabled(self) -> bool

+Return the themeEnabled flag.
+ +
GetToolTip(*args, **kwargs)
GetToolTip(self) -> ToolTip

+get the associated tooltip or None if none
+ +
GetTopLevelParent(*args, **kwargs)
GetTopLevelParent(self) -> Window

+Returns the first frame or dialog in this window's parental hierarchy.
+ +
GetUpdateClientRect(*args, **kwargs)
GetUpdateClientRect(self) -> Rect

+Get the update rectangle region bounding box in client coords.
+ +
GetUpdateRegion(*args, **kwargs)
GetUpdateRegion(self) -> Region

+Returns the region specifying which parts of the window have been
+damaged. Should only be called within an EVT_PAINT handler.
+ +
GetValidator(*args, **kwargs)
GetValidator(self) -> Validator

+Returns a pointer to the current validator for the window, or None if
+there is none.
+ +
GetVirtualSize(*args, **kwargs)
GetVirtualSize(self) -> Size

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetVirtualSizeTuple(*args, **kwargs)
GetVirtualSizeTuple() -> (width, height)

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetWindowBorderSize(*args, **kwargs)
GetWindowBorderSize(self) -> Size

+Return the size of the left/right and top/bottom borders.
+ +
GetWindowStyle = GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowVariant(*args, **kwargs)
GetWindowVariant(self) -> int
+ +
HasCapture(*args, **kwargs)
HasCapture(self) -> bool

+Returns true if this window has the current mouse capture.
+ +
HasFlag(*args, **kwargs)
HasFlag(self, int flag) -> bool

+Test if the given style is set for this window.
+ +
HasMultiplePages(*args, **kwargs)
HasMultiplePages(self) -> bool
+ +
HasScrollbar(*args, **kwargs)
HasScrollbar(self, int orient) -> bool

+Does the window have the scrollbar for this orientation?
+ +
HasTransparentBackground(*args, **kwargs)
HasTransparentBackground(self) -> bool

+Returns True if this window's background is transparent (as, for
+example, for `wx.StaticText`) and should show the parent window's
+background.

+This method is mostly used internally by the library itself and you
+normally shouldn't have to call it. You may, however, have to override
+it in your custom control classes to ensure that background is painted
+correctly.
+ +
Hide(*args, **kwargs)
Hide(self) -> bool

+Equivalent to calling Show(False).
+ +
HitTest(*args, **kwargs)
HitTest(self, Point pt) -> int

+Test where the given (in client coords) point lies
+ +
HitTestXY(*args, **kwargs)
HitTestXY(self, int x, int y) -> int

+Test where the given (in client coords) point lies
+ +
InheritAttributes(*args, **kwargs)
InheritAttributes(self)

+This function is (or should be, in case of custom controls) called
+during window creation to intelligently set up the window visual
+attributes, that is the font and the foreground and background
+colours.

+By 'intelligently' the following is meant: by default, all windows use
+their own default attributes. However if some of the parent's
+attributes are explicitly changed (that is, using SetFont and not
+SetOwnFont) and if the corresponding attribute hadn't been
+explicitly set for this window itself, then this window takes the same
+value as used by the parent. In addition, if the window overrides
+ShouldInheritColours to return false, the colours will not be changed
+no matter what and only the font might.

+This rather complicated logic is necessary in order to accommodate the
+different usage scenarios. The most common one is when all default
+attributes are used and in this case, nothing should be inherited as
+in modern GUIs different controls use different fonts (and colours)
+than their siblings so they can't inherit the same value from the
+parent. However it was also deemed desirable to allow to simply change
+the attributes of all children at once by just changing the font or
+colour of their common parent, hence in this case we do inherit the
+parents attributes.
+ +
InheritsBackgroundColour(*args, **kwargs)
InheritsBackgroundColour(self) -> bool
+ +
InitDialog(*args, **kwargs)
InitDialog(self)

+Sends an EVT_INIT_DIALOG event, whose handler usually transfers data
+to the dialog via validators.
+ +
InvalidateBestSize(*args, **kwargs)
InvalidateBestSize(self)

+Reset the cached best size value so it will be recalculated the next
+time it is needed.
+ +
IsBeingDeleted(*args, **kwargs)
IsBeingDeleted(self) -> bool

+Is the window in the process of being deleted?
+ +
IsDoubleBuffered(*args, **kwargs)
IsDoubleBuffered(self) -> bool

+Returns ``True`` if the window contents is double-buffered by the
+system, i.e. if any drawing done on the window is really done on a
+temporary backing surface and transferred to the screen all at once
+later.
+ +
IsEnabled(*args, **kwargs)
IsEnabled(self) -> bool

+Returns true if the window is enabled for input, false otherwise.
+ +
IsExposed(*args, **kwargs)
IsExposed(self, int x, int y, int w=1, int h=1) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedPoint(*args, **kwargs)
IsExposedPoint(self, Point pt) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedRect(*args, **kwargs)
IsExposedRect(self, Rect rect) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsFrozen(*args, **kwargs)
IsFrozen(self) -> bool

+Returns ``True`` if the window has been frozen and not thawed yet.

+:see: `Freeze` and `Thaw`
+ +
IsRetained(*args, **kwargs)
IsRetained(self) -> bool

+Returns true if the window is retained, false otherwise.  Retained
+windows are only available on X platforms.
+ +
IsShown(*args, **kwargs)
IsShown(self) -> bool

+Returns true if the window is shown, false if it has been hidden.
+ +
IsShownOnScreen(*args, **kwargs)
IsShownOnScreen(self) -> bool

+Returns ``True`` if the window is physically visible on the screen,
+i.e. it is shown and all its parents up to the toplevel window are
+shown as well.
+ +
IsTopLevel(*args, **kwargs)
IsTopLevel(self) -> bool

+Returns true if the given window is a top-level one. Currently all
+frames and dialogs are always considered to be top-level windows (even
+if they have a parent window).
+ +
Layout(*args, **kwargs)
Layout(self) -> bool

+Invokes the constraint-based layout algorithm or the sizer-based
+algorithm for this window.  See SetAutoLayout: when auto layout is on,
+this function gets called automatically by the default EVT_SIZE
+handler when the window is resized.
+ +
LineDown(*args, **kwargs)
LineDown(self) -> bool

+This is just a wrapper for ScrollLines(1).
+ +
LineUp(*args, **kwargs)
LineUp(self) -> bool

+This is just a wrapper for ScrollLines(-1).
+ +
Lower(*args, **kwargs)
Lower(self)

+Lowers the window to the bottom of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
MakeModal(*args, **kwargs)
MakeModal(self, bool modal=True)

+Disables all other windows in the application so that the user can
+only interact with this window.  Passing False will reverse this
+effect.
+ +
Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
MoveAfterInTabOrder(*args, **kwargs)
MoveAfterInTabOrder(self, Window win)

+Moves this window in the tab navigation order after the specified
+sibling window.  This means that when the user presses the TAB key on
+that other window, the focus switches to this window.

+The default tab order is the same as creation order.  This function
+and `MoveBeforeInTabOrder` allow to change it after creating all the
+windows.
+ +
MoveBeforeInTabOrder(*args, **kwargs)
MoveBeforeInTabOrder(self, Window win)

+Same as `MoveAfterInTabOrder` except that it inserts this window just
+before win instead of putting it right after it.
+ +
MoveXY(*args, **kwargs)
MoveXY(self, int x, int y, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
Navigate(*args, **kwargs)
Navigate(self, int flags=NavigationKeyEvent.IsForward) -> bool

+Does keyboard navigation from this window to another, by sending a
+`wx.NavigationKeyEvent`.
+ +
PageDown(*args, **kwargs)
PageDown(self) -> bool

+This is just a wrapper for ScrollPages(1).
+ +
PageUp(*args, **kwargs)
PageUp(self) -> bool

+This is just a wrapper for ScrollPages(-1).
+ +
PopEventHandler(*args, **kwargs)
PopEventHandler(self, bool deleteHandler=False) -> EvtHandler

+Removes and returns the top-most event handler on the event handler
+stack.  If deleteHandler is True then the wx.EvtHandler object will be
+destroyed after it is popped, and ``None`` will be returned instead.
+ +
PopupMenu(*args, **kwargs)
PopupMenu(self, Menu menu, Point pos=DefaultPosition) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PopupMenuXY(*args, **kwargs)
PopupMenuXY(self, Menu menu, int x=-1, int y=-1) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PostCreate(self, pre)
Phase 3 of the 2-phase create <wink!>
+Call this method after precreating the window with the 2-phase create method.
+ +
PrepareDC(*args, **kwargs)
PrepareDC(self, DC dc)

+Call this function to prepare the device context for drawing a
+scrolled image. It sets the device origin according to the current
+scroll position.
+ +
PushEventHandler(*args, **kwargs)
PushEventHandler(self, EvtHandler handler)

+Pushes this event handler onto the event handler stack for the window.
+An event handler is an object that is capable of processing the events
+sent to a window.  (In other words, is able to dispatch the events to a
+handler function.)  By default, the window is its own event handler,
+but an application may wish to substitute another, for example to
+allow central implementation of event-handling for a variety of
+different window classes.

+wx.Window.PushEventHandler allows an application to set up a chain of
+event handlers, where an event not handled by one event handler is
+handed to the next one in the chain.  Use `wx.Window.PopEventHandler`
+to remove the event handler.  Ownership of the handler is *not* given
+to the window, so you should be sure to pop the handler before the
+window is destroyed and either let PopEventHandler destroy it, or call
+its Destroy method yourself.
+ +
Raise(*args, **kwargs)
Raise(self)

+Raises the window to the top of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
Refresh(*args, **kwargs)
Refresh(self, bool eraseBackground=True, Rect rect=None)

+Mark the specified rectangle (or the whole window) as "dirty" so it
+will be repainted.  Causes an EVT_PAINT event to be generated and sent
+to the window.
+ +
RefreshRect(*args, **kwargs)
RefreshRect(self, Rect rect, bool eraseBackground=True)

+Redraws the contents of the given rectangle: the area inside it will
+be repainted.  This is the same as Refresh but has a nicer syntax.
+ +
RegisterHotKey(*args, **kwargs)
RegisterHotKey(self, int hotkeyId, int modifiers, int keycode) -> bool

+Registers a system wide hotkey. Every time the user presses the hotkey
+registered here, this window will receive a hotkey event. It will
+receive the event even if the application is in the background and
+does not have the input focus because the user is working with some
+other application.  To bind an event handler function to this hotkey
+use EVT_HOTKEY with an id equal to hotkeyId.  Returns True if the
+hotkey was registered successfully.
+ +
ReleaseMouse(*args, **kwargs)
ReleaseMouse(self)

+Releases mouse input captured with wx.Window.CaptureMouse.
+ +
RemoveChild(*args, **kwargs)
RemoveChild(self, Window child)

+Removes a child window. This is called automatically by window
+deletion functions so should not be required by the application
+programmer.
+ +
RemoveEventHandler(*args, **kwargs)
RemoveEventHandler(self, EvtHandler handler) -> bool

+Find the given handler in the event handler chain and remove (but not
+delete) it from the event handler chain, returns True if it was found
+and False otherwise (this also results in an assert failure so this
+function should only be called when the handler is supposed to be
+there.)
+ +
Reparent(*args, **kwargs)
Reparent(self, Window newParent) -> bool

+Reparents the window, i.e the window will be removed from its current
+parent window (e.g. a non-standard toolbar in a wxFrame) and then
+re-inserted into another. Available on Windows and GTK.  Returns True
+if the parent was changed, False otherwise (error or newParent ==
+oldParent)
+ +
ScreenToClient(*args, **kwargs)
ScreenToClient(self, Point pt) -> Point

+Converts from screen to client window coordinates.
+ +
ScreenToClientXY(*args, **kwargs)
ScreenToClientXY(int x, int y) -> (x,y)

+Converts from screen to client window coordinates.
+ +
ScrollLines(*args, **kwargs)
ScrollLines(self, int lines) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of lines down, if lines is positive, or up if lines
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollPages(*args, **kwargs)
ScrollPages(self, int pages) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of pages down, if pages is positive, or up if pages
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollWindow(*args, **kwargs)
ScrollWindow(self, int dx, int dy, Rect rect=None)

+Physically scrolls the pixels in the window and move child windows
+accordingly.  Use this function to optimise your scrolling
+implementations, to minimise the area that must be redrawn. Note that
+it is rarely required to call this function from a user program.
+ +
SendSizeEvent(self)
+ +
SetAcceleratorTable(*args, **kwargs)
SetAcceleratorTable(self, AcceleratorTable accel)

+Sets the accelerator table for this window.
+ +
SetAutoLayout(*args, **kwargs)
SetAutoLayout(self, bool autoLayout)

+Determines whether the Layout function will be called automatically
+when the window is resized.  lease note that this only happens for the
+windows usually used to contain children, namely `wx.Panel` and
+`wx.TopLevelWindow` (and the classes deriving from them).

+This method is called implicitly by `SetSizer` but if you use
+`SetConstraints` you should call it manually or otherwise the window
+layout won't be correctly updated when its size changes.
+ +
SetBackgroundColour(*args, **kwargs)
SetBackgroundColour(self, Colour colour) -> bool

+Sets the background colour of the window.  Returns True if the colour
+was changed.  The background colour is usually painted by the default
+EVT_ERASE_BACKGROUND event handler function under Windows and
+automatically under GTK.  Using `wx.NullColour` will reset the window
+to the default background colour.

+Note that setting the background colour may not cause an immediate
+refresh, so you may wish to call `ClearBackground` or `Refresh` after
+calling this function.

+Using this function will disable attempts to use themes for this
+window, if the system supports them.  Use with care since usually the
+themes represent the appearance chosen by the user to be used for all
+applications on the system.
+ +
SetBackgroundStyle(*args, **kwargs)
SetBackgroundStyle(self, int style) -> bool

+Returns the background style of the window. The background style
+indicates how the background of the window is drawn.

+    ======================  ========================================
+    wx.BG_STYLE_SYSTEM      The background colour or pattern should
+                            be determined by the system
+    wx.BG_STYLE_COLOUR      The background should be a solid colour
+    wx.BG_STYLE_CUSTOM      The background will be implemented by the
+                            application.
+    ======================  ========================================

+On GTK+, use of wx.BG_STYLE_CUSTOM allows the flicker-free drawing of
+a custom background, such as a tiled bitmap. Currently the style has
+no effect on other platforms.

+:see: `GetBackgroundStyle`, `SetBackgroundColour`
+ +
SetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `SetInitialSize`
+ +
SetCaret(*args, **kwargs)
SetCaret(self, Caret caret)

+Sets the caret associated with the window.
+ +
SetClientRect(*args, **kwargs)
SetClientRect(self, Rect rect)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSize(*args, **kwargs)
SetClientSize(self, Size size)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSizeWH(*args, **kwargs)
SetClientSizeWH(self, int width, int height)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetConstraints(*args, **kwargs)
SetConstraints(self, LayoutConstraints constraints)

+Sets the window to have the given layout constraints. If an existing
+layout constraints object is already owned by the window, it will be
+deleted.  Pass None to disassociate and delete the window's current
+constraints.

+You must call SetAutoLayout to tell a window to use the constraints
+automatically in its default EVT_SIZE handler; otherwise, you must
+handle EVT_SIZE yourself and call Layout() explicitly. When setting
+both a wx.LayoutConstraints and a wx.Sizer, only the sizer will have
+effect.
+ +
SetContainingSizer(*args, **kwargs)
SetContainingSizer(self, Sizer sizer)

+This normally does not need to be called by application code. It is
+called internally when a window is added to a sizer, and is used so
+the window can remove itself from the sizer when it is destroyed.
+ +
SetCursor(*args, **kwargs)
SetCursor(self, Cursor cursor) -> bool

+Sets the window's cursor. Notice that the window cursor also sets it
+for the children of the window implicitly.

+The cursor may be wx.NullCursor in which case the window cursor will
+be reset back to default.
+ +
SetDimensions(*args, **kwargs)
SetDimensions(self, int x, int y, int width, int height, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels.  The sizeFlags
+parameter indicates the interpretation of the other params if they are
+equal to -1.

+    ========================  ======================================
+    wx.SIZE_AUTO              A -1 indicates that a class-specific
+                              default should be used.
+    wx.SIZE_USE_EXISTING      Axisting dimensions should be used if
+                              -1 values are supplied.
+    wxSIZE_ALLOW_MINUS_ONE    Allow dimensions of -1 and less to be
+                              interpreted as real dimensions, not
+                              default values.
+    ========================  ======================================
+ +
SetDoubleBuffered(*args, **kwargs)
SetDoubleBuffered(self, bool on)

+Currently wxGTK2 only.
+ +
SetDropTarget(*args, **kwargs)
SetDropTarget(self, DropTarget dropTarget)

+Associates a drop target with this window.  If the window already has
+a drop target, it is deleted.
+ +
SetEventHandler(*args, **kwargs)
SetEventHandler(self, EvtHandler handler)

+Sets the event handler for this window.  An event handler is an object
+that is capable of processing the events sent to a window.  (In other
+words, is able to dispatch the events to handler function.)  By
+default, the window is its own event handler, but an application may
+wish to substitute another, for example to allow central
+implementation of event-handling for a variety of different window
+classes.

+It is usually better to use `wx.Window.PushEventHandler` since this sets
+up a chain of event handlers, where an event not handled by one event
+handler is handed off to the next one in the chain.
+ +
SetExtraStyle(*args, **kwargs)
SetExtraStyle(self, long exStyle)

+Sets the extra style bits for the window.  Extra styles are the less
+often used style bits which can't be set with the constructor or with
+SetWindowStyleFlag()
+ +
SetFocus(*args, **kwargs)
SetFocus(self)

+Set's the focus to this window, allowing it to receive keyboard input.
+ +
SetFocusFromKbd(*args, **kwargs)
SetFocusFromKbd(self)

+Set focus to this window as the result of a keyboard action.  Normally
+only called internally.
+ +
SetFont(*args, **kwargs)
SetFont(self, Font font) -> bool

+Sets the font for this window.
+ +
SetForegroundColour(*args, **kwargs)
SetForegroundColour(self, Colour colour) -> bool

+Sets the foreground colour of the window.  Returns True is the colour
+was changed.  The interpretation of foreground colour is dependent on
+the window class; it may be the text colour or other colour, or it may
+not be used at all.
+ +
SetHelpText(*args, **kwargs)
SetHelpText(self, String text)

+Sets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
SetHelpTextForId(*args, **kwargs)
SetHelpTextForId(self, String text)

+Associate this help text with all windows with the same id as this
+one.
+ +
SetId(*args, **kwargs)
SetId(self, int winid)

+Sets the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one, an identifier
+will be generated. Normally, the identifier should be provided on
+creation and should not be modified subsequently.
+ +
SetInitialSize(*args, **kwargs)
SetInitialSize(self, Size size=DefaultSize)

+A 'Smart' SetSize that will fill in default size components with the
+window's *best size* values.  Also set's the minsize for use with sizers.
+ +
SetLabel(*args, **kwargs)
SetLabel(self, String label)

+Set the text which the window shows in its label if applicable.
+ +
SetLayoutDirection(*args, **kwargs)
SetLayoutDirection(self, int dir)

+Set the layout direction (LTR or RTL) for this window.
+ +
SetMaxSize(*args, **kwargs)
SetMaxSize(self, Size maxSize)

+A more convenient method than `SetSizeHints` for setting just the
+max size.
+ +
SetMinSize(*args, **kwargs)
SetMinSize(self, Size minSize)

+A more convenient method than `SetSizeHints` for setting just the
+min size.
+ +
SetName(*args, **kwargs)
SetName(self, String name)

+Sets the window's name.  The window name is used for ressource setting
+in X, it is not the same as the window title/label
+ +
SetOwnBackgroundColour(*args, **kwargs)
SetOwnBackgroundColour(self, Colour colour)
+ +
SetOwnFont(*args, **kwargs)
SetOwnFont(self, Font font)
+ +
SetOwnForegroundColour(*args, **kwargs)
SetOwnForegroundColour(self, Colour colour)
+ +
SetPosition = Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
SetRect(*args, **kwargs)
SetRect(self, Rect rect, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels using a wx.Rect.
+ +
SetScrollPos(*args, **kwargs)
SetScrollPos(self, int orientation, int pos, bool refresh=True)

+Sets the position of one of the built-in scrollbars.
+ +
SetScrollbar(*args, **kwargs)
SetScrollbar(self, int orientation, int position, int thumbSize, int range, 
+    bool refresh=True)

+Sets the scrollbar properties of a built-in scrollbar.
+ +
SetSize(*args, **kwargs)
SetSize(self, Size size)

+Sets the size of the window in pixels.
+ +
SetSizeHints(*args, **kwargs)
SetSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1, int incW=-1, 
+    int incH=-1)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeHintsSz(*args, **kwargs)
SetSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize, Size incSize=DefaultSize)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeWH(*args, **kwargs)
SetSizeWH(self, int width, int height)

+Sets the size of the window in pixels.
+ +
SetSizer(*args, **kwargs)
SetSizer(self, Sizer sizer, bool deleteOld=True)

+Sets the window to have the given layout sizer. The window will then
+own the object, and will take care of its deletion. If an existing
+layout sizer object is already owned by the window, it will be deleted
+if the deleteOld parameter is true. Note that this function will also
+call SetAutoLayout implicitly with a True parameter if the sizer is
+non-None, and False otherwise.
+ +
SetSizerAndFit(*args, **kwargs)
SetSizerAndFit(self, Sizer sizer, bool deleteOld=True)

+The same as SetSizer, except it also sets the size hints for the
+window based on the sizer's minimum size.
+ +
SetThemeEnabled(*args, **kwargs)
SetThemeEnabled(self, bool enableTheme)

+This function tells a window if it should use the system's "theme"
+ code to draw the windows' background instead if its own background
+ drawing code. This will only have an effect on platforms that support
+ the notion of themes in user defined windows. One such platform is
+ GTK+ where windows can have (very colourful) backgrounds defined by a
+ user's selected theme.

+Dialogs, notebook pages and the status bar have this flag set to true
+by default so that the default look and feel is simulated best.
+ +
SetToolTip(*args, **kwargs)
SetToolTip(self, ToolTip tip)

+Attach a tooltip to the window.
+ +
SetToolTipString(*args, **kwargs)
SetToolTipString(self, String tip)

+Attach a tooltip to the window.
+ +
SetTransparent(*args, **kwargs)
SetTransparent(self, byte alpha) -> bool

+Attempt to set the transparency of this window to the ``alpha`` value,
+returns True on success.  The ``alpha`` value is an integer in the
+range of 0 to 255, where 0 is fully transparent and 255 is fully
+opaque.
+ +
SetValidator(*args, **kwargs)
SetValidator(self, Validator validator)

+Deletes the current validator (if any) and sets the window validator,
+having called wx.Validator.Clone to create a new validator of this
+type.
+ +
SetVirtualSize(*args, **kwargs)
SetVirtualSize(self, Size size)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetVirtualSizeHints(*args, **kwargs)
SetVirtualSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeHintsSz(*args, **kwargs)
SetVirtualSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeWH(*args, **kwargs)
SetVirtualSizeWH(self, int w, int h)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetWindowStyle = SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowVariant(*args, **kwargs)
SetWindowVariant(self, int variant)

+Sets the variant of the window/font size to use for this window, if
+the platform supports variants, for example, wxMac.
+ +
ShouldInheritColours(*args, **kwargs)
ShouldInheritColours(self) -> bool

+Return true from here to allow the colours of this window to be
+changed by InheritAttributes, returning false forbids inheriting them
+from the parent window.

+The base class version returns false, but this method is overridden in
+wxControl where it returns true.
+ +
Show(*args, **kwargs)
Show(self, bool show=True) -> bool

+Shows or hides the window. You may need to call Raise for a top level
+window if you want to bring it to top, although this is not needed if
+Show is called immediately after the frame creation.  Returns True if
+the window has been shown or hidden or False if nothing was done
+because it already was in the requested state.
+ +
Thaw(*args, **kwargs)
Thaw(self)

+Reenables window updating after a previous call to Freeze.  Calls to
+Freeze/Thaw may be nested, so Thaw must be called the same number of
+times that Freeze was before the window will be updated.
+ +
ToggleWindowStyle(*args, **kwargs)
ToggleWindowStyle(self, int flag) -> bool

+Turn the flag on if it had been turned off before and vice versa,
+returns True if the flag is turned on by this function call.
+ +
TransferDataFromWindow(*args, **kwargs)
TransferDataFromWindow(self) -> bool

+Transfers values from child controls to data areas specified by their
+validators. Returns false if a transfer failed.  If the window has
+wx.WS_EX_VALIDATE_RECURSIVELY extra style flag set, the method will
+also call TransferDataFromWindow() of all child windows.
+ +
TransferDataToWindow(*args, **kwargs)
TransferDataToWindow(self) -> bool

+Transfers values to child controls from data areas specified by their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call TransferDataToWindow() of
+all child windows.
+ +
UnregisterHotKey(*args, **kwargs)
UnregisterHotKey(self, int hotkeyId) -> bool

+Unregisters a system wide hotkey.
+ +
Update(*args, **kwargs)
Update(self)

+Calling this method immediately repaints the invalidated area of the
+window instead of waiting for the EVT_PAINT event to happen, (normally
+this would usually only happen when the flow of control returns to the
+event loop.)  Notice that this function doesn't refresh the window and
+does nothing if the window has been already repainted.  Use `Refresh`
+first if you want to immediately redraw the window (or some portion of
+it) unconditionally.
+ +
UpdateWindowUI(*args, **kwargs)
UpdateWindowUI(self, long flags=UPDATE_UI_NONE)

+This function sends EVT_UPDATE_UI events to the window. The particular
+implementation depends on the window; for example a wx.ToolBar will
+send an update UI event for each toolbar button, and a wx.Frame will
+send an update UI event for each menubar menu item. You can call this
+function from your application to ensure that your UI is up-to-date at
+a particular point in time (as far as your EVT_UPDATE_UI handlers are
+concerned). This may be necessary if you have called
+`wx.UpdateUIEvent.SetMode` or `wx.UpdateUIEvent.SetUpdateInterval` to
+limit the overhead that wxWindows incurs by sending update UI events
+in idle time.
+ +
UseBgCol(*args, **kwargs)
UseBgCol(self) -> bool
+ +
Validate(*args, **kwargs)
Validate(self) -> bool

+Validates the current values of the child controls using their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call Validate() of all child
+windows.  Returns false if any of the validations failed.
+ +
WarpPointer(*args, **kwargs)
WarpPointer(self, int x, int y)

+Moves the pointer to the given position on the window.

+NOTE: This function is not supported under Mac because Apple Human
+Interface Guidelines forbid moving the mouse cursor programmatically.
+ +
+Static methods inherited from wx._core.Window:
+
FindFocus(*args, **kwargs)
FindFocus() -> Window

+Returns the window or control that currently has the keyboard focus,
+or None.
+ +
GetCapture(*args, **kwargs)
GetCapture() -> Window

+Returns the window which currently captures the mouse or None
+ +
NewControlId(*args, **kwargs)
NewControlId() -> int

+Generate a control id for the controls which were not given one.
+ +
NextControlId(*args, **kwargs)
NextControlId(int winid) -> int

+Get the id of the control following the one with the given
+autogenerated) id
+ +
PrevControlId(*args, **kwargs)
PrevControlId(int winid) -> int

+Get the id of the control preceding the one with the given
+autogenerated) id
+ +
+Data descriptors inherited from wx._core.Window:
+
AcceleratorTable
+
See `GetAcceleratorTable` and `SetAcceleratorTable`
+
+
AutoLayout
+
See `GetAutoLayout` and `SetAutoLayout`
+
+
BackgroundColour
+
See `GetBackgroundColour` and `SetBackgroundColour`
+
+
BackgroundStyle
+
See `GetBackgroundStyle` and `SetBackgroundStyle`
+
+
BestSize
+
See `GetBestSize`
+
+
BestVirtualSize
+
See `GetBestVirtualSize`
+
+
Border
+
See `GetBorder`
+
+
Caret
+
See `GetCaret` and `SetCaret`
+
+
CharHeight
+
See `GetCharHeight`
+
+
CharWidth
+
See `GetCharWidth`
+
+
Children
+
See `GetChildren`
+
+
ClientAreaOrigin
+
See `GetClientAreaOrigin`
+
+
ClientRect
+
See `GetClientRect` and `SetClientRect`
+
+
ClientSize
+
See `GetClientSize` and `SetClientSize`
+
+
Constraints
+
See `GetConstraints` and `SetConstraints`
+
+
ContainingSizer
+
See `GetContainingSizer` and `SetContainingSizer`
+
+
Cursor
+
See `GetCursor` and `SetCursor`
+
+
DefaultAttributes
+
See `GetDefaultAttributes`
+
+
DropTarget
+
See `GetDropTarget` and `SetDropTarget`
+
+
EffectiveMinSize
+
See `GetEffectiveMinSize`
+
+
Enabled
+
See `IsEnabled` and `Enable`
+
+
EventHandler
+
See `GetEventHandler` and `SetEventHandler`
+
+
ExtraStyle
+
See `GetExtraStyle` and `SetExtraStyle`
+
+
Font
+
See `GetFont` and `SetFont`
+
+
ForegroundColour
+
See `GetForegroundColour` and `SetForegroundColour`
+
+
GrandParent
+
See `GetGrandParent`
+
+
GtkWidget
+
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+
+
Handle
+
See `GetHandle`
+
+
HelpText
+
See `GetHelpText` and `SetHelpText`
+
+
Id
+
See `GetId` and `SetId`
+
+
Label
+
See `GetLabel` and `SetLabel`
+
+
LayoutDirection
+
See `GetLayoutDirection` and `SetLayoutDirection`
+
+
MaxHeight
+
See `GetMaxHeight`
+
+
MaxSize
+
See `GetMaxSize` and `SetMaxSize`
+
+
MaxWidth
+
See `GetMaxWidth`
+
+
MinHeight
+
See `GetMinHeight`
+
+
MinSize
+
See `GetMinSize` and `SetMinSize`
+
+
MinWidth
+
See `GetMinWidth`
+
+
Name
+
See `GetName` and `SetName`
+
+
Parent
+
See `GetParent`
+
+
Position
+
See `GetPosition` and `SetPosition`
+
+
Rect
+
See `GetRect` and `SetRect`
+
+
ScreenPosition
+
See `GetScreenPosition`
+
+
ScreenRect
+
See `GetScreenRect`
+
+
Shown
+
See `IsShown` and `Show`
+
+
Size
+
See `GetSize` and `SetSize`
+
+
Sizer
+
See `GetSizer` and `SetSizer`
+
+
ThemeEnabled
+
See `GetThemeEnabled` and `SetThemeEnabled`
+
+
ToolTip
+
See `GetToolTip` and `SetToolTip`
+
+
TopLevel
+
See `IsTopLevel`
+
+
TopLevelParent
+
See `GetTopLevelParent`
+
+
UpdateClientRect
+
See `GetUpdateClientRect`
+
+
UpdateRegion
+
See `GetUpdateRegion`
+
+
Validator
+
See `GetValidator` and `SetValidator`
+
+
VirtualSize
+
See `GetVirtualSize` and `SetVirtualSize`
+
+
WindowStyle
+
See `GetWindowStyle` and `SetWindowStyle`
+
+
WindowStyleFlag
+
See `GetWindowStyleFlag` and `SetWindowStyleFlag`
+
+
WindowVariant
+
See `GetWindowVariant` and `SetWindowVariant`
+
+
+Methods inherited from wx._core.EvtHandler:
+
AddPendingEvent(*args, **kwargs)
AddPendingEvent(self, Event event)
+ +
Bind(self, event, handler, source=None, id=-1, id2=-1)
Bind an event to an event handler.

+:param event: One of the EVT_* objects that specifies the
+              type of event to bind,

+:param handler: A callable object to be invoked when the
+              event is delivered to self.  Pass None to
+              disconnect an event handler.

+:param source: Sometimes the event originates from a
+              different window than self, but you still
+              want to catch it in self.  (For example, a
+              button event delivered to a frame.)  By
+              passing the source of the event, the event
+              handling system is able to differentiate
+              between the same event type from different
+              controls.

+:param id: Used to spcify the event source by ID instead
+           of instance.

+:param id2: Used when it is desirable to bind a handler
+              to a range of IDs, such as with EVT_MENU_RANGE.
+ +
Connect(*args, **kwargs)
Connect(self, int id, int lastId, int eventType, PyObject func)
+ +
Disconnect(*args, **kwargs)
Disconnect(self, int id, int lastId=-1, EventType eventType=wxEVT_NULL) -> bool
+ +
GetEvtHandlerEnabled(*args, **kwargs)
GetEvtHandlerEnabled(self) -> bool
+ +
GetNextHandler(*args, **kwargs)
GetNextHandler(self) -> EvtHandler
+ +
GetPreviousHandler(*args, **kwargs)
GetPreviousHandler(self) -> EvtHandler
+ +
ProcessEvent(*args, **kwargs)
ProcessEvent(self, Event event) -> bool
+ +
ProcessPendingEvents(*args, **kwargs)
ProcessPendingEvents(self)
+ +
SetEvtHandlerEnabled(*args, **kwargs)
SetEvtHandlerEnabled(self, bool enabled)
+ +
SetNextHandler(*args, **kwargs)
SetNextHandler(self, EvtHandler handler)
+ +
SetPreviousHandler(*args, **kwargs)
SetPreviousHandler(self, EvtHandler handler)
+ +
Unbind(self, event, source=None, id=-1, id2=-1)
Disconencts the event handler binding for event from self.
+Returns True if successful.
+ +
+Data descriptors inherited from wx._core.EvtHandler:
+
EvtHandlerEnabled
+
See `GetEvtHandlerEnabled` and `SetEvtHandlerEnabled`
+
+
NextHandler
+
See `GetNextHandler` and `SetNextHandler`
+
+
PreviousHandler
+
See `GetPreviousHandler` and `SetPreviousHandler`
+
+
+Methods inherited from wx._core.Object:
+
GetClassName(*args, **kwargs)
GetClassName(self) -> String

+Returns the class name of the C++ class using wxRTTI.
+ +
IsSameAs(*args, **kwargs)
IsSameAs(self, Object p) -> bool

+For wx.Objects that use C++ reference counting internally, this method
+can be used to determine if two objects are referencing the same data
+object.
+ +
+Data descriptors inherited from wx._core.Object:
+
ClassName
+
See `GetClassName`
+
+
__dict__
+
dictionary for instance variables (if defined)
+
+
__weakref__
+
list of weak references to the object (if defined)
+
+

+ + + + + +
 
+Data
       wxID_XYPAIR = 113
+wxID_XYPAIRLBLMOTOR = 114
+wxID_XYPAIRLBLREADBACK = 115
+wxID_XYPAIRLBLTARGET = 116
+wxID_XYPAIRLBL_X_TITLE = 117
+wxID_XYPAIRLBL_Y_TITLE = 118
+wxID_XYPAIRSTOP = 119
+wxID_XYPAIRTABLE = 120
+wxID_XYPAIRTITLE = 121
+wxID_XYPAIRX_RBV = 122
+wxID_XYPAIRX_VAL = 123
+wxID_XYPAIRY_RBV = 124
+wxID_XYPAIRY_VAL = 125
+ \ No newline at end of file diff --git a/pydoc/wxmtxy_pvsetup.html b/pydoc/wxmtxy_pvsetup.html new file mode 100644 index 0000000..be645a9 --- /dev/null +++ b/pydoc/wxmtxy_pvsetup.html @@ -0,0 +1,1967 @@ + + +Python: module wxmtxy_pvsetup + + + + +
 
+ 
wxmtxy_pvsetup
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy_pvsetup.py
+

Provides Python Class: PvDialog
+   Dialog to configure the EPICS PVs for an X,Y pair

+@version: 
+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_pvsetup.py $
+# $Id: wxmtxy_pvsetup.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+

+ + + + + +
 
+Modules
       
inspect
+os
+
pprint
+pvConnect
+
wx
+wxmtxy_axis
+

+ + + + + +
 
+Classes
       
+
wx._windows.Dialog(wx._windows.TopLevelWindow) +
+
+
PvDialog +
+
+
+

+ + + + + + + +
 
+class PvDialog(wx._windows.Dialog)
   Dialog to configure the EPICS PVs for an X,Y pair

+This code also checks to see if the PV names entered are valid.
+User is expected to press the [enter] key to submit a PV name 
+for validation.  Background of text entry box will turn green 
+to signify that the chosen PV name is valid (has been found).
+The background will be pink for invalid PV strings.
+The background will be grey for PV standard fields in motor records.
 
 
Method resolution order:
+
PvDialog
+
wx._windows.Dialog
+
wx._windows.TopLevelWindow
+
wx._core.Window
+
wx._core.EvtHandler
+
wx._core.Object
+
__builtin__.object
+
+
+Methods defined here:
+
GetConfiguration(self)
@return Python dictionary containing the PV info for X & Y axes
+ +
OnButton_cancelButton(self, event)
Handler for the cancel button.
+The default behavior will handle all that is needed here.

+There is no chance to restore the original 
+configuration before the dialog returns.  The calling 
+routine must determine if the result was wx.ID_OK
+before calling dlg.GetConfiguration().

+@param event: wxPython event object
+ +
OnButton_clear_x_Button(self, event)
clear all the fields on the X axis
+@param event: wxPython event object
+ +
OnButton_clear_y_Button(self, event)
clear all the fields on the Y axis
+@param event: wxPython event object
+ +
OnButton_okButton(self, event)
Handler for the cancel button.
+The default behavior will handle all that is needed here.

+@param event: wxPython event object
+ +
OnButton_revertButton(self, event)
reset all the fields on both axes to original values
+@param event: wxPython event object
+ +
OnPv_x_descTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_x_dmovTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_x_eguTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_x_rbvTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_x_stopTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_x_valTextEnter(self, event)
set background color and 'isMotorRec' checkbox for X axis
+@param event: wxPython event object
+ +
OnPv_y_descTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_y_dmovTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_y_eguTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_y_rbvTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_y_stopTextEnter(self, event)
set background color
+@param event: wxPython event object
+ +
OnPv_y_valTextEnter(self, event)
set background color and 'isMotorRec' checkbox for Y axis
+@param event: wxPython event object
+ +
SetColor(self, axis, field)
change the background color on the given widgets
+@param axis: [string] "x" or "y"
+@param field: [string] member of wxmtxy_axis.field_list
+ +
SetConfiguration(self, config)
Set the configuration of the widgets.
+@param config: Python dictionary containing the PV info for X & Y axes
+ +
__init__(self, parent, original_config)
establish the dialog box
+@param parent: widget that owns this class
+@param original_config: Python dictionary with axes configurations
+ +
__init_names__(self)
conversion table of widget names

+Create a dictionary of names for the widgets by axis.
+This should simplify addressing these widgets internally.
+ +
+Methods inherited from wx._windows.Dialog:
+
Create(*args, **kwargs)
Create(self, Window parent, int id=-1, String title=EmptyString, 
+    Point pos=DefaultPosition, Size size=DefaultSize, 
+    long style=DEFAULT_DIALOG_STYLE, String name=DialogNameStr) -> bool
+ +
CreateButtonSizer(self, flags, *ignored)
+ +
CreateSeparatedButtonSizer(*args, **kwargs)
CreateSeparatedButtonSizer(self, long flags) -> Sizer
+ +
CreateStdDialogButtonSizer(*args, **kwargs)
CreateStdDialogButtonSizer(self, long flags) -> StdDialogButtonSizer
+ +
CreateTextSizer(*args, **kwargs)
CreateTextSizer(self, String message) -> Sizer
+ +
EndModal(*args, **kwargs)
EndModal(self, int retCode)
+ +
GetAffirmativeId(*args, **kwargs)
GetAffirmativeId(self) -> int
+ +
GetEscapeId(*args, **kwargs)
GetEscapeId(self) -> int
+ +
GetReturnCode(*args, **kwargs)
GetReturnCode(self) -> int
+ +
IsModal(*args, **kwargs)
IsModal(self) -> bool
+ +
SetAffirmativeId(*args, **kwargs)
SetAffirmativeId(self, int affirmativeId)
+ +
SetEscapeId(*args, **kwargs)
SetEscapeId(self, int escapeId)
+ +
SetReturnCode(*args, **kwargs)
SetReturnCode(self, int returnCode)
+ +
ShowModal(*args, **kwargs)
ShowModal(self) -> int
+ +
__repr__ = _swig_repr(self)
+ +
+Static methods inherited from wx._windows.Dialog:
+
GetClassDefaultAttributes(*args, **kwargs)
GetClassDefaultAttributes(int variant=WINDOW_VARIANT_NORMAL) -> VisualAttributes

+Get the default attributes for this class.  This is useful if you want
+to use the same font or colour in your own control as in a standard
+control -- which is a much better idea than hard coding specific
+colours or fonts which might look completely out of place on the
+user's system, especially if it uses themes.

+The variant parameter is only relevant under Mac currently and is
+ignore under other platforms. Under Mac, it will change the size of
+the returned font. See `wx.Window.SetWindowVariant` for more about
+this.
+ +
+Data descriptors inherited from wx._windows.Dialog:
+
AffirmativeId
+
See `GetAffirmativeId` and `SetAffirmativeId`
+
+
EscapeId
+
See `GetEscapeId` and `SetEscapeId`
+
+
ReturnCode
+
See `GetReturnCode` and `SetReturnCode`
+
+
thisown
+
The membership flag
+
+
+Data and other attributes inherited from wx._windows.Dialog:
+
ButtonSizerFlags = 32926
+ +
+Methods inherited from wx._windows.TopLevelWindow:
+
CenterOnScreen(*args, **kwargs)
CenterOnScreen(self, int dir=BOTH)

+Center the window on screen
+ +
CentreOnScreen = CenterOnScreen(*args, **kwargs)
CenterOnScreen(self, int dir=BOTH)

+Center the window on screen
+ +
EnableCloseButton(*args, **kwargs)
EnableCloseButton(self, bool enable) -> bool
+ +
GetDefaultItem(*args, **kwargs)
GetDefaultItem(self) -> Window

+Get the default child of this parent, i.e. the one which is activated
+by pressing <Enter> such as the OK button on a wx.Dialog.
+ +
GetIcon(*args, **kwargs)
GetIcon(self) -> Icon
+ +
GetTitle(*args, **kwargs)
GetTitle(self) -> String
+ +
GetTmpDefaultItem(*args, **kwargs)
GetTmpDefaultItem(self) -> Window

+Return the temporary default item, which can be None.
+ +
Iconize(*args, **kwargs)
Iconize(self, bool iconize=True)
+ +
IsActive(*args, **kwargs)
IsActive(self) -> bool
+ +
IsAlwaysMaximized(*args, **kwargs)
IsAlwaysMaximized(self) -> bool
+ +
IsFullScreen(*args, **kwargs)
IsFullScreen(self) -> bool
+ +
IsIconized(*args, **kwargs)
IsIconized(self) -> bool
+ +
IsMaximized(*args, **kwargs)
IsMaximized(self) -> bool
+ +
MacGetMetalAppearance(*args, **kwargs)
MacGetMetalAppearance(self) -> bool
+ +
MacGetUnifiedAppearance(*args, **kwargs)
MacGetUnifiedAppearance(self) -> bool
+ +
MacSetMetalAppearance(*args, **kwargs)
MacSetMetalAppearance(self, bool on)
+ +
Maximize(*args, **kwargs)
Maximize(self, bool maximize=True)
+ +
RequestUserAttention(*args, **kwargs)
RequestUserAttention(self, int flags=USER_ATTENTION_INFO)
+ +
Restore(*args, **kwargs)
Restore(self)
+ +
SetDefaultItem(*args, **kwargs)
SetDefaultItem(self, Window child) -> Window

+Set this child as default, return the old default.
+ +
SetIcon(*args, **kwargs)
SetIcon(self, Icon icon)
+ +
SetIcons(*args, **kwargs)
SetIcons(self, wxIconBundle icons)
+ +
SetShape(*args, **kwargs)
SetShape(self, Region region) -> bool
+ +
SetTitle(*args, **kwargs)
SetTitle(self, String title)
+ +
SetTmpDefaultItem(*args, **kwargs)
SetTmpDefaultItem(self, Window win)

+Set this child as temporary default
+ +
ShowFullScreen(*args, **kwargs)
ShowFullScreen(self, bool show, long style=FULLSCREEN_ALL) -> bool
+ +
+Data descriptors inherited from wx._windows.TopLevelWindow:
+
DefaultItem
+
See `GetDefaultItem` and `SetDefaultItem`
+
+
Icon
+
See `GetIcon` and `SetIcon`
+
+
Title
+
See `GetTitle` and `SetTitle`
+
+
TmpDefaultItem
+
See `GetTmpDefaultItem` and `SetTmpDefaultItem`
+
+
+Methods inherited from wx._core.Window:
+
AcceptsFocus(*args, **kwargs)
AcceptsFocus(self) -> bool

+Can this window have focus?
+ +
AcceptsFocusFromKeyboard(*args, **kwargs)
AcceptsFocusFromKeyboard(self) -> bool

+Can this window be given focus by keyboard navigation? if not, the
+only way to give it focus (provided it accepts it at all) is to click
+it.
+ +
AddChild(*args, **kwargs)
AddChild(self, Window child)

+Adds a child window. This is called automatically by window creation
+functions so should not be required by the application programmer.
+ +
AdjustForLayoutDirection(*args, **kwargs)
AdjustForLayoutDirection(self, int x, int width, int widthTotal) -> int

+Mirror coordinates for RTL layout if this window uses it and if the
+mirroring is not done automatically like Win32.
+ +
AssociateHandle(*args, **kwargs)
AssociateHandle(self, long handle)

+Associate the window with a new native handle
+ +
CacheBestSize(*args, **kwargs)
CacheBestSize(self, Size size)

+Cache the best size so it doesn't need to be calculated again, (at least until
+some properties of the window change.)
+ +
CanSetTransparent(*args, **kwargs)
CanSetTransparent(self) -> bool

+Returns ``True`` if the platform supports setting the transparency for
+this window.  Note that this method will err on the side of caution,
+so it is possible that this will return ``False`` when it is in fact
+possible to set the transparency.

+NOTE: On X-windows systems the X server must have the composite
+extension loaded, and there must be a composite manager program (such
+as xcompmgr) running.
+ +
CaptureMouse(*args, **kwargs)
CaptureMouse(self)

+Directs all mouse input to this window. Call wx.Window.ReleaseMouse to
+release the capture.

+Note that wxWindows maintains the stack of windows having captured the
+mouse and when the mouse is released the capture returns to the window
+which had had captured it previously and it is only really released if
+there were no previous window. In particular, this means that you must
+release the mouse as many times as you capture it, unless the window
+receives the `wx.MouseCaptureLostEvent` event.

+Any application which captures the mouse in the beginning of some
+operation *must* handle `wx.MouseCaptureLostEvent` and cancel this
+operation when it receives the event. The event handler must not
+recapture mouse.
+ +
Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
Centre = Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CentreOnParent = CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
ClearBackground(*args, **kwargs)
ClearBackground(self)

+Clears the window by filling it with the current background
+colour. Does not cause an erase background event to be generated.
+ +
ClientToScreen(*args, **kwargs)
ClientToScreen(self, Point pt) -> Point

+Converts to screen coordinates from coordinates relative to this window.
+ +
ClientToScreenXY(*args, **kwargs)
ClientToScreenXY(int x, int y) -> (x,y)

+Converts to screen coordinates from coordinates relative to this window.
+ +
Close(*args, **kwargs)
Close(self, bool force=False) -> bool

+This function simply generates a EVT_CLOSE event whose handler usually
+tries to close the window. It doesn't close the window itself,
+however.  If force is False (the default) then the window's close
+handler will be allowed to veto the destruction of the window.
+ +
ConvertDialogPointToPixels(*args, **kwargs)
ConvertDialogPointToPixels(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertDialogSizeToPixels(*args, **kwargs)
ConvertDialogSizeToPixels(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertPixelPointToDialog(*args, **kwargs)
ConvertPixelPointToDialog(self, Point pt) -> Point
+ +
ConvertPixelSizeToDialog(*args, **kwargs)
ConvertPixelSizeToDialog(self, Size sz) -> Size
+ +
DLG_PNT(*args, **kwargs)
DLG_PNT(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
DLG_SZE(*args, **kwargs)
DLG_SZE(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
Destroy(*args, **kwargs)
Destroy(self) -> bool

+Destroys the window safely.  Frames and dialogs are not destroyed
+immediately when this function is called -- they are added to a list
+of windows to be deleted on idle time, when all the window's events
+have been processed. This prevents problems with events being sent to
+non-existent windows.

+Returns True if the window has either been successfully deleted, or it
+has been added to the list of windows pending real deletion.
+ +
DestroyChildren(*args, **kwargs)
DestroyChildren(self) -> bool

+Destroys all children of a window. Called automatically by the
+destructor.
+ +
Disable(*args, **kwargs)
Disable(self) -> bool

+Disables the window, same as Enable(false).
+ +
DissociateHandle(*args, **kwargs)
DissociateHandle(self)

+Dissociate the current native handle from the window
+ +
DragAcceptFiles(*args, **kwargs)
DragAcceptFiles(self, bool accept)

+Enables or disables eligibility for drop file events, EVT_DROP_FILES.
+Only functional on Windows.
+ +
Enable(*args, **kwargs)
Enable(self, bool enable=True) -> bool

+Enable or disable the window for user input. Note that when a parent
+window is disabled, all of its children are disabled as well and they
+are reenabled again when the parent is.  Returns true if the window
+has been enabled or disabled, false if nothing was done, i.e. if the
+window had already been in the specified state.
+ +
FindWindowById(*args, **kwargs)
FindWindowById(self, long winid) -> Window

+Find a child of this window by window ID
+ +
FindWindowByName(*args, **kwargs)
FindWindowByName(self, String name) -> Window

+Find a child of this window by name
+ +
Fit(*args, **kwargs)
Fit(self)

+Sizes the window so that it fits around its subwindows. This function
+won't do anything if there are no subwindows and will only really work
+correctly if sizers are used for the subwindows layout. Also, if the
+window has exactly one subwindow it is better (faster and the result
+is more precise as Fit adds some margin to account for fuzziness of
+its calculations) to call window.SetClientSize(child.GetSize())
+instead of calling Fit.
+ +
FitInside(*args, **kwargs)
FitInside(self)

+Similar to Fit, but sizes the interior (virtual) size of a
+window. Mainly useful with scrolled windows to reset scrollbars after
+sizing changes that do not trigger a size event, and/or scrolled
+windows without an interior sizer. This function similarly won't do
+anything if there are no subwindows.
+ +
Freeze(*args, **kwargs)
Freeze(self)

+Freezes the window or, in other words, prevents any updates from
+taking place on screen, the window is not redrawn at all. Thaw must be
+called to reenable window redrawing.  Calls to Freeze/Thaw may be
+nested, with the actual Thaw being delayed until all the nesting has
+been undone.

+This method is useful for visual appearance optimization (for example,
+it is a good idea to use it before inserting large amount of text into
+a wxTextCtrl under wxGTK) but is not implemented on all platforms nor
+for all controls so it is mostly just a hint to wxWindows and not a
+mandatory directive.
+ +
GetAcceleratorTable(*args, **kwargs)
GetAcceleratorTable(self) -> AcceleratorTable

+Gets the accelerator table for this window.
+ +
GetAdjustedBestSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetAutoLayout(*args, **kwargs)
GetAutoLayout(self) -> bool

+Returns the current autoLayout setting
+ +
GetBackgroundColour(*args, **kwargs)
GetBackgroundColour(self) -> Colour

+Returns the background colour of the window.
+ +
GetBackgroundStyle(*args, **kwargs)
GetBackgroundStyle(self) -> int

+Returns the background style of the window.

+:see: `SetBackgroundStyle`
+ +
GetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetBestSize(*args, **kwargs)
GetBestSize(self) -> Size

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestSizeTuple(*args, **kwargs)
GetBestSizeTuple() -> (width, height)

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestVirtualSize(*args, **kwargs)
GetBestVirtualSize(self) -> Size

+Return the largest of ClientSize and BestSize (as determined by a
+sizer, interior children, or other means)
+ +
GetBorder(*args)
GetBorder(self, long flags) -> int
+GetBorder(self) -> int

+Get border for the flags of this window
+ +
GetCaret(*args, **kwargs)
GetCaret(self) -> Caret

+Returns the caret associated with the window.
+ +
GetCharHeight(*args, **kwargs)
GetCharHeight(self) -> int

+Get the (average) character size for the current font.
+ +
GetCharWidth(*args, **kwargs)
GetCharWidth(self) -> int

+Get the (average) character size for the current font.
+ +
GetChildren(*args, **kwargs)
GetChildren(self) -> WindowList

+Returns an object containing a list of the window's children.  The
+object provides a Python sequence-like interface over the internal
+list maintained by the window..
+ +
GetClientAreaOrigin(*args, **kwargs)
GetClientAreaOrigin(self) -> Point

+Get the origin of the client area of the window relative to the
+window's top left corner (the client area may be shifted because of
+the borders, scrollbars, other decorations...)
+ +
GetClientRect(*args, **kwargs)
GetClientRect(self) -> Rect

+Get the client area position and size as a `wx.Rect` object.
+ +
GetClientSize(*args, **kwargs)
GetClientSize(self) -> Size

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetClientSizeTuple(*args, **kwargs)
GetClientSizeTuple() -> (width, height)

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetConstraints(*args, **kwargs)
GetConstraints(self) -> LayoutConstraints

+Returns a pointer to the window's layout constraints, or None if there
+are none.
+ +
GetContainingSizer(*args, **kwargs)
GetContainingSizer(self) -> Sizer

+Return the sizer that this window is a member of, if any, otherwise None.
+ +
GetCursor(*args, **kwargs)
GetCursor(self) -> Cursor

+Return the cursor associated with this window.
+ +
GetDefaultAttributes(*args, **kwargs)
GetDefaultAttributes(self) -> VisualAttributes

+Get the default attributes for an instance of this class.  This is
+useful if you want to use the same font or colour in your own control
+as in a standard control -- which is a much better idea than hard
+coding specific colours or fonts which might look completely out of
+place on the user's system, especially if it uses themes.
+ +
GetDropTarget(*args, **kwargs)
GetDropTarget(self) -> DropTarget

+Returns the associated drop target, which may be None.
+ +
GetEffectiveMinSize(*args, **kwargs)
GetEffectiveMinSize(self) -> Size

+This function will merge the window's best size into the window's
+minimum size, giving priority to the min size components, and returns
+the results.
+ +
GetEventHandler(*args, **kwargs)
GetEventHandler(self) -> EvtHandler

+Returns the event handler for this window. By default, the window is
+its own event handler.
+ +
GetExtraStyle(*args, **kwargs)
GetExtraStyle(self) -> long

+Returns the extra style bits for the window.
+ +
GetFont(*args, **kwargs)
GetFont(self) -> Font

+Returns the default font used for this window.
+ +
GetForegroundColour(*args, **kwargs)
GetForegroundColour(self) -> Colour

+Returns the foreground colour of the window.  The interpretation of
+foreground colour is dependent on the window class; it may be the text
+colour or other colour, or it may not be used at all.
+ +
GetFullTextExtent(*args, **kwargs)
GetFullTextExtent(String string, Font font=None) ->
+   (width, height, descent, externalLeading)

+Get the width, height, decent and leading of the text using the
+current or specified font.
+ +
GetGrandParent(*args, **kwargs)
GetGrandParent(self) -> Window

+Returns the parent of the parent of this window, or None if there
+isn't one.
+ +
GetGtkWidget(*args, **kwargs)
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+ +
GetHandle(*args, **kwargs)
GetHandle(self) -> long

+Returns the platform-specific handle (as a long integer) of the
+physical window.  On wxMSW this is the win32 window handle, on wxGTK
+it is the XWindow ID, and on wxMac it is the ControlRef.
+ +
GetHelpText(*args, **kwargs)
GetHelpText(self) -> String

+Gets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
GetHelpTextAtPoint(*args, **kwargs)
GetHelpTextAtPoint(self, Point pt, wxHelpEvent::Origin origin) -> String

+Get the help string associated with the given position in this window.

+Notice that pt may be invalid if event origin is keyboard or unknown
+and this method should return the global window help text then
+ +
GetId(*args, **kwargs)
GetId(self) -> int

+Returns the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one (or the default Id
+-1 is used) then an unique identifier with a negative value will be
+generated.
+ +
GetLabel(*args, **kwargs)
GetLabel(self) -> String

+Generic way of getting a label from any window, for identification
+purposes.  The interpretation of this function differs from class to
+class. For frames and dialogs, the value returned is the title. For
+buttons or static text controls, it is the button text. This function
+can be useful for meta-programs such as testing tools or special-needs
+access programs)which need to identify windows by name.
+ +
GetLayoutDirection(*args, **kwargs)
GetLayoutDirection(self) -> int

+Get the layout direction (LTR or RTL) for this window.  Returns
+``wx.Layout_Default`` if layout direction is not supported.
+ +
GetMaxHeight(*args, **kwargs)
GetMaxHeight(self) -> int
+ +
GetMaxSize(*args, **kwargs)
GetMaxSize(self) -> Size
+ +
GetMaxWidth(*args, **kwargs)
GetMaxWidth(self) -> int
+ +
GetMinHeight(*args, **kwargs)
GetMinHeight(self) -> int
+ +
GetMinSize(*args, **kwargs)
GetMinSize(self) -> Size
+ +
GetMinWidth(*args, **kwargs)
GetMinWidth(self) -> int
+ +
GetName(*args, **kwargs)
GetName(self) -> String

+Returns the windows name.  This name is not guaranteed to be unique;
+it is up to the programmer to supply an appropriate name in the window
+constructor or via wx.Window.SetName.
+ +
GetParent(*args, **kwargs)
GetParent(self) -> Window

+Returns the parent window of this window, or None if there isn't one.
+ +
GetPosition(*args, **kwargs)
GetPosition(self) -> Point

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetPositionTuple(*args, **kwargs)
GetPositionTuple() -> (x,y)

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetRect(*args, **kwargs)
GetRect(self) -> Rect

+Returns the size and position of the window as a `wx.Rect` object.
+ +
GetScreenPosition(*args, **kwargs)
GetScreenPosition(self) -> Point

+Get the position of the window in screen coordinantes.
+ +
GetScreenPositionTuple(*args, **kwargs)
GetScreenPositionTuple() -> (x,y)

+Get the position of the window in screen coordinantes.
+ +
GetScreenRect(*args, **kwargs)
GetScreenRect(self) -> Rect

+Returns the size and position of the window in screen coordinantes as
+a `wx.Rect` object.
+ +
GetScrollPos(*args, **kwargs)
GetScrollPos(self, int orientation) -> int

+Returns the built-in scrollbar position.
+ +
GetScrollRange(*args, **kwargs)
GetScrollRange(self, int orientation) -> int

+Returns the built-in scrollbar range.
+ +
GetScrollThumb(*args, **kwargs)
GetScrollThumb(self, int orientation) -> int

+Returns the built-in scrollbar thumb size.
+ +
GetSize(*args, **kwargs)
GetSize(self) -> Size

+Get the window size.
+ +
GetSizeTuple(*args, **kwargs)
GetSizeTuple() -> (width, height)

+Get the window size.
+ +
GetSizer(*args, **kwargs)
GetSizer(self) -> Sizer

+Return the sizer associated with the window by a previous call to
+SetSizer or None if there isn't one.
+ +
GetTextExtent(*args, **kwargs)
GetTextExtent(String string) -> (width, height)

+Get the width and height of the text using the current font.
+ +
GetThemeEnabled(*args, **kwargs)
GetThemeEnabled(self) -> bool

+Return the themeEnabled flag.
+ +
GetToolTip(*args, **kwargs)
GetToolTip(self) -> ToolTip

+get the associated tooltip or None if none
+ +
GetTopLevelParent(*args, **kwargs)
GetTopLevelParent(self) -> Window

+Returns the first frame or dialog in this window's parental hierarchy.
+ +
GetUpdateClientRect(*args, **kwargs)
GetUpdateClientRect(self) -> Rect

+Get the update rectangle region bounding box in client coords.
+ +
GetUpdateRegion(*args, **kwargs)
GetUpdateRegion(self) -> Region

+Returns the region specifying which parts of the window have been
+damaged. Should only be called within an EVT_PAINT handler.
+ +
GetValidator(*args, **kwargs)
GetValidator(self) -> Validator

+Returns a pointer to the current validator for the window, or None if
+there is none.
+ +
GetVirtualSize(*args, **kwargs)
GetVirtualSize(self) -> Size

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetVirtualSizeTuple(*args, **kwargs)
GetVirtualSizeTuple() -> (width, height)

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetWindowBorderSize(*args, **kwargs)
GetWindowBorderSize(self) -> Size

+Return the size of the left/right and top/bottom borders.
+ +
GetWindowStyle = GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowVariant(*args, **kwargs)
GetWindowVariant(self) -> int
+ +
HasCapture(*args, **kwargs)
HasCapture(self) -> bool

+Returns true if this window has the current mouse capture.
+ +
HasFlag(*args, **kwargs)
HasFlag(self, int flag) -> bool

+Test if the given style is set for this window.
+ +
HasMultiplePages(*args, **kwargs)
HasMultiplePages(self) -> bool
+ +
HasScrollbar(*args, **kwargs)
HasScrollbar(self, int orient) -> bool

+Does the window have the scrollbar for this orientation?
+ +
HasTransparentBackground(*args, **kwargs)
HasTransparentBackground(self) -> bool

+Returns True if this window's background is transparent (as, for
+example, for `wx.StaticText`) and should show the parent window's
+background.

+This method is mostly used internally by the library itself and you
+normally shouldn't have to call it. You may, however, have to override
+it in your custom control classes to ensure that background is painted
+correctly.
+ +
Hide(*args, **kwargs)
Hide(self) -> bool

+Equivalent to calling Show(False).
+ +
HitTest(*args, **kwargs)
HitTest(self, Point pt) -> int

+Test where the given (in client coords) point lies
+ +
HitTestXY(*args, **kwargs)
HitTestXY(self, int x, int y) -> int

+Test where the given (in client coords) point lies
+ +
InheritAttributes(*args, **kwargs)
InheritAttributes(self)

+This function is (or should be, in case of custom controls) called
+during window creation to intelligently set up the window visual
+attributes, that is the font and the foreground and background
+colours.

+By 'intelligently' the following is meant: by default, all windows use
+their own default attributes. However if some of the parent's
+attributes are explicitly changed (that is, using SetFont and not
+SetOwnFont) and if the corresponding attribute hadn't been
+explicitly set for this window itself, then this window takes the same
+value as used by the parent. In addition, if the window overrides
+ShouldInheritColours to return false, the colours will not be changed
+no matter what and only the font might.

+This rather complicated logic is necessary in order to accommodate the
+different usage scenarios. The most common one is when all default
+attributes are used and in this case, nothing should be inherited as
+in modern GUIs different controls use different fonts (and colours)
+than their siblings so they can't inherit the same value from the
+parent. However it was also deemed desirable to allow to simply change
+the attributes of all children at once by just changing the font or
+colour of their common parent, hence in this case we do inherit the
+parents attributes.
+ +
InheritsBackgroundColour(*args, **kwargs)
InheritsBackgroundColour(self) -> bool
+ +
InitDialog(*args, **kwargs)
InitDialog(self)

+Sends an EVT_INIT_DIALOG event, whose handler usually transfers data
+to the dialog via validators.
+ +
InvalidateBestSize(*args, **kwargs)
InvalidateBestSize(self)

+Reset the cached best size value so it will be recalculated the next
+time it is needed.
+ +
IsBeingDeleted(*args, **kwargs)
IsBeingDeleted(self) -> bool

+Is the window in the process of being deleted?
+ +
IsDoubleBuffered(*args, **kwargs)
IsDoubleBuffered(self) -> bool

+Returns ``True`` if the window contents is double-buffered by the
+system, i.e. if any drawing done on the window is really done on a
+temporary backing surface and transferred to the screen all at once
+later.
+ +
IsEnabled(*args, **kwargs)
IsEnabled(self) -> bool

+Returns true if the window is enabled for input, false otherwise.
+ +
IsExposed(*args, **kwargs)
IsExposed(self, int x, int y, int w=1, int h=1) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedPoint(*args, **kwargs)
IsExposedPoint(self, Point pt) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedRect(*args, **kwargs)
IsExposedRect(self, Rect rect) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsFrozen(*args, **kwargs)
IsFrozen(self) -> bool

+Returns ``True`` if the window has been frozen and not thawed yet.

+:see: `Freeze` and `Thaw`
+ +
IsRetained(*args, **kwargs)
IsRetained(self) -> bool

+Returns true if the window is retained, false otherwise.  Retained
+windows are only available on X platforms.
+ +
IsShown(*args, **kwargs)
IsShown(self) -> bool

+Returns true if the window is shown, false if it has been hidden.
+ +
IsShownOnScreen(*args, **kwargs)
IsShownOnScreen(self) -> bool

+Returns ``True`` if the window is physically visible on the screen,
+i.e. it is shown and all its parents up to the toplevel window are
+shown as well.
+ +
IsTopLevel(*args, **kwargs)
IsTopLevel(self) -> bool

+Returns true if the given window is a top-level one. Currently all
+frames and dialogs are always considered to be top-level windows (even
+if they have a parent window).
+ +
Layout(*args, **kwargs)
Layout(self) -> bool

+Invokes the constraint-based layout algorithm or the sizer-based
+algorithm for this window.  See SetAutoLayout: when auto layout is on,
+this function gets called automatically by the default EVT_SIZE
+handler when the window is resized.
+ +
LineDown(*args, **kwargs)
LineDown(self) -> bool

+This is just a wrapper for ScrollLines(1).
+ +
LineUp(*args, **kwargs)
LineUp(self) -> bool

+This is just a wrapper for ScrollLines(-1).
+ +
Lower(*args, **kwargs)
Lower(self)

+Lowers the window to the bottom of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
MakeModal(*args, **kwargs)
MakeModal(self, bool modal=True)

+Disables all other windows in the application so that the user can
+only interact with this window.  Passing False will reverse this
+effect.
+ +
Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
MoveAfterInTabOrder(*args, **kwargs)
MoveAfterInTabOrder(self, Window win)

+Moves this window in the tab navigation order after the specified
+sibling window.  This means that when the user presses the TAB key on
+that other window, the focus switches to this window.

+The default tab order is the same as creation order.  This function
+and `MoveBeforeInTabOrder` allow to change it after creating all the
+windows.
+ +
MoveBeforeInTabOrder(*args, **kwargs)
MoveBeforeInTabOrder(self, Window win)

+Same as `MoveAfterInTabOrder` except that it inserts this window just
+before win instead of putting it right after it.
+ +
MoveXY(*args, **kwargs)
MoveXY(self, int x, int y, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
Navigate(*args, **kwargs)
Navigate(self, int flags=NavigationKeyEvent.IsForward) -> bool

+Does keyboard navigation from this window to another, by sending a
+`wx.NavigationKeyEvent`.
+ +
PageDown(*args, **kwargs)
PageDown(self) -> bool

+This is just a wrapper for ScrollPages(1).
+ +
PageUp(*args, **kwargs)
PageUp(self) -> bool

+This is just a wrapper for ScrollPages(-1).
+ +
PopEventHandler(*args, **kwargs)
PopEventHandler(self, bool deleteHandler=False) -> EvtHandler

+Removes and returns the top-most event handler on the event handler
+stack.  If deleteHandler is True then the wx.EvtHandler object will be
+destroyed after it is popped, and ``None`` will be returned instead.
+ +
PopupMenu(*args, **kwargs)
PopupMenu(self, Menu menu, Point pos=DefaultPosition) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PopupMenuXY(*args, **kwargs)
PopupMenuXY(self, Menu menu, int x=-1, int y=-1) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PostCreate(self, pre)
Phase 3 of the 2-phase create <wink!>
+Call this method after precreating the window with the 2-phase create method.
+ +
PrepareDC(*args, **kwargs)
PrepareDC(self, DC dc)

+Call this function to prepare the device context for drawing a
+scrolled image. It sets the device origin according to the current
+scroll position.
+ +
PushEventHandler(*args, **kwargs)
PushEventHandler(self, EvtHandler handler)

+Pushes this event handler onto the event handler stack for the window.
+An event handler is an object that is capable of processing the events
+sent to a window.  (In other words, is able to dispatch the events to a
+handler function.)  By default, the window is its own event handler,
+but an application may wish to substitute another, for example to
+allow central implementation of event-handling for a variety of
+different window classes.

+wx.Window.PushEventHandler allows an application to set up a chain of
+event handlers, where an event not handled by one event handler is
+handed to the next one in the chain.  Use `wx.Window.PopEventHandler`
+to remove the event handler.  Ownership of the handler is *not* given
+to the window, so you should be sure to pop the handler before the
+window is destroyed and either let PopEventHandler destroy it, or call
+its Destroy method yourself.
+ +
Raise(*args, **kwargs)
Raise(self)

+Raises the window to the top of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
Refresh(*args, **kwargs)
Refresh(self, bool eraseBackground=True, Rect rect=None)

+Mark the specified rectangle (or the whole window) as "dirty" so it
+will be repainted.  Causes an EVT_PAINT event to be generated and sent
+to the window.
+ +
RefreshRect(*args, **kwargs)
RefreshRect(self, Rect rect, bool eraseBackground=True)

+Redraws the contents of the given rectangle: the area inside it will
+be repainted.  This is the same as Refresh but has a nicer syntax.
+ +
RegisterHotKey(*args, **kwargs)
RegisterHotKey(self, int hotkeyId, int modifiers, int keycode) -> bool

+Registers a system wide hotkey. Every time the user presses the hotkey
+registered here, this window will receive a hotkey event. It will
+receive the event even if the application is in the background and
+does not have the input focus because the user is working with some
+other application.  To bind an event handler function to this hotkey
+use EVT_HOTKEY with an id equal to hotkeyId.  Returns True if the
+hotkey was registered successfully.
+ +
ReleaseMouse(*args, **kwargs)
ReleaseMouse(self)

+Releases mouse input captured with wx.Window.CaptureMouse.
+ +
RemoveChild(*args, **kwargs)
RemoveChild(self, Window child)

+Removes a child window. This is called automatically by window
+deletion functions so should not be required by the application
+programmer.
+ +
RemoveEventHandler(*args, **kwargs)
RemoveEventHandler(self, EvtHandler handler) -> bool

+Find the given handler in the event handler chain and remove (but not
+delete) it from the event handler chain, returns True if it was found
+and False otherwise (this also results in an assert failure so this
+function should only be called when the handler is supposed to be
+there.)
+ +
Reparent(*args, **kwargs)
Reparent(self, Window newParent) -> bool

+Reparents the window, i.e the window will be removed from its current
+parent window (e.g. a non-standard toolbar in a wxFrame) and then
+re-inserted into another. Available on Windows and GTK.  Returns True
+if the parent was changed, False otherwise (error or newParent ==
+oldParent)
+ +
ScreenToClient(*args, **kwargs)
ScreenToClient(self, Point pt) -> Point

+Converts from screen to client window coordinates.
+ +
ScreenToClientXY(*args, **kwargs)
ScreenToClientXY(int x, int y) -> (x,y)

+Converts from screen to client window coordinates.
+ +
ScrollLines(*args, **kwargs)
ScrollLines(self, int lines) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of lines down, if lines is positive, or up if lines
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollPages(*args, **kwargs)
ScrollPages(self, int pages) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of pages down, if pages is positive, or up if pages
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollWindow(*args, **kwargs)
ScrollWindow(self, int dx, int dy, Rect rect=None)

+Physically scrolls the pixels in the window and move child windows
+accordingly.  Use this function to optimise your scrolling
+implementations, to minimise the area that must be redrawn. Note that
+it is rarely required to call this function from a user program.
+ +
SendSizeEvent(self)
+ +
SetAcceleratorTable(*args, **kwargs)
SetAcceleratorTable(self, AcceleratorTable accel)

+Sets the accelerator table for this window.
+ +
SetAutoLayout(*args, **kwargs)
SetAutoLayout(self, bool autoLayout)

+Determines whether the Layout function will be called automatically
+when the window is resized.  lease note that this only happens for the
+windows usually used to contain children, namely `wx.Panel` and
+`wx.TopLevelWindow` (and the classes deriving from them).

+This method is called implicitly by `SetSizer` but if you use
+`SetConstraints` you should call it manually or otherwise the window
+layout won't be correctly updated when its size changes.
+ +
SetBackgroundColour(*args, **kwargs)
SetBackgroundColour(self, Colour colour) -> bool

+Sets the background colour of the window.  Returns True if the colour
+was changed.  The background colour is usually painted by the default
+EVT_ERASE_BACKGROUND event handler function under Windows and
+automatically under GTK.  Using `wx.NullColour` will reset the window
+to the default background colour.

+Note that setting the background colour may not cause an immediate
+refresh, so you may wish to call `ClearBackground` or `Refresh` after
+calling this function.

+Using this function will disable attempts to use themes for this
+window, if the system supports them.  Use with care since usually the
+themes represent the appearance chosen by the user to be used for all
+applications on the system.
+ +
SetBackgroundStyle(*args, **kwargs)
SetBackgroundStyle(self, int style) -> bool

+Returns the background style of the window. The background style
+indicates how the background of the window is drawn.

+    ======================  ========================================
+    wx.BG_STYLE_SYSTEM      The background colour or pattern should
+                            be determined by the system
+    wx.BG_STYLE_COLOUR      The background should be a solid colour
+    wx.BG_STYLE_CUSTOM      The background will be implemented by the
+                            application.
+    ======================  ========================================

+On GTK+, use of wx.BG_STYLE_CUSTOM allows the flicker-free drawing of
+a custom background, such as a tiled bitmap. Currently the style has
+no effect on other platforms.

+:see: `GetBackgroundStyle`, `SetBackgroundColour`
+ +
SetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `SetInitialSize`
+ +
SetCaret(*args, **kwargs)
SetCaret(self, Caret caret)

+Sets the caret associated with the window.
+ +
SetClientRect(*args, **kwargs)
SetClientRect(self, Rect rect)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSize(*args, **kwargs)
SetClientSize(self, Size size)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSizeWH(*args, **kwargs)
SetClientSizeWH(self, int width, int height)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetConstraints(*args, **kwargs)
SetConstraints(self, LayoutConstraints constraints)

+Sets the window to have the given layout constraints. If an existing
+layout constraints object is already owned by the window, it will be
+deleted.  Pass None to disassociate and delete the window's current
+constraints.

+You must call SetAutoLayout to tell a window to use the constraints
+automatically in its default EVT_SIZE handler; otherwise, you must
+handle EVT_SIZE yourself and call Layout() explicitly. When setting
+both a wx.LayoutConstraints and a wx.Sizer, only the sizer will have
+effect.
+ +
SetContainingSizer(*args, **kwargs)
SetContainingSizer(self, Sizer sizer)

+This normally does not need to be called by application code. It is
+called internally when a window is added to a sizer, and is used so
+the window can remove itself from the sizer when it is destroyed.
+ +
SetCursor(*args, **kwargs)
SetCursor(self, Cursor cursor) -> bool

+Sets the window's cursor. Notice that the window cursor also sets it
+for the children of the window implicitly.

+The cursor may be wx.NullCursor in which case the window cursor will
+be reset back to default.
+ +
SetDimensions(*args, **kwargs)
SetDimensions(self, int x, int y, int width, int height, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels.  The sizeFlags
+parameter indicates the interpretation of the other params if they are
+equal to -1.

+    ========================  ======================================
+    wx.SIZE_AUTO              A -1 indicates that a class-specific
+                              default should be used.
+    wx.SIZE_USE_EXISTING      Axisting dimensions should be used if
+                              -1 values are supplied.
+    wxSIZE_ALLOW_MINUS_ONE    Allow dimensions of -1 and less to be
+                              interpreted as real dimensions, not
+                              default values.
+    ========================  ======================================
+ +
SetDoubleBuffered(*args, **kwargs)
SetDoubleBuffered(self, bool on)

+Currently wxGTK2 only.
+ +
SetDropTarget(*args, **kwargs)
SetDropTarget(self, DropTarget dropTarget)

+Associates a drop target with this window.  If the window already has
+a drop target, it is deleted.
+ +
SetEventHandler(*args, **kwargs)
SetEventHandler(self, EvtHandler handler)

+Sets the event handler for this window.  An event handler is an object
+that is capable of processing the events sent to a window.  (In other
+words, is able to dispatch the events to handler function.)  By
+default, the window is its own event handler, but an application may
+wish to substitute another, for example to allow central
+implementation of event-handling for a variety of different window
+classes.

+It is usually better to use `wx.Window.PushEventHandler` since this sets
+up a chain of event handlers, where an event not handled by one event
+handler is handed off to the next one in the chain.
+ +
SetExtraStyle(*args, **kwargs)
SetExtraStyle(self, long exStyle)

+Sets the extra style bits for the window.  Extra styles are the less
+often used style bits which can't be set with the constructor or with
+SetWindowStyleFlag()
+ +
SetFocus(*args, **kwargs)
SetFocus(self)

+Set's the focus to this window, allowing it to receive keyboard input.
+ +
SetFocusFromKbd(*args, **kwargs)
SetFocusFromKbd(self)

+Set focus to this window as the result of a keyboard action.  Normally
+only called internally.
+ +
SetFont(*args, **kwargs)
SetFont(self, Font font) -> bool

+Sets the font for this window.
+ +
SetForegroundColour(*args, **kwargs)
SetForegroundColour(self, Colour colour) -> bool

+Sets the foreground colour of the window.  Returns True is the colour
+was changed.  The interpretation of foreground colour is dependent on
+the window class; it may be the text colour or other colour, or it may
+not be used at all.
+ +
SetHelpText(*args, **kwargs)
SetHelpText(self, String text)

+Sets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
SetHelpTextForId(*args, **kwargs)
SetHelpTextForId(self, String text)

+Associate this help text with all windows with the same id as this
+one.
+ +
SetId(*args, **kwargs)
SetId(self, int winid)

+Sets the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one, an identifier
+will be generated. Normally, the identifier should be provided on
+creation and should not be modified subsequently.
+ +
SetInitialSize(*args, **kwargs)
SetInitialSize(self, Size size=DefaultSize)

+A 'Smart' SetSize that will fill in default size components with the
+window's *best size* values.  Also set's the minsize for use with sizers.
+ +
SetLabel(*args, **kwargs)
SetLabel(self, String label)

+Set the text which the window shows in its label if applicable.
+ +
SetLayoutDirection(*args, **kwargs)
SetLayoutDirection(self, int dir)

+Set the layout direction (LTR or RTL) for this window.
+ +
SetMaxSize(*args, **kwargs)
SetMaxSize(self, Size maxSize)

+A more convenient method than `SetSizeHints` for setting just the
+max size.
+ +
SetMinSize(*args, **kwargs)
SetMinSize(self, Size minSize)

+A more convenient method than `SetSizeHints` for setting just the
+min size.
+ +
SetName(*args, **kwargs)
SetName(self, String name)

+Sets the window's name.  The window name is used for ressource setting
+in X, it is not the same as the window title/label
+ +
SetOwnBackgroundColour(*args, **kwargs)
SetOwnBackgroundColour(self, Colour colour)
+ +
SetOwnFont(*args, **kwargs)
SetOwnFont(self, Font font)
+ +
SetOwnForegroundColour(*args, **kwargs)
SetOwnForegroundColour(self, Colour colour)
+ +
SetPosition = Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
SetRect(*args, **kwargs)
SetRect(self, Rect rect, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels using a wx.Rect.
+ +
SetScrollPos(*args, **kwargs)
SetScrollPos(self, int orientation, int pos, bool refresh=True)

+Sets the position of one of the built-in scrollbars.
+ +
SetScrollbar(*args, **kwargs)
SetScrollbar(self, int orientation, int position, int thumbSize, int range, 
+    bool refresh=True)

+Sets the scrollbar properties of a built-in scrollbar.
+ +
SetSize(*args, **kwargs)
SetSize(self, Size size)

+Sets the size of the window in pixels.
+ +
SetSizeHints(*args, **kwargs)
SetSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1, int incW=-1, 
+    int incH=-1)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeHintsSz(*args, **kwargs)
SetSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize, Size incSize=DefaultSize)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeWH(*args, **kwargs)
SetSizeWH(self, int width, int height)

+Sets the size of the window in pixels.
+ +
SetSizer(*args, **kwargs)
SetSizer(self, Sizer sizer, bool deleteOld=True)

+Sets the window to have the given layout sizer. The window will then
+own the object, and will take care of its deletion. If an existing
+layout sizer object is already owned by the window, it will be deleted
+if the deleteOld parameter is true. Note that this function will also
+call SetAutoLayout implicitly with a True parameter if the sizer is
+non-None, and False otherwise.
+ +
SetSizerAndFit(*args, **kwargs)
SetSizerAndFit(self, Sizer sizer, bool deleteOld=True)

+The same as SetSizer, except it also sets the size hints for the
+window based on the sizer's minimum size.
+ +
SetThemeEnabled(*args, **kwargs)
SetThemeEnabled(self, bool enableTheme)

+This function tells a window if it should use the system's "theme"
+ code to draw the windows' background instead if its own background
+ drawing code. This will only have an effect on platforms that support
+ the notion of themes in user defined windows. One such platform is
+ GTK+ where windows can have (very colourful) backgrounds defined by a
+ user's selected theme.

+Dialogs, notebook pages and the status bar have this flag set to true
+by default so that the default look and feel is simulated best.
+ +
SetToolTip(*args, **kwargs)
SetToolTip(self, ToolTip tip)

+Attach a tooltip to the window.
+ +
SetToolTipString(*args, **kwargs)
SetToolTipString(self, String tip)

+Attach a tooltip to the window.
+ +
SetTransparent(*args, **kwargs)
SetTransparent(self, byte alpha) -> bool

+Attempt to set the transparency of this window to the ``alpha`` value,
+returns True on success.  The ``alpha`` value is an integer in the
+range of 0 to 255, where 0 is fully transparent and 255 is fully
+opaque.
+ +
SetValidator(*args, **kwargs)
SetValidator(self, Validator validator)

+Deletes the current validator (if any) and sets the window validator,
+having called wx.Validator.Clone to create a new validator of this
+type.
+ +
SetVirtualSize(*args, **kwargs)
SetVirtualSize(self, Size size)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetVirtualSizeHints(*args, **kwargs)
SetVirtualSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeHintsSz(*args, **kwargs)
SetVirtualSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeWH(*args, **kwargs)
SetVirtualSizeWH(self, int w, int h)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetWindowStyle = SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowVariant(*args, **kwargs)
SetWindowVariant(self, int variant)

+Sets the variant of the window/font size to use for this window, if
+the platform supports variants, for example, wxMac.
+ +
ShouldInheritColours(*args, **kwargs)
ShouldInheritColours(self) -> bool

+Return true from here to allow the colours of this window to be
+changed by InheritAttributes, returning false forbids inheriting them
+from the parent window.

+The base class version returns false, but this method is overridden in
+wxControl where it returns true.
+ +
Show(*args, **kwargs)
Show(self, bool show=True) -> bool

+Shows or hides the window. You may need to call Raise for a top level
+window if you want to bring it to top, although this is not needed if
+Show is called immediately after the frame creation.  Returns True if
+the window has been shown or hidden or False if nothing was done
+because it already was in the requested state.
+ +
Thaw(*args, **kwargs)
Thaw(self)

+Reenables window updating after a previous call to Freeze.  Calls to
+Freeze/Thaw may be nested, so Thaw must be called the same number of
+times that Freeze was before the window will be updated.
+ +
ToggleWindowStyle(*args, **kwargs)
ToggleWindowStyle(self, int flag) -> bool

+Turn the flag on if it had been turned off before and vice versa,
+returns True if the flag is turned on by this function call.
+ +
TransferDataFromWindow(*args, **kwargs)
TransferDataFromWindow(self) -> bool

+Transfers values from child controls to data areas specified by their
+validators. Returns false if a transfer failed.  If the window has
+wx.WS_EX_VALIDATE_RECURSIVELY extra style flag set, the method will
+also call TransferDataFromWindow() of all child windows.
+ +
TransferDataToWindow(*args, **kwargs)
TransferDataToWindow(self) -> bool

+Transfers values to child controls from data areas specified by their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call TransferDataToWindow() of
+all child windows.
+ +
UnregisterHotKey(*args, **kwargs)
UnregisterHotKey(self, int hotkeyId) -> bool

+Unregisters a system wide hotkey.
+ +
Update(*args, **kwargs)
Update(self)

+Calling this method immediately repaints the invalidated area of the
+window instead of waiting for the EVT_PAINT event to happen, (normally
+this would usually only happen when the flow of control returns to the
+event loop.)  Notice that this function doesn't refresh the window and
+does nothing if the window has been already repainted.  Use `Refresh`
+first if you want to immediately redraw the window (or some portion of
+it) unconditionally.
+ +
UpdateWindowUI(*args, **kwargs)
UpdateWindowUI(self, long flags=UPDATE_UI_NONE)

+This function sends EVT_UPDATE_UI events to the window. The particular
+implementation depends on the window; for example a wx.ToolBar will
+send an update UI event for each toolbar button, and a wx.Frame will
+send an update UI event for each menubar menu item. You can call this
+function from your application to ensure that your UI is up-to-date at
+a particular point in time (as far as your EVT_UPDATE_UI handlers are
+concerned). This may be necessary if you have called
+`wx.UpdateUIEvent.SetMode` or `wx.UpdateUIEvent.SetUpdateInterval` to
+limit the overhead that wxWindows incurs by sending update UI events
+in idle time.
+ +
UseBgCol(*args, **kwargs)
UseBgCol(self) -> bool
+ +
Validate(*args, **kwargs)
Validate(self) -> bool

+Validates the current values of the child controls using their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call Validate() of all child
+windows.  Returns false if any of the validations failed.
+ +
WarpPointer(*args, **kwargs)
WarpPointer(self, int x, int y)

+Moves the pointer to the given position on the window.

+NOTE: This function is not supported under Mac because Apple Human
+Interface Guidelines forbid moving the mouse cursor programmatically.
+ +
+Static methods inherited from wx._core.Window:
+
FindFocus(*args, **kwargs)
FindFocus() -> Window

+Returns the window or control that currently has the keyboard focus,
+or None.
+ +
GetCapture(*args, **kwargs)
GetCapture() -> Window

+Returns the window which currently captures the mouse or None
+ +
NewControlId(*args, **kwargs)
NewControlId() -> int

+Generate a control id for the controls which were not given one.
+ +
NextControlId(*args, **kwargs)
NextControlId(int winid) -> int

+Get the id of the control following the one with the given
+autogenerated) id
+ +
PrevControlId(*args, **kwargs)
PrevControlId(int winid) -> int

+Get the id of the control preceding the one with the given
+autogenerated) id
+ +
+Data descriptors inherited from wx._core.Window:
+
AcceleratorTable
+
See `GetAcceleratorTable` and `SetAcceleratorTable`
+
+
AutoLayout
+
See `GetAutoLayout` and `SetAutoLayout`
+
+
BackgroundColour
+
See `GetBackgroundColour` and `SetBackgroundColour`
+
+
BackgroundStyle
+
See `GetBackgroundStyle` and `SetBackgroundStyle`
+
+
BestSize
+
See `GetBestSize`
+
+
BestVirtualSize
+
See `GetBestVirtualSize`
+
+
Border
+
See `GetBorder`
+
+
Caret
+
See `GetCaret` and `SetCaret`
+
+
CharHeight
+
See `GetCharHeight`
+
+
CharWidth
+
See `GetCharWidth`
+
+
Children
+
See `GetChildren`
+
+
ClientAreaOrigin
+
See `GetClientAreaOrigin`
+
+
ClientRect
+
See `GetClientRect` and `SetClientRect`
+
+
ClientSize
+
See `GetClientSize` and `SetClientSize`
+
+
Constraints
+
See `GetConstraints` and `SetConstraints`
+
+
ContainingSizer
+
See `GetContainingSizer` and `SetContainingSizer`
+
+
Cursor
+
See `GetCursor` and `SetCursor`
+
+
DefaultAttributes
+
See `GetDefaultAttributes`
+
+
DropTarget
+
See `GetDropTarget` and `SetDropTarget`
+
+
EffectiveMinSize
+
See `GetEffectiveMinSize`
+
+
Enabled
+
See `IsEnabled` and `Enable`
+
+
EventHandler
+
See `GetEventHandler` and `SetEventHandler`
+
+
ExtraStyle
+
See `GetExtraStyle` and `SetExtraStyle`
+
+
Font
+
See `GetFont` and `SetFont`
+
+
ForegroundColour
+
See `GetForegroundColour` and `SetForegroundColour`
+
+
GrandParent
+
See `GetGrandParent`
+
+
GtkWidget
+
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+
+
Handle
+
See `GetHandle`
+
+
HelpText
+
See `GetHelpText` and `SetHelpText`
+
+
Id
+
See `GetId` and `SetId`
+
+
Label
+
See `GetLabel` and `SetLabel`
+
+
LayoutDirection
+
See `GetLayoutDirection` and `SetLayoutDirection`
+
+
MaxHeight
+
See `GetMaxHeight`
+
+
MaxSize
+
See `GetMaxSize` and `SetMaxSize`
+
+
MaxWidth
+
See `GetMaxWidth`
+
+
MinHeight
+
See `GetMinHeight`
+
+
MinSize
+
See `GetMinSize` and `SetMinSize`
+
+
MinWidth
+
See `GetMinWidth`
+
+
Name
+
See `GetName` and `SetName`
+
+
Parent
+
See `GetParent`
+
+
Position
+
See `GetPosition` and `SetPosition`
+
+
Rect
+
See `GetRect` and `SetRect`
+
+
ScreenPosition
+
See `GetScreenPosition`
+
+
ScreenRect
+
See `GetScreenRect`
+
+
Shown
+
See `IsShown` and `Show`
+
+
Size
+
See `GetSize` and `SetSize`
+
+
Sizer
+
See `GetSizer` and `SetSizer`
+
+
ThemeEnabled
+
See `GetThemeEnabled` and `SetThemeEnabled`
+
+
ToolTip
+
See `GetToolTip` and `SetToolTip`
+
+
TopLevel
+
See `IsTopLevel`
+
+
TopLevelParent
+
See `GetTopLevelParent`
+
+
UpdateClientRect
+
See `GetUpdateClientRect`
+
+
UpdateRegion
+
See `GetUpdateRegion`
+
+
Validator
+
See `GetValidator` and `SetValidator`
+
+
VirtualSize
+
See `GetVirtualSize` and `SetVirtualSize`
+
+
WindowStyle
+
See `GetWindowStyle` and `SetWindowStyle`
+
+
WindowStyleFlag
+
See `GetWindowStyleFlag` and `SetWindowStyleFlag`
+
+
WindowVariant
+
See `GetWindowVariant` and `SetWindowVariant`
+
+
+Methods inherited from wx._core.EvtHandler:
+
AddPendingEvent(*args, **kwargs)
AddPendingEvent(self, Event event)
+ +
Bind(self, event, handler, source=None, id=-1, id2=-1)
Bind an event to an event handler.

+:param event: One of the EVT_* objects that specifies the
+              type of event to bind,

+:param handler: A callable object to be invoked when the
+              event is delivered to self.  Pass None to
+              disconnect an event handler.

+:param source: Sometimes the event originates from a
+              different window than self, but you still
+              want to catch it in self.  (For example, a
+              button event delivered to a frame.)  By
+              passing the source of the event, the event
+              handling system is able to differentiate
+              between the same event type from different
+              controls.

+:param id: Used to spcify the event source by ID instead
+           of instance.

+:param id2: Used when it is desirable to bind a handler
+              to a range of IDs, such as with EVT_MENU_RANGE.
+ +
Connect(*args, **kwargs)
Connect(self, int id, int lastId, int eventType, PyObject func)
+ +
Disconnect(*args, **kwargs)
Disconnect(self, int id, int lastId=-1, EventType eventType=wxEVT_NULL) -> bool
+ +
GetEvtHandlerEnabled(*args, **kwargs)
GetEvtHandlerEnabled(self) -> bool
+ +
GetNextHandler(*args, **kwargs)
GetNextHandler(self) -> EvtHandler
+ +
GetPreviousHandler(*args, **kwargs)
GetPreviousHandler(self) -> EvtHandler
+ +
ProcessEvent(*args, **kwargs)
ProcessEvent(self, Event event) -> bool
+ +
ProcessPendingEvents(*args, **kwargs)
ProcessPendingEvents(self)
+ +
SetEvtHandlerEnabled(*args, **kwargs)
SetEvtHandlerEnabled(self, bool enabled)
+ +
SetNextHandler(*args, **kwargs)
SetNextHandler(self, EvtHandler handler)
+ +
SetPreviousHandler(*args, **kwargs)
SetPreviousHandler(self, EvtHandler handler)
+ +
Unbind(self, event, source=None, id=-1, id2=-1)
Disconencts the event handler binding for event from self.
+Returns True if successful.
+ +
+Data descriptors inherited from wx._core.EvtHandler:
+
EvtHandlerEnabled
+
See `GetEvtHandlerEnabled` and `SetEvtHandlerEnabled`
+
+
NextHandler
+
See `GetNextHandler` and `SetNextHandler`
+
+
PreviousHandler
+
See `GetPreviousHandler` and `SetPreviousHandler`
+
+
+Methods inherited from wx._core.Object:
+
GetClassName(*args, **kwargs)
GetClassName(self) -> String

+Returns the class name of the C++ class using wxRTTI.
+ +
IsSameAs(*args, **kwargs)
IsSameAs(self, Object p) -> bool

+For wx.Objects that use C++ reference counting internally, this method
+can be used to determine if two objects are referencing the same data
+object.
+ +
+Data descriptors inherited from wx._core.Object:
+
ClassName
+
See `GetClassName`
+
+
__dict__
+
dictionary for instance variables (if defined)
+
+
__weakref__
+
list of weak references to the object (if defined)
+
+

+ + + + + +
 
+Data
       COLOR_PV_AUTOFILL = wx.Colour(200, 200, 200, 255)
+COLOR_PV_NOT_OK = wx.Colour(254, 232, 255, 255)
+COLOR_PV_OK = wx.Colour(235, 254, 231, 255)
+wxID_PVDIALOG = 126
+wxID_PVDIALOGBUTTON_CANCEL = 127
+wxID_PVDIALOGBUTTON_CLEAR_X = 128
+wxID_PVDIALOGBUTTON_CLEAR_Y = 129
+wxID_PVDIALOGBUTTON_OK = 130
+wxID_PVDIALOGBUTTON_REVERT = 131
+wxID_PVDIALOGCB_IS_MOTOR_X = 132
+wxID_PVDIALOGCB_IS_MOTOR_Y = 133
+wxID_PVDIALOGEPICS_LOGO = 134
+wxID_PVDIALOGLBL_DESC = 135
+wxID_PVDIALOGLBL_DONE = 136
+wxID_PVDIALOGLBL_EGU = 137
+wxID_PVDIALOGLBL_RBV = 138
+wxID_PVDIALOGLBL_STOP = 139
+wxID_PVDIALOGLBL_VAL = 140
+wxID_PVDIALOGPV_X_DESC = 141
+wxID_PVDIALOGPV_X_DMOV = 142
+wxID_PVDIALOGPV_X_EGU = 143
+wxID_PVDIALOGPV_X_RBV = 144
+wxID_PVDIALOGPV_X_STOP = 145
+wxID_PVDIALOGPV_X_VAL = 146
+wxID_PVDIALOGPV_Y_DESC = 147
+wxID_PVDIALOGPV_Y_DMOV = 148
+wxID_PVDIALOGPV_Y_EGU = 149
+wxID_PVDIALOGPV_Y_RBV = 150
+wxID_PVDIALOGPV_Y_STOP = 151
+wxID_PVDIALOGPV_Y_VAL = 152
+wxID_PVDIALOGTITLE = 153
+ \ No newline at end of file diff --git a/pydoc/wxmtxy_root.html b/pydoc/wxmtxy_root.html new file mode 100644 index 0000000..d360839 --- /dev/null +++ b/pydoc/wxmtxy_root.html @@ -0,0 +1,2024 @@ + + +Python: module wxmtxy_root + + + + +
 
+ 
wxmtxy_root
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy_root.py
+

wxmtxy_root: Define the GUI elements and interface (this is the main code)

+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_root.py $
+# $Id: wxmtxy_root.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+@note: for an undo example, see: http://wiki.wxpython.org/AnotherTutorial

+

+ + + + + +
 
+Modules
       
copy
+datetime
+inspect
+
os
+wx
+wxmtxy_htmlview
+
wxmtxy_pair
+wxmtxy_pvsetup
+wxmtxy_row
+
wxmtxy_tab
+wxmtxy_version
+wxmtxy_xml
+

+ + + + + +
 
+Classes
       
+
wx._windows.Frame(wx._windows.TopLevelWindow) +
+
+
root +
+
+
+

+ + + + + + + +
 
+class root(wx._windows.Frame)
   wxmtxy: Define the GUI elements and interface
 
 
Method resolution order:
+
root
+
wx._windows.Frame
+
wx._windows.TopLevelWindow
+
wx._core.Window
+
wx._core.EvtHandler
+
wx._core.Object
+
__builtin__.object
+
+
+Methods defined here:
+
DeletePairnum(self, pairnum)
Delete the selected X,Y pair and settings
+@param pairnum: [int] index number of the XY_pair
+ +
DeleteRow(self, thePair, theTab, theRow)
Process a 'delete' command from a row button
+@param thePair: wxmtxy_pair.XYpair object
+@param theTab: wxmtxy_tab.Tab object
+@param theRow: wxmtxy_row.Row object
+ +
GetEpicsConfig(self, pairnum)
Return the EPICS PV configuration for the indexed X,Y pair
+@param pairnum: [int] index number of the XY_pair
+ +
GetPairText(self, pairnum)
@param pairnum: [int] index number of the XY_pair
+@return: text of the pair numbered pairnum
+ +
GoRow(self, thePair, theTab, theRow)
Process a 'go' command from a row button
+@param thePair: wxmtxy_pair.XYpair object
+@param theTab: wxmtxy_tab.Tab object
+@param theRow: wxmtxy_row.Row object
+ +
ImportRows(self, rowfile)
Import a row file into the current tab (make a tab if none exists)
+@param rowfile: [string] name of the 3-column tab-separated file
+ +
NewPair(self, newtab=True)
Create a page for a new X,Y pair
+@param newtab: [Boolean] option to create a first tab
+ +
OnMenuAboutHelpMenu(self, event)
user requested help
+@param event: wxPython event object
+@note: Not implemented yet
+ +
OnMenuFileCloseMenu(self, event)
User requested to close the settings file
+@param event: wxPython event object
+ +
OnMenuFileExitMenu(self, event)
User requested to quit the application
+@param event: wxPython event object
+ +
OnMenuFileExportMenu(self, event)
user requested to export a Tab
+@param event: wxPython event object
+@note: Not implemented yet
+ +
OnMenuFileImportMenu(self, event)
user requested to import a table of settings from a file
+@param event: wxPython event object
+ +
OnMenuFileNewMenu(self, event)
Requested new settings
+@param event: wxPython event object
+ +
OnMenuFileOpenMenu(self, event)
Requested to open XML settings file
+@param event: wxPython event object
+ +
OnMenuFilePreferencesMenu(self, event)
user requested to view/edit preferences
+@param event: wxPython event object
+@note: Not implemented yet
+ +
OnMenuFileSaveMenu(self, event)
Requested to save settings to XML file
+@param event: wxPython event object
+ +
OnMenuFileSaveasMenu(self, event)
Requested to save settings to new XML file
+@param event: wxPython event object
+ +
OnMenuPageChoicechangetabtitleMenu(self, event)
user requested to rename tab
+@param event: wxPython event object
+ +
OnMenuPageChoicechangetitleMenu(self, event)
User requested to change the page title
+@param event: wxPython event object
+ +
OnMenuPageChoicedeletepairMenu(self, event)
User requested to delete the X,Y pair
+@param event: wxPython event object
+ +
OnMenuPageChoicedeletetabMenu(self, event)
user requested to delete a tab
+@param event: wxPython event object
+ +
OnMenuPageChoiceepicsconfigMenu(self, event)
user requested to view/change EPICS PV configuration
+@param event: wxPython event object
+ +
OnMenuPageChoicenewpairMenu(self, event)
User requested a new X,Y pair
+@param event: wxPython event object
+ +
OnMenuPageChoicenewrowMenu(self, event)
user requested to create a new row of settings in the current table
+@param event: wxPython event object
+ +
OnMenuPageChoicenewtabMenu(self, event)
user requested a new tab
+@param event: wxPython event object
+ +
OpenSettingsFile(self, settingsFile)
Open the named settings file and replace all the current settings
+@param settingsFile: [string] name of the XML file
+ +
PairHandler(self, thePair, theTab, theRow, command)
Callback function to handle a command from a pair
+@param thePair: wxmtxy_pair.XYpair object
+@param theTab: wxmtxy_tab.Tab object
+@param theRow: wxmtxy_row.Row object
+@param command: [string] action from Row button
+ +
PostNotice(self, title, message, flags)
post a message dialog box
+@param title: [string] window title bar
+@param message: [string] message message text
+@param flags: dialog box flags (such as wx.OK | wx.ICON_INFORMATION)
+ +
RequestConfirmation(self, command, text)
Present a dialog asking user to confirm step
+@param command: [string] action to be confirmed
+@param text: [string] message to user
+ +
SaveSettingsFile(self, settingsFile)
Save the current settings to the named settings file
+@param settingsFile: [string] name of the XML file
+ +
SetEpicsConfig(self, pairnum, config)
Define the EPICS PVs for the indexed X,Y pair
+@param pairnum: [int] index number of the XY_pair
+@param config: Python dictionary of EPICS PV configuration
+ +
SetPairText(self, pairnum, text)
set the text of the pair numbered pairnum
+@param pairnum: [int] index number of the XY_pair
+@param text: [string] name of the XYpair
+ +
SetRow(self, thePair, theTab, theRow)
Process a 'set' command from a row button
+@param thePair: wxmtxy_pair.XYpair object
+@param theTab: wxmtxy_tab.Tab object
+@param theRow: wxmtxy_row.Row object
+ +
ShowAbout(self, event)
describe this application
+@param event: wxPython event object
+ +
StopPair(self, thePair)
Process a 'stop' command from a stop button.
+Need to stop the two associated positioners.
+ @param thePair: wxmtxy_pair.XYpair object
+ +
__init__(self, parent, settingsFile=None)
This is the main application window and class.
+@param parent: object that owns this window
+@param settingsFile: [string] name of the XML file
+ +
+Methods inherited from wx._windows.Frame:
+
Command = ProcessCommand(*args, **kwargs)
ProcessCommand(self, int winid) -> bool
+ +
Create(*args, **kwargs)
Create(self, Window parent, int id=-1, String title=EmptyString, 
+    Point pos=DefaultPosition, Size size=DefaultSize, 
+    long style=DEFAULT_FRAME_STYLE, String name=FrameNameStr) -> bool
+ +
CreateStatusBar(*args, **kwargs)
CreateStatusBar(self, int number=1, long style=DEFAULT_STATUSBAR_STYLE, int winid=0, 
+    String name=StatusLineNameStr) -> StatusBar
+ +
CreateToolBar(*args, **kwargs)
CreateToolBar(self, long style=-1, int winid=-1, String name=ToolBarNameStr) -> wxToolBar
+ +
DoGiveHelp(*args, **kwargs)
DoGiveHelp(self, String text, bool show)
+ +
DoMenuUpdates(*args, **kwargs)
DoMenuUpdates(self, Menu menu=None)
+ +
GetMenuBar(*args, **kwargs)
GetMenuBar(self) -> MenuBar
+ +
GetStatusBar(*args, **kwargs)
GetStatusBar(self) -> StatusBar
+ +
GetStatusBarPane(*args, **kwargs)
GetStatusBarPane(self) -> int
+ +
GetToolBar(*args, **kwargs)
GetToolBar(self) -> wxToolBar
+ +
PopStatusText(*args, **kwargs)
PopStatusText(self, int number=0)
+ +
ProcessCommand(*args, **kwargs)
ProcessCommand(self, int winid) -> bool
+ +
PushStatusText(*args, **kwargs)
PushStatusText(self, String text, int number=0)
+ +
SendSizeEvent(*args, **kwargs)
SendSizeEvent(self)
+ +
SetMenuBar(*args, **kwargs)
SetMenuBar(self, MenuBar menubar)
+ +
SetStatusBar(*args, **kwargs)
SetStatusBar(self, StatusBar statBar)
+ +
SetStatusBarPane(*args, **kwargs)
SetStatusBarPane(self, int n)
+ +
SetStatusText(*args, **kwargs)
SetStatusText(self, String text, int number=0)
+ +
SetStatusWidths(*args, **kwargs)
SetStatusWidths(self, int widths)
+ +
SetToolBar(*args, **kwargs)
SetToolBar(self, wxToolBar toolbar)
+ +
__repr__ = _swig_repr(self)
+ +
+Static methods inherited from wx._windows.Frame:
+
GetClassDefaultAttributes(*args, **kwargs)
GetClassDefaultAttributes(int variant=WINDOW_VARIANT_NORMAL) -> VisualAttributes

+Get the default attributes for this class.  This is useful if you want
+to use the same font or colour in your own control as in a standard
+control -- which is a much better idea than hard coding specific
+colours or fonts which might look completely out of place on the
+user's system, especially if it uses themes.

+The variant parameter is only relevant under Mac currently and is
+ignore under other platforms. Under Mac, it will change the size of
+the returned font. See `wx.Window.SetWindowVariant` for more about
+this.
+ +
+Data descriptors inherited from wx._windows.Frame:
+
MenuBar
+
See `GetMenuBar` and `SetMenuBar`
+
+
StatusBar
+
See `GetStatusBar` and `SetStatusBar`
+
+
StatusBarPane
+
See `GetStatusBarPane` and `SetStatusBarPane`
+
+
ToolBar
+
See `GetToolBar` and `SetToolBar`
+
+
thisown
+
The membership flag
+
+
+Methods inherited from wx._windows.TopLevelWindow:
+
CenterOnScreen(*args, **kwargs)
CenterOnScreen(self, int dir=BOTH)

+Center the window on screen
+ +
CentreOnScreen = CenterOnScreen(*args, **kwargs)
CenterOnScreen(self, int dir=BOTH)

+Center the window on screen
+ +
EnableCloseButton(*args, **kwargs)
EnableCloseButton(self, bool enable) -> bool
+ +
GetDefaultItem(*args, **kwargs)
GetDefaultItem(self) -> Window

+Get the default child of this parent, i.e. the one which is activated
+by pressing <Enter> such as the OK button on a wx.Dialog.
+ +
GetIcon(*args, **kwargs)
GetIcon(self) -> Icon
+ +
GetTitle(*args, **kwargs)
GetTitle(self) -> String
+ +
GetTmpDefaultItem(*args, **kwargs)
GetTmpDefaultItem(self) -> Window

+Return the temporary default item, which can be None.
+ +
Iconize(*args, **kwargs)
Iconize(self, bool iconize=True)
+ +
IsActive(*args, **kwargs)
IsActive(self) -> bool
+ +
IsAlwaysMaximized(*args, **kwargs)
IsAlwaysMaximized(self) -> bool
+ +
IsFullScreen(*args, **kwargs)
IsFullScreen(self) -> bool
+ +
IsIconized(*args, **kwargs)
IsIconized(self) -> bool
+ +
IsMaximized(*args, **kwargs)
IsMaximized(self) -> bool
+ +
MacGetMetalAppearance(*args, **kwargs)
MacGetMetalAppearance(self) -> bool
+ +
MacGetUnifiedAppearance(*args, **kwargs)
MacGetUnifiedAppearance(self) -> bool
+ +
MacSetMetalAppearance(*args, **kwargs)
MacSetMetalAppearance(self, bool on)
+ +
Maximize(*args, **kwargs)
Maximize(self, bool maximize=True)
+ +
RequestUserAttention(*args, **kwargs)
RequestUserAttention(self, int flags=USER_ATTENTION_INFO)
+ +
Restore(*args, **kwargs)
Restore(self)
+ +
SetDefaultItem(*args, **kwargs)
SetDefaultItem(self, Window child) -> Window

+Set this child as default, return the old default.
+ +
SetIcon(*args, **kwargs)
SetIcon(self, Icon icon)
+ +
SetIcons(*args, **kwargs)
SetIcons(self, wxIconBundle icons)
+ +
SetShape(*args, **kwargs)
SetShape(self, Region region) -> bool
+ +
SetTitle(*args, **kwargs)
SetTitle(self, String title)
+ +
SetTmpDefaultItem(*args, **kwargs)
SetTmpDefaultItem(self, Window win)

+Set this child as temporary default
+ +
ShowFullScreen(*args, **kwargs)
ShowFullScreen(self, bool show, long style=FULLSCREEN_ALL) -> bool
+ +
+Data descriptors inherited from wx._windows.TopLevelWindow:
+
DefaultItem
+
See `GetDefaultItem` and `SetDefaultItem`
+
+
Icon
+
See `GetIcon` and `SetIcon`
+
+
Title
+
See `GetTitle` and `SetTitle`
+
+
TmpDefaultItem
+
See `GetTmpDefaultItem` and `SetTmpDefaultItem`
+
+
+Methods inherited from wx._core.Window:
+
AcceptsFocus(*args, **kwargs)
AcceptsFocus(self) -> bool

+Can this window have focus?
+ +
AcceptsFocusFromKeyboard(*args, **kwargs)
AcceptsFocusFromKeyboard(self) -> bool

+Can this window be given focus by keyboard navigation? if not, the
+only way to give it focus (provided it accepts it at all) is to click
+it.
+ +
AddChild(*args, **kwargs)
AddChild(self, Window child)

+Adds a child window. This is called automatically by window creation
+functions so should not be required by the application programmer.
+ +
AdjustForLayoutDirection(*args, **kwargs)
AdjustForLayoutDirection(self, int x, int width, int widthTotal) -> int

+Mirror coordinates for RTL layout if this window uses it and if the
+mirroring is not done automatically like Win32.
+ +
AssociateHandle(*args, **kwargs)
AssociateHandle(self, long handle)

+Associate the window with a new native handle
+ +
CacheBestSize(*args, **kwargs)
CacheBestSize(self, Size size)

+Cache the best size so it doesn't need to be calculated again, (at least until
+some properties of the window change.)
+ +
CanSetTransparent(*args, **kwargs)
CanSetTransparent(self) -> bool

+Returns ``True`` if the platform supports setting the transparency for
+this window.  Note that this method will err on the side of caution,
+so it is possible that this will return ``False`` when it is in fact
+possible to set the transparency.

+NOTE: On X-windows systems the X server must have the composite
+extension loaded, and there must be a composite manager program (such
+as xcompmgr) running.
+ +
CaptureMouse(*args, **kwargs)
CaptureMouse(self)

+Directs all mouse input to this window. Call wx.Window.ReleaseMouse to
+release the capture.

+Note that wxWindows maintains the stack of windows having captured the
+mouse and when the mouse is released the capture returns to the window
+which had had captured it previously and it is only really released if
+there were no previous window. In particular, this means that you must
+release the mouse as many times as you capture it, unless the window
+receives the `wx.MouseCaptureLostEvent` event.

+Any application which captures the mouse in the beginning of some
+operation *must* handle `wx.MouseCaptureLostEvent` and cancel this
+operation when it receives the event. The event handler must not
+recapture mouse.
+ +
Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
Centre = Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CentreOnParent = CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
ClearBackground(*args, **kwargs)
ClearBackground(self)

+Clears the window by filling it with the current background
+colour. Does not cause an erase background event to be generated.
+ +
ClientToScreen(*args, **kwargs)
ClientToScreen(self, Point pt) -> Point

+Converts to screen coordinates from coordinates relative to this window.
+ +
ClientToScreenXY(*args, **kwargs)
ClientToScreenXY(int x, int y) -> (x,y)

+Converts to screen coordinates from coordinates relative to this window.
+ +
Close(*args, **kwargs)
Close(self, bool force=False) -> bool

+This function simply generates a EVT_CLOSE event whose handler usually
+tries to close the window. It doesn't close the window itself,
+however.  If force is False (the default) then the window's close
+handler will be allowed to veto the destruction of the window.
+ +
ConvertDialogPointToPixels(*args, **kwargs)
ConvertDialogPointToPixels(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertDialogSizeToPixels(*args, **kwargs)
ConvertDialogSizeToPixels(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertPixelPointToDialog(*args, **kwargs)
ConvertPixelPointToDialog(self, Point pt) -> Point
+ +
ConvertPixelSizeToDialog(*args, **kwargs)
ConvertPixelSizeToDialog(self, Size sz) -> Size
+ +
DLG_PNT(*args, **kwargs)
DLG_PNT(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
DLG_SZE(*args, **kwargs)
DLG_SZE(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
Destroy(*args, **kwargs)
Destroy(self) -> bool

+Destroys the window safely.  Frames and dialogs are not destroyed
+immediately when this function is called -- they are added to a list
+of windows to be deleted on idle time, when all the window's events
+have been processed. This prevents problems with events being sent to
+non-existent windows.

+Returns True if the window has either been successfully deleted, or it
+has been added to the list of windows pending real deletion.
+ +
DestroyChildren(*args, **kwargs)
DestroyChildren(self) -> bool

+Destroys all children of a window. Called automatically by the
+destructor.
+ +
Disable(*args, **kwargs)
Disable(self) -> bool

+Disables the window, same as Enable(false).
+ +
DissociateHandle(*args, **kwargs)
DissociateHandle(self)

+Dissociate the current native handle from the window
+ +
DragAcceptFiles(*args, **kwargs)
DragAcceptFiles(self, bool accept)

+Enables or disables eligibility for drop file events, EVT_DROP_FILES.
+Only functional on Windows.
+ +
Enable(*args, **kwargs)
Enable(self, bool enable=True) -> bool

+Enable or disable the window for user input. Note that when a parent
+window is disabled, all of its children are disabled as well and they
+are reenabled again when the parent is.  Returns true if the window
+has been enabled or disabled, false if nothing was done, i.e. if the
+window had already been in the specified state.
+ +
FindWindowById(*args, **kwargs)
FindWindowById(self, long winid) -> Window

+Find a child of this window by window ID
+ +
FindWindowByName(*args, **kwargs)
FindWindowByName(self, String name) -> Window

+Find a child of this window by name
+ +
Fit(*args, **kwargs)
Fit(self)

+Sizes the window so that it fits around its subwindows. This function
+won't do anything if there are no subwindows and will only really work
+correctly if sizers are used for the subwindows layout. Also, if the
+window has exactly one subwindow it is better (faster and the result
+is more precise as Fit adds some margin to account for fuzziness of
+its calculations) to call window.SetClientSize(child.GetSize())
+instead of calling Fit.
+ +
FitInside(*args, **kwargs)
FitInside(self)

+Similar to Fit, but sizes the interior (virtual) size of a
+window. Mainly useful with scrolled windows to reset scrollbars after
+sizing changes that do not trigger a size event, and/or scrolled
+windows without an interior sizer. This function similarly won't do
+anything if there are no subwindows.
+ +
Freeze(*args, **kwargs)
Freeze(self)

+Freezes the window or, in other words, prevents any updates from
+taking place on screen, the window is not redrawn at all. Thaw must be
+called to reenable window redrawing.  Calls to Freeze/Thaw may be
+nested, with the actual Thaw being delayed until all the nesting has
+been undone.

+This method is useful for visual appearance optimization (for example,
+it is a good idea to use it before inserting large amount of text into
+a wxTextCtrl under wxGTK) but is not implemented on all platforms nor
+for all controls so it is mostly just a hint to wxWindows and not a
+mandatory directive.
+ +
GetAcceleratorTable(*args, **kwargs)
GetAcceleratorTable(self) -> AcceleratorTable

+Gets the accelerator table for this window.
+ +
GetAdjustedBestSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetAutoLayout(*args, **kwargs)
GetAutoLayout(self) -> bool

+Returns the current autoLayout setting
+ +
GetBackgroundColour(*args, **kwargs)
GetBackgroundColour(self) -> Colour

+Returns the background colour of the window.
+ +
GetBackgroundStyle(*args, **kwargs)
GetBackgroundStyle(self) -> int

+Returns the background style of the window.

+:see: `SetBackgroundStyle`
+ +
GetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetBestSize(*args, **kwargs)
GetBestSize(self) -> Size

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestSizeTuple(*args, **kwargs)
GetBestSizeTuple() -> (width, height)

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestVirtualSize(*args, **kwargs)
GetBestVirtualSize(self) -> Size

+Return the largest of ClientSize and BestSize (as determined by a
+sizer, interior children, or other means)
+ +
GetBorder(*args)
GetBorder(self, long flags) -> int
+GetBorder(self) -> int

+Get border for the flags of this window
+ +
GetCaret(*args, **kwargs)
GetCaret(self) -> Caret

+Returns the caret associated with the window.
+ +
GetCharHeight(*args, **kwargs)
GetCharHeight(self) -> int

+Get the (average) character size for the current font.
+ +
GetCharWidth(*args, **kwargs)
GetCharWidth(self) -> int

+Get the (average) character size for the current font.
+ +
GetChildren(*args, **kwargs)
GetChildren(self) -> WindowList

+Returns an object containing a list of the window's children.  The
+object provides a Python sequence-like interface over the internal
+list maintained by the window..
+ +
GetClientAreaOrigin(*args, **kwargs)
GetClientAreaOrigin(self) -> Point

+Get the origin of the client area of the window relative to the
+window's top left corner (the client area may be shifted because of
+the borders, scrollbars, other decorations...)
+ +
GetClientRect(*args, **kwargs)
GetClientRect(self) -> Rect

+Get the client area position and size as a `wx.Rect` object.
+ +
GetClientSize(*args, **kwargs)
GetClientSize(self) -> Size

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetClientSizeTuple(*args, **kwargs)
GetClientSizeTuple() -> (width, height)

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetConstraints(*args, **kwargs)
GetConstraints(self) -> LayoutConstraints

+Returns a pointer to the window's layout constraints, or None if there
+are none.
+ +
GetContainingSizer(*args, **kwargs)
GetContainingSizer(self) -> Sizer

+Return the sizer that this window is a member of, if any, otherwise None.
+ +
GetCursor(*args, **kwargs)
GetCursor(self) -> Cursor

+Return the cursor associated with this window.
+ +
GetDefaultAttributes(*args, **kwargs)
GetDefaultAttributes(self) -> VisualAttributes

+Get the default attributes for an instance of this class.  This is
+useful if you want to use the same font or colour in your own control
+as in a standard control -- which is a much better idea than hard
+coding specific colours or fonts which might look completely out of
+place on the user's system, especially if it uses themes.
+ +
GetDropTarget(*args, **kwargs)
GetDropTarget(self) -> DropTarget

+Returns the associated drop target, which may be None.
+ +
GetEffectiveMinSize(*args, **kwargs)
GetEffectiveMinSize(self) -> Size

+This function will merge the window's best size into the window's
+minimum size, giving priority to the min size components, and returns
+the results.
+ +
GetEventHandler(*args, **kwargs)
GetEventHandler(self) -> EvtHandler

+Returns the event handler for this window. By default, the window is
+its own event handler.
+ +
GetExtraStyle(*args, **kwargs)
GetExtraStyle(self) -> long

+Returns the extra style bits for the window.
+ +
GetFont(*args, **kwargs)
GetFont(self) -> Font

+Returns the default font used for this window.
+ +
GetForegroundColour(*args, **kwargs)
GetForegroundColour(self) -> Colour

+Returns the foreground colour of the window.  The interpretation of
+foreground colour is dependent on the window class; it may be the text
+colour or other colour, or it may not be used at all.
+ +
GetFullTextExtent(*args, **kwargs)
GetFullTextExtent(String string, Font font=None) ->
+   (width, height, descent, externalLeading)

+Get the width, height, decent and leading of the text using the
+current or specified font.
+ +
GetGrandParent(*args, **kwargs)
GetGrandParent(self) -> Window

+Returns the parent of the parent of this window, or None if there
+isn't one.
+ +
GetGtkWidget(*args, **kwargs)
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+ +
GetHandle(*args, **kwargs)
GetHandle(self) -> long

+Returns the platform-specific handle (as a long integer) of the
+physical window.  On wxMSW this is the win32 window handle, on wxGTK
+it is the XWindow ID, and on wxMac it is the ControlRef.
+ +
GetHelpText(*args, **kwargs)
GetHelpText(self) -> String

+Gets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
GetHelpTextAtPoint(*args, **kwargs)
GetHelpTextAtPoint(self, Point pt, wxHelpEvent::Origin origin) -> String

+Get the help string associated with the given position in this window.

+Notice that pt may be invalid if event origin is keyboard or unknown
+and this method should return the global window help text then
+ +
GetId(*args, **kwargs)
GetId(self) -> int

+Returns the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one (or the default Id
+-1 is used) then an unique identifier with a negative value will be
+generated.
+ +
GetLabel(*args, **kwargs)
GetLabel(self) -> String

+Generic way of getting a label from any window, for identification
+purposes.  The interpretation of this function differs from class to
+class. For frames and dialogs, the value returned is the title. For
+buttons or static text controls, it is the button text. This function
+can be useful for meta-programs such as testing tools or special-needs
+access programs)which need to identify windows by name.
+ +
GetLayoutDirection(*args, **kwargs)
GetLayoutDirection(self) -> int

+Get the layout direction (LTR or RTL) for this window.  Returns
+``wx.Layout_Default`` if layout direction is not supported.
+ +
GetMaxHeight(*args, **kwargs)
GetMaxHeight(self) -> int
+ +
GetMaxSize(*args, **kwargs)
GetMaxSize(self) -> Size
+ +
GetMaxWidth(*args, **kwargs)
GetMaxWidth(self) -> int
+ +
GetMinHeight(*args, **kwargs)
GetMinHeight(self) -> int
+ +
GetMinSize(*args, **kwargs)
GetMinSize(self) -> Size
+ +
GetMinWidth(*args, **kwargs)
GetMinWidth(self) -> int
+ +
GetName(*args, **kwargs)
GetName(self) -> String

+Returns the windows name.  This name is not guaranteed to be unique;
+it is up to the programmer to supply an appropriate name in the window
+constructor or via wx.Window.SetName.
+ +
GetParent(*args, **kwargs)
GetParent(self) -> Window

+Returns the parent window of this window, or None if there isn't one.
+ +
GetPosition(*args, **kwargs)
GetPosition(self) -> Point

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetPositionTuple(*args, **kwargs)
GetPositionTuple() -> (x,y)

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetRect(*args, **kwargs)
GetRect(self) -> Rect

+Returns the size and position of the window as a `wx.Rect` object.
+ +
GetScreenPosition(*args, **kwargs)
GetScreenPosition(self) -> Point

+Get the position of the window in screen coordinantes.
+ +
GetScreenPositionTuple(*args, **kwargs)
GetScreenPositionTuple() -> (x,y)

+Get the position of the window in screen coordinantes.
+ +
GetScreenRect(*args, **kwargs)
GetScreenRect(self) -> Rect

+Returns the size and position of the window in screen coordinantes as
+a `wx.Rect` object.
+ +
GetScrollPos(*args, **kwargs)
GetScrollPos(self, int orientation) -> int

+Returns the built-in scrollbar position.
+ +
GetScrollRange(*args, **kwargs)
GetScrollRange(self, int orientation) -> int

+Returns the built-in scrollbar range.
+ +
GetScrollThumb(*args, **kwargs)
GetScrollThumb(self, int orientation) -> int

+Returns the built-in scrollbar thumb size.
+ +
GetSize(*args, **kwargs)
GetSize(self) -> Size

+Get the window size.
+ +
GetSizeTuple(*args, **kwargs)
GetSizeTuple() -> (width, height)

+Get the window size.
+ +
GetSizer(*args, **kwargs)
GetSizer(self) -> Sizer

+Return the sizer associated with the window by a previous call to
+SetSizer or None if there isn't one.
+ +
GetTextExtent(*args, **kwargs)
GetTextExtent(String string) -> (width, height)

+Get the width and height of the text using the current font.
+ +
GetThemeEnabled(*args, **kwargs)
GetThemeEnabled(self) -> bool

+Return the themeEnabled flag.
+ +
GetToolTip(*args, **kwargs)
GetToolTip(self) -> ToolTip

+get the associated tooltip or None if none
+ +
GetTopLevelParent(*args, **kwargs)
GetTopLevelParent(self) -> Window

+Returns the first frame or dialog in this window's parental hierarchy.
+ +
GetUpdateClientRect(*args, **kwargs)
GetUpdateClientRect(self) -> Rect

+Get the update rectangle region bounding box in client coords.
+ +
GetUpdateRegion(*args, **kwargs)
GetUpdateRegion(self) -> Region

+Returns the region specifying which parts of the window have been
+damaged. Should only be called within an EVT_PAINT handler.
+ +
GetValidator(*args, **kwargs)
GetValidator(self) -> Validator

+Returns a pointer to the current validator for the window, or None if
+there is none.
+ +
GetVirtualSize(*args, **kwargs)
GetVirtualSize(self) -> Size

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetVirtualSizeTuple(*args, **kwargs)
GetVirtualSizeTuple() -> (width, height)

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetWindowBorderSize(*args, **kwargs)
GetWindowBorderSize(self) -> Size

+Return the size of the left/right and top/bottom borders.
+ +
GetWindowStyle = GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowVariant(*args, **kwargs)
GetWindowVariant(self) -> int
+ +
HasCapture(*args, **kwargs)
HasCapture(self) -> bool

+Returns true if this window has the current mouse capture.
+ +
HasFlag(*args, **kwargs)
HasFlag(self, int flag) -> bool

+Test if the given style is set for this window.
+ +
HasMultiplePages(*args, **kwargs)
HasMultiplePages(self) -> bool
+ +
HasScrollbar(*args, **kwargs)
HasScrollbar(self, int orient) -> bool

+Does the window have the scrollbar for this orientation?
+ +
HasTransparentBackground(*args, **kwargs)
HasTransparentBackground(self) -> bool

+Returns True if this window's background is transparent (as, for
+example, for `wx.StaticText`) and should show the parent window's
+background.

+This method is mostly used internally by the library itself and you
+normally shouldn't have to call it. You may, however, have to override
+it in your custom control classes to ensure that background is painted
+correctly.
+ +
Hide(*args, **kwargs)
Hide(self) -> bool

+Equivalent to calling Show(False).
+ +
HitTest(*args, **kwargs)
HitTest(self, Point pt) -> int

+Test where the given (in client coords) point lies
+ +
HitTestXY(*args, **kwargs)
HitTestXY(self, int x, int y) -> int

+Test where the given (in client coords) point lies
+ +
InheritAttributes(*args, **kwargs)
InheritAttributes(self)

+This function is (or should be, in case of custom controls) called
+during window creation to intelligently set up the window visual
+attributes, that is the font and the foreground and background
+colours.

+By 'intelligently' the following is meant: by default, all windows use
+their own default attributes. However if some of the parent's
+attributes are explicitly changed (that is, using SetFont and not
+SetOwnFont) and if the corresponding attribute hadn't been
+explicitly set for this window itself, then this window takes the same
+value as used by the parent. In addition, if the window overrides
+ShouldInheritColours to return false, the colours will not be changed
+no matter what and only the font might.

+This rather complicated logic is necessary in order to accommodate the
+different usage scenarios. The most common one is when all default
+attributes are used and in this case, nothing should be inherited as
+in modern GUIs different controls use different fonts (and colours)
+than their siblings so they can't inherit the same value from the
+parent. However it was also deemed desirable to allow to simply change
+the attributes of all children at once by just changing the font or
+colour of their common parent, hence in this case we do inherit the
+parents attributes.
+ +
InheritsBackgroundColour(*args, **kwargs)
InheritsBackgroundColour(self) -> bool
+ +
InitDialog(*args, **kwargs)
InitDialog(self)

+Sends an EVT_INIT_DIALOG event, whose handler usually transfers data
+to the dialog via validators.
+ +
InvalidateBestSize(*args, **kwargs)
InvalidateBestSize(self)

+Reset the cached best size value so it will be recalculated the next
+time it is needed.
+ +
IsBeingDeleted(*args, **kwargs)
IsBeingDeleted(self) -> bool

+Is the window in the process of being deleted?
+ +
IsDoubleBuffered(*args, **kwargs)
IsDoubleBuffered(self) -> bool

+Returns ``True`` if the window contents is double-buffered by the
+system, i.e. if any drawing done on the window is really done on a
+temporary backing surface and transferred to the screen all at once
+later.
+ +
IsEnabled(*args, **kwargs)
IsEnabled(self) -> bool

+Returns true if the window is enabled for input, false otherwise.
+ +
IsExposed(*args, **kwargs)
IsExposed(self, int x, int y, int w=1, int h=1) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedPoint(*args, **kwargs)
IsExposedPoint(self, Point pt) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedRect(*args, **kwargs)
IsExposedRect(self, Rect rect) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsFrozen(*args, **kwargs)
IsFrozen(self) -> bool

+Returns ``True`` if the window has been frozen and not thawed yet.

+:see: `Freeze` and `Thaw`
+ +
IsRetained(*args, **kwargs)
IsRetained(self) -> bool

+Returns true if the window is retained, false otherwise.  Retained
+windows are only available on X platforms.
+ +
IsShown(*args, **kwargs)
IsShown(self) -> bool

+Returns true if the window is shown, false if it has been hidden.
+ +
IsShownOnScreen(*args, **kwargs)
IsShownOnScreen(self) -> bool

+Returns ``True`` if the window is physically visible on the screen,
+i.e. it is shown and all its parents up to the toplevel window are
+shown as well.
+ +
IsTopLevel(*args, **kwargs)
IsTopLevel(self) -> bool

+Returns true if the given window is a top-level one. Currently all
+frames and dialogs are always considered to be top-level windows (even
+if they have a parent window).
+ +
Layout(*args, **kwargs)
Layout(self) -> bool

+Invokes the constraint-based layout algorithm or the sizer-based
+algorithm for this window.  See SetAutoLayout: when auto layout is on,
+this function gets called automatically by the default EVT_SIZE
+handler when the window is resized.
+ +
LineDown(*args, **kwargs)
LineDown(self) -> bool

+This is just a wrapper for ScrollLines(1).
+ +
LineUp(*args, **kwargs)
LineUp(self) -> bool

+This is just a wrapper for ScrollLines(-1).
+ +
Lower(*args, **kwargs)
Lower(self)

+Lowers the window to the bottom of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
MakeModal(*args, **kwargs)
MakeModal(self, bool modal=True)

+Disables all other windows in the application so that the user can
+only interact with this window.  Passing False will reverse this
+effect.
+ +
Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
MoveAfterInTabOrder(*args, **kwargs)
MoveAfterInTabOrder(self, Window win)

+Moves this window in the tab navigation order after the specified
+sibling window.  This means that when the user presses the TAB key on
+that other window, the focus switches to this window.

+The default tab order is the same as creation order.  This function
+and `MoveBeforeInTabOrder` allow to change it after creating all the
+windows.
+ +
MoveBeforeInTabOrder(*args, **kwargs)
MoveBeforeInTabOrder(self, Window win)

+Same as `MoveAfterInTabOrder` except that it inserts this window just
+before win instead of putting it right after it.
+ +
MoveXY(*args, **kwargs)
MoveXY(self, int x, int y, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
Navigate(*args, **kwargs)
Navigate(self, int flags=NavigationKeyEvent.IsForward) -> bool

+Does keyboard navigation from this window to another, by sending a
+`wx.NavigationKeyEvent`.
+ +
PageDown(*args, **kwargs)
PageDown(self) -> bool

+This is just a wrapper for ScrollPages(1).
+ +
PageUp(*args, **kwargs)
PageUp(self) -> bool

+This is just a wrapper for ScrollPages(-1).
+ +
PopEventHandler(*args, **kwargs)
PopEventHandler(self, bool deleteHandler=False) -> EvtHandler

+Removes and returns the top-most event handler on the event handler
+stack.  If deleteHandler is True then the wx.EvtHandler object will be
+destroyed after it is popped, and ``None`` will be returned instead.
+ +
PopupMenu(*args, **kwargs)
PopupMenu(self, Menu menu, Point pos=DefaultPosition) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PopupMenuXY(*args, **kwargs)
PopupMenuXY(self, Menu menu, int x=-1, int y=-1) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PostCreate(self, pre)
Phase 3 of the 2-phase create <wink!>
+Call this method after precreating the window with the 2-phase create method.
+ +
PrepareDC(*args, **kwargs)
PrepareDC(self, DC dc)

+Call this function to prepare the device context for drawing a
+scrolled image. It sets the device origin according to the current
+scroll position.
+ +
PushEventHandler(*args, **kwargs)
PushEventHandler(self, EvtHandler handler)

+Pushes this event handler onto the event handler stack for the window.
+An event handler is an object that is capable of processing the events
+sent to a window.  (In other words, is able to dispatch the events to a
+handler function.)  By default, the window is its own event handler,
+but an application may wish to substitute another, for example to
+allow central implementation of event-handling for a variety of
+different window classes.

+wx.Window.PushEventHandler allows an application to set up a chain of
+event handlers, where an event not handled by one event handler is
+handed to the next one in the chain.  Use `wx.Window.PopEventHandler`
+to remove the event handler.  Ownership of the handler is *not* given
+to the window, so you should be sure to pop the handler before the
+window is destroyed and either let PopEventHandler destroy it, or call
+its Destroy method yourself.
+ +
Raise(*args, **kwargs)
Raise(self)

+Raises the window to the top of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
Refresh(*args, **kwargs)
Refresh(self, bool eraseBackground=True, Rect rect=None)

+Mark the specified rectangle (or the whole window) as "dirty" so it
+will be repainted.  Causes an EVT_PAINT event to be generated and sent
+to the window.
+ +
RefreshRect(*args, **kwargs)
RefreshRect(self, Rect rect, bool eraseBackground=True)

+Redraws the contents of the given rectangle: the area inside it will
+be repainted.  This is the same as Refresh but has a nicer syntax.
+ +
RegisterHotKey(*args, **kwargs)
RegisterHotKey(self, int hotkeyId, int modifiers, int keycode) -> bool

+Registers a system wide hotkey. Every time the user presses the hotkey
+registered here, this window will receive a hotkey event. It will
+receive the event even if the application is in the background and
+does not have the input focus because the user is working with some
+other application.  To bind an event handler function to this hotkey
+use EVT_HOTKEY with an id equal to hotkeyId.  Returns True if the
+hotkey was registered successfully.
+ +
ReleaseMouse(*args, **kwargs)
ReleaseMouse(self)

+Releases mouse input captured with wx.Window.CaptureMouse.
+ +
RemoveChild(*args, **kwargs)
RemoveChild(self, Window child)

+Removes a child window. This is called automatically by window
+deletion functions so should not be required by the application
+programmer.
+ +
RemoveEventHandler(*args, **kwargs)
RemoveEventHandler(self, EvtHandler handler) -> bool

+Find the given handler in the event handler chain and remove (but not
+delete) it from the event handler chain, returns True if it was found
+and False otherwise (this also results in an assert failure so this
+function should only be called when the handler is supposed to be
+there.)
+ +
Reparent(*args, **kwargs)
Reparent(self, Window newParent) -> bool

+Reparents the window, i.e the window will be removed from its current
+parent window (e.g. a non-standard toolbar in a wxFrame) and then
+re-inserted into another. Available on Windows and GTK.  Returns True
+if the parent was changed, False otherwise (error or newParent ==
+oldParent)
+ +
ScreenToClient(*args, **kwargs)
ScreenToClient(self, Point pt) -> Point

+Converts from screen to client window coordinates.
+ +
ScreenToClientXY(*args, **kwargs)
ScreenToClientXY(int x, int y) -> (x,y)

+Converts from screen to client window coordinates.
+ +
ScrollLines(*args, **kwargs)
ScrollLines(self, int lines) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of lines down, if lines is positive, or up if lines
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollPages(*args, **kwargs)
ScrollPages(self, int pages) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of pages down, if pages is positive, or up if pages
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollWindow(*args, **kwargs)
ScrollWindow(self, int dx, int dy, Rect rect=None)

+Physically scrolls the pixels in the window and move child windows
+accordingly.  Use this function to optimise your scrolling
+implementations, to minimise the area that must be redrawn. Note that
+it is rarely required to call this function from a user program.
+ +
SetAcceleratorTable(*args, **kwargs)
SetAcceleratorTable(self, AcceleratorTable accel)

+Sets the accelerator table for this window.
+ +
SetAutoLayout(*args, **kwargs)
SetAutoLayout(self, bool autoLayout)

+Determines whether the Layout function will be called automatically
+when the window is resized.  lease note that this only happens for the
+windows usually used to contain children, namely `wx.Panel` and
+`wx.TopLevelWindow` (and the classes deriving from them).

+This method is called implicitly by `SetSizer` but if you use
+`SetConstraints` you should call it manually or otherwise the window
+layout won't be correctly updated when its size changes.
+ +
SetBackgroundColour(*args, **kwargs)
SetBackgroundColour(self, Colour colour) -> bool

+Sets the background colour of the window.  Returns True if the colour
+was changed.  The background colour is usually painted by the default
+EVT_ERASE_BACKGROUND event handler function under Windows and
+automatically under GTK.  Using `wx.NullColour` will reset the window
+to the default background colour.

+Note that setting the background colour may not cause an immediate
+refresh, so you may wish to call `ClearBackground` or `Refresh` after
+calling this function.

+Using this function will disable attempts to use themes for this
+window, if the system supports them.  Use with care since usually the
+themes represent the appearance chosen by the user to be used for all
+applications on the system.
+ +
SetBackgroundStyle(*args, **kwargs)
SetBackgroundStyle(self, int style) -> bool

+Returns the background style of the window. The background style
+indicates how the background of the window is drawn.

+    ======================  ========================================
+    wx.BG_STYLE_SYSTEM      The background colour or pattern should
+                            be determined by the system
+    wx.BG_STYLE_COLOUR      The background should be a solid colour
+    wx.BG_STYLE_CUSTOM      The background will be implemented by the
+                            application.
+    ======================  ========================================

+On GTK+, use of wx.BG_STYLE_CUSTOM allows the flicker-free drawing of
+a custom background, such as a tiled bitmap. Currently the style has
+no effect on other platforms.

+:see: `GetBackgroundStyle`, `SetBackgroundColour`
+ +
SetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `SetInitialSize`
+ +
SetCaret(*args, **kwargs)
SetCaret(self, Caret caret)

+Sets the caret associated with the window.
+ +
SetClientRect(*args, **kwargs)
SetClientRect(self, Rect rect)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSize(*args, **kwargs)
SetClientSize(self, Size size)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSizeWH(*args, **kwargs)
SetClientSizeWH(self, int width, int height)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetConstraints(*args, **kwargs)
SetConstraints(self, LayoutConstraints constraints)

+Sets the window to have the given layout constraints. If an existing
+layout constraints object is already owned by the window, it will be
+deleted.  Pass None to disassociate and delete the window's current
+constraints.

+You must call SetAutoLayout to tell a window to use the constraints
+automatically in its default EVT_SIZE handler; otherwise, you must
+handle EVT_SIZE yourself and call Layout() explicitly. When setting
+both a wx.LayoutConstraints and a wx.Sizer, only the sizer will have
+effect.
+ +
SetContainingSizer(*args, **kwargs)
SetContainingSizer(self, Sizer sizer)

+This normally does not need to be called by application code. It is
+called internally when a window is added to a sizer, and is used so
+the window can remove itself from the sizer when it is destroyed.
+ +
SetCursor(*args, **kwargs)
SetCursor(self, Cursor cursor) -> bool

+Sets the window's cursor. Notice that the window cursor also sets it
+for the children of the window implicitly.

+The cursor may be wx.NullCursor in which case the window cursor will
+be reset back to default.
+ +
SetDimensions(*args, **kwargs)
SetDimensions(self, int x, int y, int width, int height, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels.  The sizeFlags
+parameter indicates the interpretation of the other params if they are
+equal to -1.

+    ========================  ======================================
+    wx.SIZE_AUTO              A -1 indicates that a class-specific
+                              default should be used.
+    wx.SIZE_USE_EXISTING      Axisting dimensions should be used if
+                              -1 values are supplied.
+    wxSIZE_ALLOW_MINUS_ONE    Allow dimensions of -1 and less to be
+                              interpreted as real dimensions, not
+                              default values.
+    ========================  ======================================
+ +
SetDoubleBuffered(*args, **kwargs)
SetDoubleBuffered(self, bool on)

+Currently wxGTK2 only.
+ +
SetDropTarget(*args, **kwargs)
SetDropTarget(self, DropTarget dropTarget)

+Associates a drop target with this window.  If the window already has
+a drop target, it is deleted.
+ +
SetEventHandler(*args, **kwargs)
SetEventHandler(self, EvtHandler handler)

+Sets the event handler for this window.  An event handler is an object
+that is capable of processing the events sent to a window.  (In other
+words, is able to dispatch the events to handler function.)  By
+default, the window is its own event handler, but an application may
+wish to substitute another, for example to allow central
+implementation of event-handling for a variety of different window
+classes.

+It is usually better to use `wx.Window.PushEventHandler` since this sets
+up a chain of event handlers, where an event not handled by one event
+handler is handed off to the next one in the chain.
+ +
SetExtraStyle(*args, **kwargs)
SetExtraStyle(self, long exStyle)

+Sets the extra style bits for the window.  Extra styles are the less
+often used style bits which can't be set with the constructor or with
+SetWindowStyleFlag()
+ +
SetFocus(*args, **kwargs)
SetFocus(self)

+Set's the focus to this window, allowing it to receive keyboard input.
+ +
SetFocusFromKbd(*args, **kwargs)
SetFocusFromKbd(self)

+Set focus to this window as the result of a keyboard action.  Normally
+only called internally.
+ +
SetFont(*args, **kwargs)
SetFont(self, Font font) -> bool

+Sets the font for this window.
+ +
SetForegroundColour(*args, **kwargs)
SetForegroundColour(self, Colour colour) -> bool

+Sets the foreground colour of the window.  Returns True is the colour
+was changed.  The interpretation of foreground colour is dependent on
+the window class; it may be the text colour or other colour, or it may
+not be used at all.
+ +
SetHelpText(*args, **kwargs)
SetHelpText(self, String text)

+Sets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
SetHelpTextForId(*args, **kwargs)
SetHelpTextForId(self, String text)

+Associate this help text with all windows with the same id as this
+one.
+ +
SetId(*args, **kwargs)
SetId(self, int winid)

+Sets the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one, an identifier
+will be generated. Normally, the identifier should be provided on
+creation and should not be modified subsequently.
+ +
SetInitialSize(*args, **kwargs)
SetInitialSize(self, Size size=DefaultSize)

+A 'Smart' SetSize that will fill in default size components with the
+window's *best size* values.  Also set's the minsize for use with sizers.
+ +
SetLabel(*args, **kwargs)
SetLabel(self, String label)

+Set the text which the window shows in its label if applicable.
+ +
SetLayoutDirection(*args, **kwargs)
SetLayoutDirection(self, int dir)

+Set the layout direction (LTR or RTL) for this window.
+ +
SetMaxSize(*args, **kwargs)
SetMaxSize(self, Size maxSize)

+A more convenient method than `SetSizeHints` for setting just the
+max size.
+ +
SetMinSize(*args, **kwargs)
SetMinSize(self, Size minSize)

+A more convenient method than `SetSizeHints` for setting just the
+min size.
+ +
SetName(*args, **kwargs)
SetName(self, String name)

+Sets the window's name.  The window name is used for ressource setting
+in X, it is not the same as the window title/label
+ +
SetOwnBackgroundColour(*args, **kwargs)
SetOwnBackgroundColour(self, Colour colour)
+ +
SetOwnFont(*args, **kwargs)
SetOwnFont(self, Font font)
+ +
SetOwnForegroundColour(*args, **kwargs)
SetOwnForegroundColour(self, Colour colour)
+ +
SetPosition = Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
SetRect(*args, **kwargs)
SetRect(self, Rect rect, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels using a wx.Rect.
+ +
SetScrollPos(*args, **kwargs)
SetScrollPos(self, int orientation, int pos, bool refresh=True)

+Sets the position of one of the built-in scrollbars.
+ +
SetScrollbar(*args, **kwargs)
SetScrollbar(self, int orientation, int position, int thumbSize, int range, 
+    bool refresh=True)

+Sets the scrollbar properties of a built-in scrollbar.
+ +
SetSize(*args, **kwargs)
SetSize(self, Size size)

+Sets the size of the window in pixels.
+ +
SetSizeHints(*args, **kwargs)
SetSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1, int incW=-1, 
+    int incH=-1)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeHintsSz(*args, **kwargs)
SetSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize, Size incSize=DefaultSize)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeWH(*args, **kwargs)
SetSizeWH(self, int width, int height)

+Sets the size of the window in pixels.
+ +
SetSizer(*args, **kwargs)
SetSizer(self, Sizer sizer, bool deleteOld=True)

+Sets the window to have the given layout sizer. The window will then
+own the object, and will take care of its deletion. If an existing
+layout sizer object is already owned by the window, it will be deleted
+if the deleteOld parameter is true. Note that this function will also
+call SetAutoLayout implicitly with a True parameter if the sizer is
+non-None, and False otherwise.
+ +
SetSizerAndFit(*args, **kwargs)
SetSizerAndFit(self, Sizer sizer, bool deleteOld=True)

+The same as SetSizer, except it also sets the size hints for the
+window based on the sizer's minimum size.
+ +
SetThemeEnabled(*args, **kwargs)
SetThemeEnabled(self, bool enableTheme)

+This function tells a window if it should use the system's "theme"
+ code to draw the windows' background instead if its own background
+ drawing code. This will only have an effect on platforms that support
+ the notion of themes in user defined windows. One such platform is
+ GTK+ where windows can have (very colourful) backgrounds defined by a
+ user's selected theme.

+Dialogs, notebook pages and the status bar have this flag set to true
+by default so that the default look and feel is simulated best.
+ +
SetToolTip(*args, **kwargs)
SetToolTip(self, ToolTip tip)

+Attach a tooltip to the window.
+ +
SetToolTipString(*args, **kwargs)
SetToolTipString(self, String tip)

+Attach a tooltip to the window.
+ +
SetTransparent(*args, **kwargs)
SetTransparent(self, byte alpha) -> bool

+Attempt to set the transparency of this window to the ``alpha`` value,
+returns True on success.  The ``alpha`` value is an integer in the
+range of 0 to 255, where 0 is fully transparent and 255 is fully
+opaque.
+ +
SetValidator(*args, **kwargs)
SetValidator(self, Validator validator)

+Deletes the current validator (if any) and sets the window validator,
+having called wx.Validator.Clone to create a new validator of this
+type.
+ +
SetVirtualSize(*args, **kwargs)
SetVirtualSize(self, Size size)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetVirtualSizeHints(*args, **kwargs)
SetVirtualSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeHintsSz(*args, **kwargs)
SetVirtualSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeWH(*args, **kwargs)
SetVirtualSizeWH(self, int w, int h)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetWindowStyle = SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowVariant(*args, **kwargs)
SetWindowVariant(self, int variant)

+Sets the variant of the window/font size to use for this window, if
+the platform supports variants, for example, wxMac.
+ +
ShouldInheritColours(*args, **kwargs)
ShouldInheritColours(self) -> bool

+Return true from here to allow the colours of this window to be
+changed by InheritAttributes, returning false forbids inheriting them
+from the parent window.

+The base class version returns false, but this method is overridden in
+wxControl where it returns true.
+ +
Show(*args, **kwargs)
Show(self, bool show=True) -> bool

+Shows or hides the window. You may need to call Raise for a top level
+window if you want to bring it to top, although this is not needed if
+Show is called immediately after the frame creation.  Returns True if
+the window has been shown or hidden or False if nothing was done
+because it already was in the requested state.
+ +
Thaw(*args, **kwargs)
Thaw(self)

+Reenables window updating after a previous call to Freeze.  Calls to
+Freeze/Thaw may be nested, so Thaw must be called the same number of
+times that Freeze was before the window will be updated.
+ +
ToggleWindowStyle(*args, **kwargs)
ToggleWindowStyle(self, int flag) -> bool

+Turn the flag on if it had been turned off before and vice versa,
+returns True if the flag is turned on by this function call.
+ +
TransferDataFromWindow(*args, **kwargs)
TransferDataFromWindow(self) -> bool

+Transfers values from child controls to data areas specified by their
+validators. Returns false if a transfer failed.  If the window has
+wx.WS_EX_VALIDATE_RECURSIVELY extra style flag set, the method will
+also call TransferDataFromWindow() of all child windows.
+ +
TransferDataToWindow(*args, **kwargs)
TransferDataToWindow(self) -> bool

+Transfers values to child controls from data areas specified by their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call TransferDataToWindow() of
+all child windows.
+ +
UnregisterHotKey(*args, **kwargs)
UnregisterHotKey(self, int hotkeyId) -> bool

+Unregisters a system wide hotkey.
+ +
Update(*args, **kwargs)
Update(self)

+Calling this method immediately repaints the invalidated area of the
+window instead of waiting for the EVT_PAINT event to happen, (normally
+this would usually only happen when the flow of control returns to the
+event loop.)  Notice that this function doesn't refresh the window and
+does nothing if the window has been already repainted.  Use `Refresh`
+first if you want to immediately redraw the window (or some portion of
+it) unconditionally.
+ +
UpdateWindowUI(*args, **kwargs)
UpdateWindowUI(self, long flags=UPDATE_UI_NONE)

+This function sends EVT_UPDATE_UI events to the window. The particular
+implementation depends on the window; for example a wx.ToolBar will
+send an update UI event for each toolbar button, and a wx.Frame will
+send an update UI event for each menubar menu item. You can call this
+function from your application to ensure that your UI is up-to-date at
+a particular point in time (as far as your EVT_UPDATE_UI handlers are
+concerned). This may be necessary if you have called
+`wx.UpdateUIEvent.SetMode` or `wx.UpdateUIEvent.SetUpdateInterval` to
+limit the overhead that wxWindows incurs by sending update UI events
+in idle time.
+ +
UseBgCol(*args, **kwargs)
UseBgCol(self) -> bool
+ +
Validate(*args, **kwargs)
Validate(self) -> bool

+Validates the current values of the child controls using their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call Validate() of all child
+windows.  Returns false if any of the validations failed.
+ +
WarpPointer(*args, **kwargs)
WarpPointer(self, int x, int y)

+Moves the pointer to the given position on the window.

+NOTE: This function is not supported under Mac because Apple Human
+Interface Guidelines forbid moving the mouse cursor programmatically.
+ +
+Static methods inherited from wx._core.Window:
+
FindFocus(*args, **kwargs)
FindFocus() -> Window

+Returns the window or control that currently has the keyboard focus,
+or None.
+ +
GetCapture(*args, **kwargs)
GetCapture() -> Window

+Returns the window which currently captures the mouse or None
+ +
NewControlId(*args, **kwargs)
NewControlId() -> int

+Generate a control id for the controls which were not given one.
+ +
NextControlId(*args, **kwargs)
NextControlId(int winid) -> int

+Get the id of the control following the one with the given
+autogenerated) id
+ +
PrevControlId(*args, **kwargs)
PrevControlId(int winid) -> int

+Get the id of the control preceding the one with the given
+autogenerated) id
+ +
+Data descriptors inherited from wx._core.Window:
+
AcceleratorTable
+
See `GetAcceleratorTable` and `SetAcceleratorTable`
+
+
AutoLayout
+
See `GetAutoLayout` and `SetAutoLayout`
+
+
BackgroundColour
+
See `GetBackgroundColour` and `SetBackgroundColour`
+
+
BackgroundStyle
+
See `GetBackgroundStyle` and `SetBackgroundStyle`
+
+
BestSize
+
See `GetBestSize`
+
+
BestVirtualSize
+
See `GetBestVirtualSize`
+
+
Border
+
See `GetBorder`
+
+
Caret
+
See `GetCaret` and `SetCaret`
+
+
CharHeight
+
See `GetCharHeight`
+
+
CharWidth
+
See `GetCharWidth`
+
+
Children
+
See `GetChildren`
+
+
ClientAreaOrigin
+
See `GetClientAreaOrigin`
+
+
ClientRect
+
See `GetClientRect` and `SetClientRect`
+
+
ClientSize
+
See `GetClientSize` and `SetClientSize`
+
+
Constraints
+
See `GetConstraints` and `SetConstraints`
+
+
ContainingSizer
+
See `GetContainingSizer` and `SetContainingSizer`
+
+
Cursor
+
See `GetCursor` and `SetCursor`
+
+
DefaultAttributes
+
See `GetDefaultAttributes`
+
+
DropTarget
+
See `GetDropTarget` and `SetDropTarget`
+
+
EffectiveMinSize
+
See `GetEffectiveMinSize`
+
+
Enabled
+
See `IsEnabled` and `Enable`
+
+
EventHandler
+
See `GetEventHandler` and `SetEventHandler`
+
+
ExtraStyle
+
See `GetExtraStyle` and `SetExtraStyle`
+
+
Font
+
See `GetFont` and `SetFont`
+
+
ForegroundColour
+
See `GetForegroundColour` and `SetForegroundColour`
+
+
GrandParent
+
See `GetGrandParent`
+
+
GtkWidget
+
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+
+
Handle
+
See `GetHandle`
+
+
HelpText
+
See `GetHelpText` and `SetHelpText`
+
+
Id
+
See `GetId` and `SetId`
+
+
Label
+
See `GetLabel` and `SetLabel`
+
+
LayoutDirection
+
See `GetLayoutDirection` and `SetLayoutDirection`
+
+
MaxHeight
+
See `GetMaxHeight`
+
+
MaxSize
+
See `GetMaxSize` and `SetMaxSize`
+
+
MaxWidth
+
See `GetMaxWidth`
+
+
MinHeight
+
See `GetMinHeight`
+
+
MinSize
+
See `GetMinSize` and `SetMinSize`
+
+
MinWidth
+
See `GetMinWidth`
+
+
Name
+
See `GetName` and `SetName`
+
+
Parent
+
See `GetParent`
+
+
Position
+
See `GetPosition` and `SetPosition`
+
+
Rect
+
See `GetRect` and `SetRect`
+
+
ScreenPosition
+
See `GetScreenPosition`
+
+
ScreenRect
+
See `GetScreenRect`
+
+
Shown
+
See `IsShown` and `Show`
+
+
Size
+
See `GetSize` and `SetSize`
+
+
Sizer
+
See `GetSizer` and `SetSizer`
+
+
ThemeEnabled
+
See `GetThemeEnabled` and `SetThemeEnabled`
+
+
ToolTip
+
See `GetToolTip` and `SetToolTip`
+
+
TopLevel
+
See `IsTopLevel`
+
+
TopLevelParent
+
See `GetTopLevelParent`
+
+
UpdateClientRect
+
See `GetUpdateClientRect`
+
+
UpdateRegion
+
See `GetUpdateRegion`
+
+
Validator
+
See `GetValidator` and `SetValidator`
+
+
VirtualSize
+
See `GetVirtualSize` and `SetVirtualSize`
+
+
WindowStyle
+
See `GetWindowStyle` and `SetWindowStyle`
+
+
WindowStyleFlag
+
See `GetWindowStyleFlag` and `SetWindowStyleFlag`
+
+
WindowVariant
+
See `GetWindowVariant` and `SetWindowVariant`
+
+
+Methods inherited from wx._core.EvtHandler:
+
AddPendingEvent(*args, **kwargs)
AddPendingEvent(self, Event event)
+ +
Bind(self, event, handler, source=None, id=-1, id2=-1)
Bind an event to an event handler.

+:param event: One of the EVT_* objects that specifies the
+              type of event to bind,

+:param handler: A callable object to be invoked when the
+              event is delivered to self.  Pass None to
+              disconnect an event handler.

+:param source: Sometimes the event originates from a
+              different window than self, but you still
+              want to catch it in self.  (For example, a
+              button event delivered to a frame.)  By
+              passing the source of the event, the event
+              handling system is able to differentiate
+              between the same event type from different
+              controls.

+:param id: Used to spcify the event source by ID instead
+           of instance.

+:param id2: Used when it is desirable to bind a handler
+              to a range of IDs, such as with EVT_MENU_RANGE.
+ +
Connect(*args, **kwargs)
Connect(self, int id, int lastId, int eventType, PyObject func)
+ +
Disconnect(*args, **kwargs)
Disconnect(self, int id, int lastId=-1, EventType eventType=wxEVT_NULL) -> bool
+ +
GetEvtHandlerEnabled(*args, **kwargs)
GetEvtHandlerEnabled(self) -> bool
+ +
GetNextHandler(*args, **kwargs)
GetNextHandler(self) -> EvtHandler
+ +
GetPreviousHandler(*args, **kwargs)
GetPreviousHandler(self) -> EvtHandler
+ +
ProcessEvent(*args, **kwargs)
ProcessEvent(self, Event event) -> bool
+ +
ProcessPendingEvents(*args, **kwargs)
ProcessPendingEvents(self)
+ +
SetEvtHandlerEnabled(*args, **kwargs)
SetEvtHandlerEnabled(self, bool enabled)
+ +
SetNextHandler(*args, **kwargs)
SetNextHandler(self, EvtHandler handler)
+ +
SetPreviousHandler(*args, **kwargs)
SetPreviousHandler(self, EvtHandler handler)
+ +
Unbind(self, event, source=None, id=-1, id2=-1)
Disconencts the event handler binding for event from self.
+Returns True if successful.
+ +
+Data descriptors inherited from wx._core.EvtHandler:
+
EvtHandlerEnabled
+
See `GetEvtHandlerEnabled` and `SetEvtHandlerEnabled`
+
+
NextHandler
+
See `GetNextHandler` and `SetNextHandler`
+
+
PreviousHandler
+
See `GetPreviousHandler` and `SetPreviousHandler`
+
+
+Methods inherited from wx._core.Object:
+
GetClassName(*args, **kwargs)
GetClassName(self) -> String

+Returns the class name of the C++ class using wxRTTI.
+ +
IsSameAs(*args, **kwargs)
IsSameAs(self, Object p) -> bool

+For wx.Objects that use C++ reference counting internally, this method
+can be used to determine if two objects are referencing the same data
+object.
+ +
+Data descriptors inherited from wx._core.Object:
+
ClassName
+
See `GetClassName`
+
+
__dict__
+
dictionary for instance variables (if defined)
+
+
__weakref__
+
list of weak references to the object (if defined)
+
+

+ + + + + +
 
+Functions
       
create(parent)
created by Boa-constructor
+

+ + + + + +
 
+Data
       wxID_ROOT = 162
+wxID_ROOTMENUABOUTABOUT = 174
+wxID_ROOTMENUABOUTHELP = 175
+wxID_ROOTMENUFILECLOSE = 165
+wxID_ROOTMENUFILEEXIT = 166
+wxID_ROOTMENUFILEEXPORT = 167
+wxID_ROOTMENUFILEIMPORT = 168
+wxID_ROOTMENUFILENEW = 169
+wxID_ROOTMENUFILEOPEN = 170
+wxID_ROOTMENUFILEPREFERENCES = 171
+wxID_ROOTMENUFILESAVE = 172
+wxID_ROOTMENUFILESAVEAS = 173
+wxID_ROOTMENUPAGECHOICECHANGEPAIRTITLE = 176
+wxID_ROOTMENUPAGECHOICECHANGETABTITLE = 177
+wxID_ROOTMENUPAGECHOICEDELETEPAIR = 178
+wxID_ROOTMENUPAGECHOICEDELETETAB = 179
+wxID_ROOTMENUPAGECHOICEEPICSCONFIG = 180
+wxID_ROOTMENUPAGECHOICENEWPAIR = 181
+wxID_ROOTMENUPAGECHOICENEWROW = 182
+wxID_ROOTMENUPAGECHOICENEWTAB = 183
+wxID_ROOTPAGEBOOK = 163
+wxID_ROOTSTATUSBAR1 = 164
+ \ No newline at end of file diff --git a/pydoc/wxmtxy_row.html b/pydoc/wxmtxy_row.html new file mode 100644 index 0000000..73adfdb --- /dev/null +++ b/pydoc/wxmtxy_row.html @@ -0,0 +1,1761 @@ + + +Python: module wxmtxy_row + + + + +
 
+ 
wxmtxy_row
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy_row.py
+

Define the GUI elements and interface for one row of the table

+@version: 
+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_row.py $
+# $Id: wxmtxy_row.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+

+ + + + + +
 
+Modules
       
inspect
+
os
+
wx
+

+ + + + + +
 
+Classes
       
+
wx._windows.Panel(wx._core.Window) +
+
+
Row +
+
+
+

+ + + + + + + +
 
+class Row(wx._windows.Panel)
   One row of settings in a wxmtxy table
 
 
Method resolution order:
+
Row
+
wx._windows.Panel
+
wx._core.Window
+
wx._core.EvtHandler
+
wx._core.Object
+
__builtin__.object
+
+
+Methods defined here:
+
DeleteRow(self, parent)
Tell parent to delete this row (may be tricky)
+@param parent: object of Tab that owns this Row
+ +
GetLabel(self)
@return row label
+ +
GetXY(self)
@return X, Y values as a tuple
+ +
Go(self, parent)
Tell parent to move motors to this X,Y
+@param parent: object of Tab that owns this Row
+ +
OnDeleteButton(self, event)
Delete button pressed
+@param event: wxPython event object
+ +
OnGoButton(self, event)
Go button pressed
+@param event: wxPython event object
+ +
OnSetButton(self, event)
Set button pressed
+@param event: wxPython event object
+ +
SetLabel(self, text)
Define the label
+@param text: [string] user description of this row
+ +
SetPositions(self, parent)
Tell parent to set positions on this row
+@param parent: object of Tab that owns this Row
+ +
SetXY(self, x, y)
Define the values
+@param x: [float] X axis position to remember
+@param y: [float] Y axis position to remember
+ +
__init__(self, tab, tabCallback)
initialize the row
+@param tab: parent object (Tab object that owns this Row object)
+@param tabCallback: callback function that takes two arguments
+ +
+Methods inherited from wx._windows.Panel:
+
Create(*args, **kwargs)
Create(self, Window parent, int id=-1, Point pos=DefaultPosition, 
+    Size size=DefaultSize, long style=wxTAB_TRAVERSAL|wxNO_BORDER, 
+    String name=PanelNameStr) -> bool

+Create the GUI part of the Window for 2-phase creation mode.
+ +
SetFocusIgnoringChildren(*args, **kwargs)
SetFocusIgnoringChildren(self)

+In contrast to `SetFocus` (see above) this will set the focus to the
+panel even of there are child windows in the panel. This is only
+rarely needed.
+ +
__repr__ = _swig_repr(self)
+ +
+Static methods inherited from wx._windows.Panel:
+
GetClassDefaultAttributes(*args, **kwargs)
GetClassDefaultAttributes(int variant=WINDOW_VARIANT_NORMAL) -> VisualAttributes

+Get the default attributes for this class.  This is useful if you want
+to use the same font or colour in your own control as in a standard
+control -- which is a much better idea than hard coding specific
+colours or fonts which might look completely out of place on the
+user's system, especially if it uses themes.

+The variant parameter is only relevant under Mac currently and is
+ignore under other platforms. Under Mac, it will change the size of
+the returned font. See `wx.Window.SetWindowVariant` for more about
+this.
+ +
+Data descriptors inherited from wx._windows.Panel:
+
thisown
+
The membership flag
+
+
+Methods inherited from wx._core.Window:
+
AcceptsFocus(*args, **kwargs)
AcceptsFocus(self) -> bool

+Can this window have focus?
+ +
AcceptsFocusFromKeyboard(*args, **kwargs)
AcceptsFocusFromKeyboard(self) -> bool

+Can this window be given focus by keyboard navigation? if not, the
+only way to give it focus (provided it accepts it at all) is to click
+it.
+ +
AddChild(*args, **kwargs)
AddChild(self, Window child)

+Adds a child window. This is called automatically by window creation
+functions so should not be required by the application programmer.
+ +
AdjustForLayoutDirection(*args, **kwargs)
AdjustForLayoutDirection(self, int x, int width, int widthTotal) -> int

+Mirror coordinates for RTL layout if this window uses it and if the
+mirroring is not done automatically like Win32.
+ +
AssociateHandle(*args, **kwargs)
AssociateHandle(self, long handle)

+Associate the window with a new native handle
+ +
CacheBestSize(*args, **kwargs)
CacheBestSize(self, Size size)

+Cache the best size so it doesn't need to be calculated again, (at least until
+some properties of the window change.)
+ +
CanSetTransparent(*args, **kwargs)
CanSetTransparent(self) -> bool

+Returns ``True`` if the platform supports setting the transparency for
+this window.  Note that this method will err on the side of caution,
+so it is possible that this will return ``False`` when it is in fact
+possible to set the transparency.

+NOTE: On X-windows systems the X server must have the composite
+extension loaded, and there must be a composite manager program (such
+as xcompmgr) running.
+ +
CaptureMouse(*args, **kwargs)
CaptureMouse(self)

+Directs all mouse input to this window. Call wx.Window.ReleaseMouse to
+release the capture.

+Note that wxWindows maintains the stack of windows having captured the
+mouse and when the mouse is released the capture returns to the window
+which had had captured it previously and it is only really released if
+there were no previous window. In particular, this means that you must
+release the mouse as many times as you capture it, unless the window
+receives the `wx.MouseCaptureLostEvent` event.

+Any application which captures the mouse in the beginning of some
+operation *must* handle `wx.MouseCaptureLostEvent` and cancel this
+operation when it receives the event. The event handler must not
+recapture mouse.
+ +
Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
Centre = Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CentreOnParent = CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
ClearBackground(*args, **kwargs)
ClearBackground(self)

+Clears the window by filling it with the current background
+colour. Does not cause an erase background event to be generated.
+ +
ClientToScreen(*args, **kwargs)
ClientToScreen(self, Point pt) -> Point

+Converts to screen coordinates from coordinates relative to this window.
+ +
ClientToScreenXY(*args, **kwargs)
ClientToScreenXY(int x, int y) -> (x,y)

+Converts to screen coordinates from coordinates relative to this window.
+ +
Close(*args, **kwargs)
Close(self, bool force=False) -> bool

+This function simply generates a EVT_CLOSE event whose handler usually
+tries to close the window. It doesn't close the window itself,
+however.  If force is False (the default) then the window's close
+handler will be allowed to veto the destruction of the window.
+ +
ConvertDialogPointToPixels(*args, **kwargs)
ConvertDialogPointToPixels(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertDialogSizeToPixels(*args, **kwargs)
ConvertDialogSizeToPixels(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertPixelPointToDialog(*args, **kwargs)
ConvertPixelPointToDialog(self, Point pt) -> Point
+ +
ConvertPixelSizeToDialog(*args, **kwargs)
ConvertPixelSizeToDialog(self, Size sz) -> Size
+ +
DLG_PNT(*args, **kwargs)
DLG_PNT(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
DLG_SZE(*args, **kwargs)
DLG_SZE(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
Destroy(*args, **kwargs)
Destroy(self) -> bool

+Destroys the window safely.  Frames and dialogs are not destroyed
+immediately when this function is called -- they are added to a list
+of windows to be deleted on idle time, when all the window's events
+have been processed. This prevents problems with events being sent to
+non-existent windows.

+Returns True if the window has either been successfully deleted, or it
+has been added to the list of windows pending real deletion.
+ +
DestroyChildren(*args, **kwargs)
DestroyChildren(self) -> bool

+Destroys all children of a window. Called automatically by the
+destructor.
+ +
Disable(*args, **kwargs)
Disable(self) -> bool

+Disables the window, same as Enable(false).
+ +
DissociateHandle(*args, **kwargs)
DissociateHandle(self)

+Dissociate the current native handle from the window
+ +
DragAcceptFiles(*args, **kwargs)
DragAcceptFiles(self, bool accept)

+Enables or disables eligibility for drop file events, EVT_DROP_FILES.
+Only functional on Windows.
+ +
Enable(*args, **kwargs)
Enable(self, bool enable=True) -> bool

+Enable or disable the window for user input. Note that when a parent
+window is disabled, all of its children are disabled as well and they
+are reenabled again when the parent is.  Returns true if the window
+has been enabled or disabled, false if nothing was done, i.e. if the
+window had already been in the specified state.
+ +
FindWindowById(*args, **kwargs)
FindWindowById(self, long winid) -> Window

+Find a child of this window by window ID
+ +
FindWindowByName(*args, **kwargs)
FindWindowByName(self, String name) -> Window

+Find a child of this window by name
+ +
Fit(*args, **kwargs)
Fit(self)

+Sizes the window so that it fits around its subwindows. This function
+won't do anything if there are no subwindows and will only really work
+correctly if sizers are used for the subwindows layout. Also, if the
+window has exactly one subwindow it is better (faster and the result
+is more precise as Fit adds some margin to account for fuzziness of
+its calculations) to call window.SetClientSize(child.GetSize())
+instead of calling Fit.
+ +
FitInside(*args, **kwargs)
FitInside(self)

+Similar to Fit, but sizes the interior (virtual) size of a
+window. Mainly useful with scrolled windows to reset scrollbars after
+sizing changes that do not trigger a size event, and/or scrolled
+windows without an interior sizer. This function similarly won't do
+anything if there are no subwindows.
+ +
Freeze(*args, **kwargs)
Freeze(self)

+Freezes the window or, in other words, prevents any updates from
+taking place on screen, the window is not redrawn at all. Thaw must be
+called to reenable window redrawing.  Calls to Freeze/Thaw may be
+nested, with the actual Thaw being delayed until all the nesting has
+been undone.

+This method is useful for visual appearance optimization (for example,
+it is a good idea to use it before inserting large amount of text into
+a wxTextCtrl under wxGTK) but is not implemented on all platforms nor
+for all controls so it is mostly just a hint to wxWindows and not a
+mandatory directive.
+ +
GetAcceleratorTable(*args, **kwargs)
GetAcceleratorTable(self) -> AcceleratorTable

+Gets the accelerator table for this window.
+ +
GetAdjustedBestSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetAutoLayout(*args, **kwargs)
GetAutoLayout(self) -> bool

+Returns the current autoLayout setting
+ +
GetBackgroundColour(*args, **kwargs)
GetBackgroundColour(self) -> Colour

+Returns the background colour of the window.
+ +
GetBackgroundStyle(*args, **kwargs)
GetBackgroundStyle(self) -> int

+Returns the background style of the window.

+:see: `SetBackgroundStyle`
+ +
GetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetBestSize(*args, **kwargs)
GetBestSize(self) -> Size

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestSizeTuple(*args, **kwargs)
GetBestSizeTuple() -> (width, height)

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestVirtualSize(*args, **kwargs)
GetBestVirtualSize(self) -> Size

+Return the largest of ClientSize and BestSize (as determined by a
+sizer, interior children, or other means)
+ +
GetBorder(*args)
GetBorder(self, long flags) -> int
+GetBorder(self) -> int

+Get border for the flags of this window
+ +
GetCaret(*args, **kwargs)
GetCaret(self) -> Caret

+Returns the caret associated with the window.
+ +
GetCharHeight(*args, **kwargs)
GetCharHeight(self) -> int

+Get the (average) character size for the current font.
+ +
GetCharWidth(*args, **kwargs)
GetCharWidth(self) -> int

+Get the (average) character size for the current font.
+ +
GetChildren(*args, **kwargs)
GetChildren(self) -> WindowList

+Returns an object containing a list of the window's children.  The
+object provides a Python sequence-like interface over the internal
+list maintained by the window..
+ +
GetClientAreaOrigin(*args, **kwargs)
GetClientAreaOrigin(self) -> Point

+Get the origin of the client area of the window relative to the
+window's top left corner (the client area may be shifted because of
+the borders, scrollbars, other decorations...)
+ +
GetClientRect(*args, **kwargs)
GetClientRect(self) -> Rect

+Get the client area position and size as a `wx.Rect` object.
+ +
GetClientSize(*args, **kwargs)
GetClientSize(self) -> Size

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetClientSizeTuple(*args, **kwargs)
GetClientSizeTuple() -> (width, height)

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetConstraints(*args, **kwargs)
GetConstraints(self) -> LayoutConstraints

+Returns a pointer to the window's layout constraints, or None if there
+are none.
+ +
GetContainingSizer(*args, **kwargs)
GetContainingSizer(self) -> Sizer

+Return the sizer that this window is a member of, if any, otherwise None.
+ +
GetCursor(*args, **kwargs)
GetCursor(self) -> Cursor

+Return the cursor associated with this window.
+ +
GetDefaultAttributes(*args, **kwargs)
GetDefaultAttributes(self) -> VisualAttributes

+Get the default attributes for an instance of this class.  This is
+useful if you want to use the same font or colour in your own control
+as in a standard control -- which is a much better idea than hard
+coding specific colours or fonts which might look completely out of
+place on the user's system, especially if it uses themes.
+ +
GetDropTarget(*args, **kwargs)
GetDropTarget(self) -> DropTarget

+Returns the associated drop target, which may be None.
+ +
GetEffectiveMinSize(*args, **kwargs)
GetEffectiveMinSize(self) -> Size

+This function will merge the window's best size into the window's
+minimum size, giving priority to the min size components, and returns
+the results.
+ +
GetEventHandler(*args, **kwargs)
GetEventHandler(self) -> EvtHandler

+Returns the event handler for this window. By default, the window is
+its own event handler.
+ +
GetExtraStyle(*args, **kwargs)
GetExtraStyle(self) -> long

+Returns the extra style bits for the window.
+ +
GetFont(*args, **kwargs)
GetFont(self) -> Font

+Returns the default font used for this window.
+ +
GetForegroundColour(*args, **kwargs)
GetForegroundColour(self) -> Colour

+Returns the foreground colour of the window.  The interpretation of
+foreground colour is dependent on the window class; it may be the text
+colour or other colour, or it may not be used at all.
+ +
GetFullTextExtent(*args, **kwargs)
GetFullTextExtent(String string, Font font=None) ->
+   (width, height, descent, externalLeading)

+Get the width, height, decent and leading of the text using the
+current or specified font.
+ +
GetGrandParent(*args, **kwargs)
GetGrandParent(self) -> Window

+Returns the parent of the parent of this window, or None if there
+isn't one.
+ +
GetGtkWidget(*args, **kwargs)
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+ +
GetHandle(*args, **kwargs)
GetHandle(self) -> long

+Returns the platform-specific handle (as a long integer) of the
+physical window.  On wxMSW this is the win32 window handle, on wxGTK
+it is the XWindow ID, and on wxMac it is the ControlRef.
+ +
GetHelpText(*args, **kwargs)
GetHelpText(self) -> String

+Gets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
GetHelpTextAtPoint(*args, **kwargs)
GetHelpTextAtPoint(self, Point pt, wxHelpEvent::Origin origin) -> String

+Get the help string associated with the given position in this window.

+Notice that pt may be invalid if event origin is keyboard or unknown
+and this method should return the global window help text then
+ +
GetId(*args, **kwargs)
GetId(self) -> int

+Returns the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one (or the default Id
+-1 is used) then an unique identifier with a negative value will be
+generated.
+ +
GetLayoutDirection(*args, **kwargs)
GetLayoutDirection(self) -> int

+Get the layout direction (LTR or RTL) for this window.  Returns
+``wx.Layout_Default`` if layout direction is not supported.
+ +
GetMaxHeight(*args, **kwargs)
GetMaxHeight(self) -> int
+ +
GetMaxSize(*args, **kwargs)
GetMaxSize(self) -> Size
+ +
GetMaxWidth(*args, **kwargs)
GetMaxWidth(self) -> int
+ +
GetMinHeight(*args, **kwargs)
GetMinHeight(self) -> int
+ +
GetMinSize(*args, **kwargs)
GetMinSize(self) -> Size
+ +
GetMinWidth(*args, **kwargs)
GetMinWidth(self) -> int
+ +
GetName(*args, **kwargs)
GetName(self) -> String

+Returns the windows name.  This name is not guaranteed to be unique;
+it is up to the programmer to supply an appropriate name in the window
+constructor or via wx.Window.SetName.
+ +
GetParent(*args, **kwargs)
GetParent(self) -> Window

+Returns the parent window of this window, or None if there isn't one.
+ +
GetPosition(*args, **kwargs)
GetPosition(self) -> Point

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetPositionTuple(*args, **kwargs)
GetPositionTuple() -> (x,y)

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetRect(*args, **kwargs)
GetRect(self) -> Rect

+Returns the size and position of the window as a `wx.Rect` object.
+ +
GetScreenPosition(*args, **kwargs)
GetScreenPosition(self) -> Point

+Get the position of the window in screen coordinantes.
+ +
GetScreenPositionTuple(*args, **kwargs)
GetScreenPositionTuple() -> (x,y)

+Get the position of the window in screen coordinantes.
+ +
GetScreenRect(*args, **kwargs)
GetScreenRect(self) -> Rect

+Returns the size and position of the window in screen coordinantes as
+a `wx.Rect` object.
+ +
GetScrollPos(*args, **kwargs)
GetScrollPos(self, int orientation) -> int

+Returns the built-in scrollbar position.
+ +
GetScrollRange(*args, **kwargs)
GetScrollRange(self, int orientation) -> int

+Returns the built-in scrollbar range.
+ +
GetScrollThumb(*args, **kwargs)
GetScrollThumb(self, int orientation) -> int

+Returns the built-in scrollbar thumb size.
+ +
GetSize(*args, **kwargs)
GetSize(self) -> Size

+Get the window size.
+ +
GetSizeTuple(*args, **kwargs)
GetSizeTuple() -> (width, height)

+Get the window size.
+ +
GetSizer(*args, **kwargs)
GetSizer(self) -> Sizer

+Return the sizer associated with the window by a previous call to
+SetSizer or None if there isn't one.
+ +
GetTextExtent(*args, **kwargs)
GetTextExtent(String string) -> (width, height)

+Get the width and height of the text using the current font.
+ +
GetThemeEnabled(*args, **kwargs)
GetThemeEnabled(self) -> bool

+Return the themeEnabled flag.
+ +
GetToolTip(*args, **kwargs)
GetToolTip(self) -> ToolTip

+get the associated tooltip or None if none
+ +
GetTopLevelParent(*args, **kwargs)
GetTopLevelParent(self) -> Window

+Returns the first frame or dialog in this window's parental hierarchy.
+ +
GetUpdateClientRect(*args, **kwargs)
GetUpdateClientRect(self) -> Rect

+Get the update rectangle region bounding box in client coords.
+ +
GetUpdateRegion(*args, **kwargs)
GetUpdateRegion(self) -> Region

+Returns the region specifying which parts of the window have been
+damaged. Should only be called within an EVT_PAINT handler.
+ +
GetValidator(*args, **kwargs)
GetValidator(self) -> Validator

+Returns a pointer to the current validator for the window, or None if
+there is none.
+ +
GetVirtualSize(*args, **kwargs)
GetVirtualSize(self) -> Size

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetVirtualSizeTuple(*args, **kwargs)
GetVirtualSizeTuple() -> (width, height)

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetWindowBorderSize(*args, **kwargs)
GetWindowBorderSize(self) -> Size

+Return the size of the left/right and top/bottom borders.
+ +
GetWindowStyle = GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowVariant(*args, **kwargs)
GetWindowVariant(self) -> int
+ +
HasCapture(*args, **kwargs)
HasCapture(self) -> bool

+Returns true if this window has the current mouse capture.
+ +
HasFlag(*args, **kwargs)
HasFlag(self, int flag) -> bool

+Test if the given style is set for this window.
+ +
HasMultiplePages(*args, **kwargs)
HasMultiplePages(self) -> bool
+ +
HasScrollbar(*args, **kwargs)
HasScrollbar(self, int orient) -> bool

+Does the window have the scrollbar for this orientation?
+ +
HasTransparentBackground(*args, **kwargs)
HasTransparentBackground(self) -> bool

+Returns True if this window's background is transparent (as, for
+example, for `wx.StaticText`) and should show the parent window's
+background.

+This method is mostly used internally by the library itself and you
+normally shouldn't have to call it. You may, however, have to override
+it in your custom control classes to ensure that background is painted
+correctly.
+ +
Hide(*args, **kwargs)
Hide(self) -> bool

+Equivalent to calling Show(False).
+ +
HitTest(*args, **kwargs)
HitTest(self, Point pt) -> int

+Test where the given (in client coords) point lies
+ +
HitTestXY(*args, **kwargs)
HitTestXY(self, int x, int y) -> int

+Test where the given (in client coords) point lies
+ +
InheritAttributes(*args, **kwargs)
InheritAttributes(self)

+This function is (or should be, in case of custom controls) called
+during window creation to intelligently set up the window visual
+attributes, that is the font and the foreground and background
+colours.

+By 'intelligently' the following is meant: by default, all windows use
+their own default attributes. However if some of the parent's
+attributes are explicitly changed (that is, using SetFont and not
+SetOwnFont) and if the corresponding attribute hadn't been
+explicitly set for this window itself, then this window takes the same
+value as used by the parent. In addition, if the window overrides
+ShouldInheritColours to return false, the colours will not be changed
+no matter what and only the font might.

+This rather complicated logic is necessary in order to accommodate the
+different usage scenarios. The most common one is when all default
+attributes are used and in this case, nothing should be inherited as
+in modern GUIs different controls use different fonts (and colours)
+than their siblings so they can't inherit the same value from the
+parent. However it was also deemed desirable to allow to simply change
+the attributes of all children at once by just changing the font or
+colour of their common parent, hence in this case we do inherit the
+parents attributes.
+ +
InheritsBackgroundColour(*args, **kwargs)
InheritsBackgroundColour(self) -> bool
+ +
InitDialog(*args, **kwargs)
InitDialog(self)

+Sends an EVT_INIT_DIALOG event, whose handler usually transfers data
+to the dialog via validators.
+ +
InvalidateBestSize(*args, **kwargs)
InvalidateBestSize(self)

+Reset the cached best size value so it will be recalculated the next
+time it is needed.
+ +
IsBeingDeleted(*args, **kwargs)
IsBeingDeleted(self) -> bool

+Is the window in the process of being deleted?
+ +
IsDoubleBuffered(*args, **kwargs)
IsDoubleBuffered(self) -> bool

+Returns ``True`` if the window contents is double-buffered by the
+system, i.e. if any drawing done on the window is really done on a
+temporary backing surface and transferred to the screen all at once
+later.
+ +
IsEnabled(*args, **kwargs)
IsEnabled(self) -> bool

+Returns true if the window is enabled for input, false otherwise.
+ +
IsExposed(*args, **kwargs)
IsExposed(self, int x, int y, int w=1, int h=1) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedPoint(*args, **kwargs)
IsExposedPoint(self, Point pt) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedRect(*args, **kwargs)
IsExposedRect(self, Rect rect) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsFrozen(*args, **kwargs)
IsFrozen(self) -> bool

+Returns ``True`` if the window has been frozen and not thawed yet.

+:see: `Freeze` and `Thaw`
+ +
IsRetained(*args, **kwargs)
IsRetained(self) -> bool

+Returns true if the window is retained, false otherwise.  Retained
+windows are only available on X platforms.
+ +
IsShown(*args, **kwargs)
IsShown(self) -> bool

+Returns true if the window is shown, false if it has been hidden.
+ +
IsShownOnScreen(*args, **kwargs)
IsShownOnScreen(self) -> bool

+Returns ``True`` if the window is physically visible on the screen,
+i.e. it is shown and all its parents up to the toplevel window are
+shown as well.
+ +
IsTopLevel(*args, **kwargs)
IsTopLevel(self) -> bool

+Returns true if the given window is a top-level one. Currently all
+frames and dialogs are always considered to be top-level windows (even
+if they have a parent window).
+ +
Layout(*args, **kwargs)
Layout(self) -> bool

+Invokes the constraint-based layout algorithm or the sizer-based
+algorithm for this window.  See SetAutoLayout: when auto layout is on,
+this function gets called automatically by the default EVT_SIZE
+handler when the window is resized.
+ +
LineDown(*args, **kwargs)
LineDown(self) -> bool

+This is just a wrapper for ScrollLines(1).
+ +
LineUp(*args, **kwargs)
LineUp(self) -> bool

+This is just a wrapper for ScrollLines(-1).
+ +
Lower(*args, **kwargs)
Lower(self)

+Lowers the window to the bottom of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
MakeModal(*args, **kwargs)
MakeModal(self, bool modal=True)

+Disables all other windows in the application so that the user can
+only interact with this window.  Passing False will reverse this
+effect.
+ +
Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
MoveAfterInTabOrder(*args, **kwargs)
MoveAfterInTabOrder(self, Window win)

+Moves this window in the tab navigation order after the specified
+sibling window.  This means that when the user presses the TAB key on
+that other window, the focus switches to this window.

+The default tab order is the same as creation order.  This function
+and `MoveBeforeInTabOrder` allow to change it after creating all the
+windows.
+ +
MoveBeforeInTabOrder(*args, **kwargs)
MoveBeforeInTabOrder(self, Window win)

+Same as `MoveAfterInTabOrder` except that it inserts this window just
+before win instead of putting it right after it.
+ +
MoveXY(*args, **kwargs)
MoveXY(self, int x, int y, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
Navigate(*args, **kwargs)
Navigate(self, int flags=NavigationKeyEvent.IsForward) -> bool

+Does keyboard navigation from this window to another, by sending a
+`wx.NavigationKeyEvent`.
+ +
PageDown(*args, **kwargs)
PageDown(self) -> bool

+This is just a wrapper for ScrollPages(1).
+ +
PageUp(*args, **kwargs)
PageUp(self) -> bool

+This is just a wrapper for ScrollPages(-1).
+ +
PopEventHandler(*args, **kwargs)
PopEventHandler(self, bool deleteHandler=False) -> EvtHandler

+Removes and returns the top-most event handler on the event handler
+stack.  If deleteHandler is True then the wx.EvtHandler object will be
+destroyed after it is popped, and ``None`` will be returned instead.
+ +
PopupMenu(*args, **kwargs)
PopupMenu(self, Menu menu, Point pos=DefaultPosition) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PopupMenuXY(*args, **kwargs)
PopupMenuXY(self, Menu menu, int x=-1, int y=-1) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PostCreate(self, pre)
Phase 3 of the 2-phase create <wink!>
+Call this method after precreating the window with the 2-phase create method.
+ +
PrepareDC(*args, **kwargs)
PrepareDC(self, DC dc)

+Call this function to prepare the device context for drawing a
+scrolled image. It sets the device origin according to the current
+scroll position.
+ +
PushEventHandler(*args, **kwargs)
PushEventHandler(self, EvtHandler handler)

+Pushes this event handler onto the event handler stack for the window.
+An event handler is an object that is capable of processing the events
+sent to a window.  (In other words, is able to dispatch the events to a
+handler function.)  By default, the window is its own event handler,
+but an application may wish to substitute another, for example to
+allow central implementation of event-handling for a variety of
+different window classes.

+wx.Window.PushEventHandler allows an application to set up a chain of
+event handlers, where an event not handled by one event handler is
+handed to the next one in the chain.  Use `wx.Window.PopEventHandler`
+to remove the event handler.  Ownership of the handler is *not* given
+to the window, so you should be sure to pop the handler before the
+window is destroyed and either let PopEventHandler destroy it, or call
+its Destroy method yourself.
+ +
Raise(*args, **kwargs)
Raise(self)

+Raises the window to the top of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
Refresh(*args, **kwargs)
Refresh(self, bool eraseBackground=True, Rect rect=None)

+Mark the specified rectangle (or the whole window) as "dirty" so it
+will be repainted.  Causes an EVT_PAINT event to be generated and sent
+to the window.
+ +
RefreshRect(*args, **kwargs)
RefreshRect(self, Rect rect, bool eraseBackground=True)

+Redraws the contents of the given rectangle: the area inside it will
+be repainted.  This is the same as Refresh but has a nicer syntax.
+ +
RegisterHotKey(*args, **kwargs)
RegisterHotKey(self, int hotkeyId, int modifiers, int keycode) -> bool

+Registers a system wide hotkey. Every time the user presses the hotkey
+registered here, this window will receive a hotkey event. It will
+receive the event even if the application is in the background and
+does not have the input focus because the user is working with some
+other application.  To bind an event handler function to this hotkey
+use EVT_HOTKEY with an id equal to hotkeyId.  Returns True if the
+hotkey was registered successfully.
+ +
ReleaseMouse(*args, **kwargs)
ReleaseMouse(self)

+Releases mouse input captured with wx.Window.CaptureMouse.
+ +
RemoveChild(*args, **kwargs)
RemoveChild(self, Window child)

+Removes a child window. This is called automatically by window
+deletion functions so should not be required by the application
+programmer.
+ +
RemoveEventHandler(*args, **kwargs)
RemoveEventHandler(self, EvtHandler handler) -> bool

+Find the given handler in the event handler chain and remove (but not
+delete) it from the event handler chain, returns True if it was found
+and False otherwise (this also results in an assert failure so this
+function should only be called when the handler is supposed to be
+there.)
+ +
Reparent(*args, **kwargs)
Reparent(self, Window newParent) -> bool

+Reparents the window, i.e the window will be removed from its current
+parent window (e.g. a non-standard toolbar in a wxFrame) and then
+re-inserted into another. Available on Windows and GTK.  Returns True
+if the parent was changed, False otherwise (error or newParent ==
+oldParent)
+ +
ScreenToClient(*args, **kwargs)
ScreenToClient(self, Point pt) -> Point

+Converts from screen to client window coordinates.
+ +
ScreenToClientXY(*args, **kwargs)
ScreenToClientXY(int x, int y) -> (x,y)

+Converts from screen to client window coordinates.
+ +
ScrollLines(*args, **kwargs)
ScrollLines(self, int lines) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of lines down, if lines is positive, or up if lines
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollPages(*args, **kwargs)
ScrollPages(self, int pages) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of pages down, if pages is positive, or up if pages
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollWindow(*args, **kwargs)
ScrollWindow(self, int dx, int dy, Rect rect=None)

+Physically scrolls the pixels in the window and move child windows
+accordingly.  Use this function to optimise your scrolling
+implementations, to minimise the area that must be redrawn. Note that
+it is rarely required to call this function from a user program.
+ +
SendSizeEvent(self)
+ +
SetAcceleratorTable(*args, **kwargs)
SetAcceleratorTable(self, AcceleratorTable accel)

+Sets the accelerator table for this window.
+ +
SetAutoLayout(*args, **kwargs)
SetAutoLayout(self, bool autoLayout)

+Determines whether the Layout function will be called automatically
+when the window is resized.  lease note that this only happens for the
+windows usually used to contain children, namely `wx.Panel` and
+`wx.TopLevelWindow` (and the classes deriving from them).

+This method is called implicitly by `SetSizer` but if you use
+`SetConstraints` you should call it manually or otherwise the window
+layout won't be correctly updated when its size changes.
+ +
SetBackgroundColour(*args, **kwargs)
SetBackgroundColour(self, Colour colour) -> bool

+Sets the background colour of the window.  Returns True if the colour
+was changed.  The background colour is usually painted by the default
+EVT_ERASE_BACKGROUND event handler function under Windows and
+automatically under GTK.  Using `wx.NullColour` will reset the window
+to the default background colour.

+Note that setting the background colour may not cause an immediate
+refresh, so you may wish to call `ClearBackground` or `Refresh` after
+calling this function.

+Using this function will disable attempts to use themes for this
+window, if the system supports them.  Use with care since usually the
+themes represent the appearance chosen by the user to be used for all
+applications on the system.
+ +
SetBackgroundStyle(*args, **kwargs)
SetBackgroundStyle(self, int style) -> bool

+Returns the background style of the window. The background style
+indicates how the background of the window is drawn.

+    ======================  ========================================
+    wx.BG_STYLE_SYSTEM      The background colour or pattern should
+                            be determined by the system
+    wx.BG_STYLE_COLOUR      The background should be a solid colour
+    wx.BG_STYLE_CUSTOM      The background will be implemented by the
+                            application.
+    ======================  ========================================

+On GTK+, use of wx.BG_STYLE_CUSTOM allows the flicker-free drawing of
+a custom background, such as a tiled bitmap. Currently the style has
+no effect on other platforms.

+:see: `GetBackgroundStyle`, `SetBackgroundColour`
+ +
SetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `SetInitialSize`
+ +
SetCaret(*args, **kwargs)
SetCaret(self, Caret caret)

+Sets the caret associated with the window.
+ +
SetClientRect(*args, **kwargs)
SetClientRect(self, Rect rect)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSize(*args, **kwargs)
SetClientSize(self, Size size)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSizeWH(*args, **kwargs)
SetClientSizeWH(self, int width, int height)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetConstraints(*args, **kwargs)
SetConstraints(self, LayoutConstraints constraints)

+Sets the window to have the given layout constraints. If an existing
+layout constraints object is already owned by the window, it will be
+deleted.  Pass None to disassociate and delete the window's current
+constraints.

+You must call SetAutoLayout to tell a window to use the constraints
+automatically in its default EVT_SIZE handler; otherwise, you must
+handle EVT_SIZE yourself and call Layout() explicitly. When setting
+both a wx.LayoutConstraints and a wx.Sizer, only the sizer will have
+effect.
+ +
SetContainingSizer(*args, **kwargs)
SetContainingSizer(self, Sizer sizer)

+This normally does not need to be called by application code. It is
+called internally when a window is added to a sizer, and is used so
+the window can remove itself from the sizer when it is destroyed.
+ +
SetCursor(*args, **kwargs)
SetCursor(self, Cursor cursor) -> bool

+Sets the window's cursor. Notice that the window cursor also sets it
+for the children of the window implicitly.

+The cursor may be wx.NullCursor in which case the window cursor will
+be reset back to default.
+ +
SetDimensions(*args, **kwargs)
SetDimensions(self, int x, int y, int width, int height, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels.  The sizeFlags
+parameter indicates the interpretation of the other params if they are
+equal to -1.

+    ========================  ======================================
+    wx.SIZE_AUTO              A -1 indicates that a class-specific
+                              default should be used.
+    wx.SIZE_USE_EXISTING      Axisting dimensions should be used if
+                              -1 values are supplied.
+    wxSIZE_ALLOW_MINUS_ONE    Allow dimensions of -1 and less to be
+                              interpreted as real dimensions, not
+                              default values.
+    ========================  ======================================
+ +
SetDoubleBuffered(*args, **kwargs)
SetDoubleBuffered(self, bool on)

+Currently wxGTK2 only.
+ +
SetDropTarget(*args, **kwargs)
SetDropTarget(self, DropTarget dropTarget)

+Associates a drop target with this window.  If the window already has
+a drop target, it is deleted.
+ +
SetEventHandler(*args, **kwargs)
SetEventHandler(self, EvtHandler handler)

+Sets the event handler for this window.  An event handler is an object
+that is capable of processing the events sent to a window.  (In other
+words, is able to dispatch the events to handler function.)  By
+default, the window is its own event handler, but an application may
+wish to substitute another, for example to allow central
+implementation of event-handling for a variety of different window
+classes.

+It is usually better to use `wx.Window.PushEventHandler` since this sets
+up a chain of event handlers, where an event not handled by one event
+handler is handed off to the next one in the chain.
+ +
SetExtraStyle(*args, **kwargs)
SetExtraStyle(self, long exStyle)

+Sets the extra style bits for the window.  Extra styles are the less
+often used style bits which can't be set with the constructor or with
+SetWindowStyleFlag()
+ +
SetFocus(*args, **kwargs)
SetFocus(self)

+Set's the focus to this window, allowing it to receive keyboard input.
+ +
SetFocusFromKbd(*args, **kwargs)
SetFocusFromKbd(self)

+Set focus to this window as the result of a keyboard action.  Normally
+only called internally.
+ +
SetFont(*args, **kwargs)
SetFont(self, Font font) -> bool

+Sets the font for this window.
+ +
SetForegroundColour(*args, **kwargs)
SetForegroundColour(self, Colour colour) -> bool

+Sets the foreground colour of the window.  Returns True is the colour
+was changed.  The interpretation of foreground colour is dependent on
+the window class; it may be the text colour or other colour, or it may
+not be used at all.
+ +
SetHelpText(*args, **kwargs)
SetHelpText(self, String text)

+Sets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
SetHelpTextForId(*args, **kwargs)
SetHelpTextForId(self, String text)

+Associate this help text with all windows with the same id as this
+one.
+ +
SetId(*args, **kwargs)
SetId(self, int winid)

+Sets the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one, an identifier
+will be generated. Normally, the identifier should be provided on
+creation and should not be modified subsequently.
+ +
SetInitialSize(*args, **kwargs)
SetInitialSize(self, Size size=DefaultSize)

+A 'Smart' SetSize that will fill in default size components with the
+window's *best size* values.  Also set's the minsize for use with sizers.
+ +
SetLayoutDirection(*args, **kwargs)
SetLayoutDirection(self, int dir)

+Set the layout direction (LTR or RTL) for this window.
+ +
SetMaxSize(*args, **kwargs)
SetMaxSize(self, Size maxSize)

+A more convenient method than `SetSizeHints` for setting just the
+max size.
+ +
SetMinSize(*args, **kwargs)
SetMinSize(self, Size minSize)

+A more convenient method than `SetSizeHints` for setting just the
+min size.
+ +
SetName(*args, **kwargs)
SetName(self, String name)

+Sets the window's name.  The window name is used for ressource setting
+in X, it is not the same as the window title/label
+ +
SetOwnBackgroundColour(*args, **kwargs)
SetOwnBackgroundColour(self, Colour colour)
+ +
SetOwnFont(*args, **kwargs)
SetOwnFont(self, Font font)
+ +
SetOwnForegroundColour(*args, **kwargs)
SetOwnForegroundColour(self, Colour colour)
+ +
SetPosition = Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
SetRect(*args, **kwargs)
SetRect(self, Rect rect, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels using a wx.Rect.
+ +
SetScrollPos(*args, **kwargs)
SetScrollPos(self, int orientation, int pos, bool refresh=True)

+Sets the position of one of the built-in scrollbars.
+ +
SetScrollbar(*args, **kwargs)
SetScrollbar(self, int orientation, int position, int thumbSize, int range, 
+    bool refresh=True)

+Sets the scrollbar properties of a built-in scrollbar.
+ +
SetSize(*args, **kwargs)
SetSize(self, Size size)

+Sets the size of the window in pixels.
+ +
SetSizeHints(*args, **kwargs)
SetSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1, int incW=-1, 
+    int incH=-1)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeHintsSz(*args, **kwargs)
SetSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize, Size incSize=DefaultSize)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeWH(*args, **kwargs)
SetSizeWH(self, int width, int height)

+Sets the size of the window in pixels.
+ +
SetSizer(*args, **kwargs)
SetSizer(self, Sizer sizer, bool deleteOld=True)

+Sets the window to have the given layout sizer. The window will then
+own the object, and will take care of its deletion. If an existing
+layout sizer object is already owned by the window, it will be deleted
+if the deleteOld parameter is true. Note that this function will also
+call SetAutoLayout implicitly with a True parameter if the sizer is
+non-None, and False otherwise.
+ +
SetSizerAndFit(*args, **kwargs)
SetSizerAndFit(self, Sizer sizer, bool deleteOld=True)

+The same as SetSizer, except it also sets the size hints for the
+window based on the sizer's minimum size.
+ +
SetThemeEnabled(*args, **kwargs)
SetThemeEnabled(self, bool enableTheme)

+This function tells a window if it should use the system's "theme"
+ code to draw the windows' background instead if its own background
+ drawing code. This will only have an effect on platforms that support
+ the notion of themes in user defined windows. One such platform is
+ GTK+ where windows can have (very colourful) backgrounds defined by a
+ user's selected theme.

+Dialogs, notebook pages and the status bar have this flag set to true
+by default so that the default look and feel is simulated best.
+ +
SetToolTip(*args, **kwargs)
SetToolTip(self, ToolTip tip)

+Attach a tooltip to the window.
+ +
SetToolTipString(*args, **kwargs)
SetToolTipString(self, String tip)

+Attach a tooltip to the window.
+ +
SetTransparent(*args, **kwargs)
SetTransparent(self, byte alpha) -> bool

+Attempt to set the transparency of this window to the ``alpha`` value,
+returns True on success.  The ``alpha`` value is an integer in the
+range of 0 to 255, where 0 is fully transparent and 255 is fully
+opaque.
+ +
SetValidator(*args, **kwargs)
SetValidator(self, Validator validator)

+Deletes the current validator (if any) and sets the window validator,
+having called wx.Validator.Clone to create a new validator of this
+type.
+ +
SetVirtualSize(*args, **kwargs)
SetVirtualSize(self, Size size)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetVirtualSizeHints(*args, **kwargs)
SetVirtualSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeHintsSz(*args, **kwargs)
SetVirtualSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeWH(*args, **kwargs)
SetVirtualSizeWH(self, int w, int h)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetWindowStyle = SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowVariant(*args, **kwargs)
SetWindowVariant(self, int variant)

+Sets the variant of the window/font size to use for this window, if
+the platform supports variants, for example, wxMac.
+ +
ShouldInheritColours(*args, **kwargs)
ShouldInheritColours(self) -> bool

+Return true from here to allow the colours of this window to be
+changed by InheritAttributes, returning false forbids inheriting them
+from the parent window.

+The base class version returns false, but this method is overridden in
+wxControl where it returns true.
+ +
Show(*args, **kwargs)
Show(self, bool show=True) -> bool

+Shows or hides the window. You may need to call Raise for a top level
+window if you want to bring it to top, although this is not needed if
+Show is called immediately after the frame creation.  Returns True if
+the window has been shown or hidden or False if nothing was done
+because it already was in the requested state.
+ +
Thaw(*args, **kwargs)
Thaw(self)

+Reenables window updating after a previous call to Freeze.  Calls to
+Freeze/Thaw may be nested, so Thaw must be called the same number of
+times that Freeze was before the window will be updated.
+ +
ToggleWindowStyle(*args, **kwargs)
ToggleWindowStyle(self, int flag) -> bool

+Turn the flag on if it had been turned off before and vice versa,
+returns True if the flag is turned on by this function call.
+ +
TransferDataFromWindow(*args, **kwargs)
TransferDataFromWindow(self) -> bool

+Transfers values from child controls to data areas specified by their
+validators. Returns false if a transfer failed.  If the window has
+wx.WS_EX_VALIDATE_RECURSIVELY extra style flag set, the method will
+also call TransferDataFromWindow() of all child windows.
+ +
TransferDataToWindow(*args, **kwargs)
TransferDataToWindow(self) -> bool

+Transfers values to child controls from data areas specified by their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call TransferDataToWindow() of
+all child windows.
+ +
UnregisterHotKey(*args, **kwargs)
UnregisterHotKey(self, int hotkeyId) -> bool

+Unregisters a system wide hotkey.
+ +
Update(*args, **kwargs)
Update(self)

+Calling this method immediately repaints the invalidated area of the
+window instead of waiting for the EVT_PAINT event to happen, (normally
+this would usually only happen when the flow of control returns to the
+event loop.)  Notice that this function doesn't refresh the window and
+does nothing if the window has been already repainted.  Use `Refresh`
+first if you want to immediately redraw the window (or some portion of
+it) unconditionally.
+ +
UpdateWindowUI(*args, **kwargs)
UpdateWindowUI(self, long flags=UPDATE_UI_NONE)

+This function sends EVT_UPDATE_UI events to the window. The particular
+implementation depends on the window; for example a wx.ToolBar will
+send an update UI event for each toolbar button, and a wx.Frame will
+send an update UI event for each menubar menu item. You can call this
+function from your application to ensure that your UI is up-to-date at
+a particular point in time (as far as your EVT_UPDATE_UI handlers are
+concerned). This may be necessary if you have called
+`wx.UpdateUIEvent.SetMode` or `wx.UpdateUIEvent.SetUpdateInterval` to
+limit the overhead that wxWindows incurs by sending update UI events
+in idle time.
+ +
UseBgCol(*args, **kwargs)
UseBgCol(self) -> bool
+ +
Validate(*args, **kwargs)
Validate(self) -> bool

+Validates the current values of the child controls using their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call Validate() of all child
+windows.  Returns false if any of the validations failed.
+ +
WarpPointer(*args, **kwargs)
WarpPointer(self, int x, int y)

+Moves the pointer to the given position on the window.

+NOTE: This function is not supported under Mac because Apple Human
+Interface Guidelines forbid moving the mouse cursor programmatically.
+ +
+Static methods inherited from wx._core.Window:
+
FindFocus(*args, **kwargs)
FindFocus() -> Window

+Returns the window or control that currently has the keyboard focus,
+or None.
+ +
GetCapture(*args, **kwargs)
GetCapture() -> Window

+Returns the window which currently captures the mouse or None
+ +
NewControlId(*args, **kwargs)
NewControlId() -> int

+Generate a control id for the controls which were not given one.
+ +
NextControlId(*args, **kwargs)
NextControlId(int winid) -> int

+Get the id of the control following the one with the given
+autogenerated) id
+ +
PrevControlId(*args, **kwargs)
PrevControlId(int winid) -> int

+Get the id of the control preceding the one with the given
+autogenerated) id
+ +
+Data descriptors inherited from wx._core.Window:
+
AcceleratorTable
+
See `GetAcceleratorTable` and `SetAcceleratorTable`
+
+
AutoLayout
+
See `GetAutoLayout` and `SetAutoLayout`
+
+
BackgroundColour
+
See `GetBackgroundColour` and `SetBackgroundColour`
+
+
BackgroundStyle
+
See `GetBackgroundStyle` and `SetBackgroundStyle`
+
+
BestSize
+
See `GetBestSize`
+
+
BestVirtualSize
+
See `GetBestVirtualSize`
+
+
Border
+
See `GetBorder`
+
+
Caret
+
See `GetCaret` and `SetCaret`
+
+
CharHeight
+
See `GetCharHeight`
+
+
CharWidth
+
See `GetCharWidth`
+
+
Children
+
See `GetChildren`
+
+
ClientAreaOrigin
+
See `GetClientAreaOrigin`
+
+
ClientRect
+
See `GetClientRect` and `SetClientRect`
+
+
ClientSize
+
See `GetClientSize` and `SetClientSize`
+
+
Constraints
+
See `GetConstraints` and `SetConstraints`
+
+
ContainingSizer
+
See `GetContainingSizer` and `SetContainingSizer`
+
+
Cursor
+
See `GetCursor` and `SetCursor`
+
+
DefaultAttributes
+
See `GetDefaultAttributes`
+
+
DropTarget
+
See `GetDropTarget` and `SetDropTarget`
+
+
EffectiveMinSize
+
See `GetEffectiveMinSize`
+
+
Enabled
+
See `IsEnabled` and `Enable`
+
+
EventHandler
+
See `GetEventHandler` and `SetEventHandler`
+
+
ExtraStyle
+
See `GetExtraStyle` and `SetExtraStyle`
+
+
Font
+
See `GetFont` and `SetFont`
+
+
ForegroundColour
+
See `GetForegroundColour` and `SetForegroundColour`
+
+
GrandParent
+
See `GetGrandParent`
+
+
GtkWidget
+
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+
+
Handle
+
See `GetHandle`
+
+
HelpText
+
See `GetHelpText` and `SetHelpText`
+
+
Id
+
See `GetId` and `SetId`
+
+
Label
+
See `GetLabel` and `SetLabel`
+
+
LayoutDirection
+
See `GetLayoutDirection` and `SetLayoutDirection`
+
+
MaxHeight
+
See `GetMaxHeight`
+
+
MaxSize
+
See `GetMaxSize` and `SetMaxSize`
+
+
MaxWidth
+
See `GetMaxWidth`
+
+
MinHeight
+
See `GetMinHeight`
+
+
MinSize
+
See `GetMinSize` and `SetMinSize`
+
+
MinWidth
+
See `GetMinWidth`
+
+
Name
+
See `GetName` and `SetName`
+
+
Parent
+
See `GetParent`
+
+
Position
+
See `GetPosition` and `SetPosition`
+
+
Rect
+
See `GetRect` and `SetRect`
+
+
ScreenPosition
+
See `GetScreenPosition`
+
+
ScreenRect
+
See `GetScreenRect`
+
+
Shown
+
See `IsShown` and `Show`
+
+
Size
+
See `GetSize` and `SetSize`
+
+
Sizer
+
See `GetSizer` and `SetSizer`
+
+
ThemeEnabled
+
See `GetThemeEnabled` and `SetThemeEnabled`
+
+
ToolTip
+
See `GetToolTip` and `SetToolTip`
+
+
TopLevel
+
See `IsTopLevel`
+
+
TopLevelParent
+
See `GetTopLevelParent`
+
+
UpdateClientRect
+
See `GetUpdateClientRect`
+
+
UpdateRegion
+
See `GetUpdateRegion`
+
+
Validator
+
See `GetValidator` and `SetValidator`
+
+
VirtualSize
+
See `GetVirtualSize` and `SetVirtualSize`
+
+
WindowStyle
+
See `GetWindowStyle` and `SetWindowStyle`
+
+
WindowStyleFlag
+
See `GetWindowStyleFlag` and `SetWindowStyleFlag`
+
+
WindowVariant
+
See `GetWindowVariant` and `SetWindowVariant`
+
+
+Methods inherited from wx._core.EvtHandler:
+
AddPendingEvent(*args, **kwargs)
AddPendingEvent(self, Event event)
+ +
Bind(self, event, handler, source=None, id=-1, id2=-1)
Bind an event to an event handler.

+:param event: One of the EVT_* objects that specifies the
+              type of event to bind,

+:param handler: A callable object to be invoked when the
+              event is delivered to self.  Pass None to
+              disconnect an event handler.

+:param source: Sometimes the event originates from a
+              different window than self, but you still
+              want to catch it in self.  (For example, a
+              button event delivered to a frame.)  By
+              passing the source of the event, the event
+              handling system is able to differentiate
+              between the same event type from different
+              controls.

+:param id: Used to spcify the event source by ID instead
+           of instance.

+:param id2: Used when it is desirable to bind a handler
+              to a range of IDs, such as with EVT_MENU_RANGE.
+ +
Connect(*args, **kwargs)
Connect(self, int id, int lastId, int eventType, PyObject func)
+ +
Disconnect(*args, **kwargs)
Disconnect(self, int id, int lastId=-1, EventType eventType=wxEVT_NULL) -> bool
+ +
GetEvtHandlerEnabled(*args, **kwargs)
GetEvtHandlerEnabled(self) -> bool
+ +
GetNextHandler(*args, **kwargs)
GetNextHandler(self) -> EvtHandler
+ +
GetPreviousHandler(*args, **kwargs)
GetPreviousHandler(self) -> EvtHandler
+ +
ProcessEvent(*args, **kwargs)
ProcessEvent(self, Event event) -> bool
+ +
ProcessPendingEvents(*args, **kwargs)
ProcessPendingEvents(self)
+ +
SetEvtHandlerEnabled(*args, **kwargs)
SetEvtHandlerEnabled(self, bool enabled)
+ +
SetNextHandler(*args, **kwargs)
SetNextHandler(self, EvtHandler handler)
+ +
SetPreviousHandler(*args, **kwargs)
SetPreviousHandler(self, EvtHandler handler)
+ +
Unbind(self, event, source=None, id=-1, id2=-1)
Disconencts the event handler binding for event from self.
+Returns True if successful.
+ +
+Data descriptors inherited from wx._core.EvtHandler:
+
EvtHandlerEnabled
+
See `GetEvtHandlerEnabled` and `SetEvtHandlerEnabled`
+
+
NextHandler
+
See `GetNextHandler` and `SetNextHandler`
+
+
PreviousHandler
+
See `GetPreviousHandler` and `SetPreviousHandler`
+
+
+Methods inherited from wx._core.Object:
+
GetClassName(*args, **kwargs)
GetClassName(self) -> String

+Returns the class name of the C++ class using wxRTTI.
+ +
IsSameAs(*args, **kwargs)
IsSameAs(self, Object p) -> bool

+For wx.Objects that use C++ reference counting internally, this method
+can be used to determine if two objects are referencing the same data
+object.
+ +
+Data descriptors inherited from wx._core.Object:
+
ClassName
+
See `GetClassName`
+
+
__dict__
+
dictionary for instance variables (if defined)
+
+
__weakref__
+
list of weak references to the object (if defined)
+
+

+ + + + + +
 
+Data
       wxID_ROW = 105
+wxID_ROWDELETE = 106
+wxID_ROWGO = 107
+wxID_ROWLABEL = 108
+wxID_ROWSET = 109
+wxID_ROWX = 110
+wxID_ROWY = 111
+ \ No newline at end of file diff --git a/pydoc/wxmtxy_tab.html b/pydoc/wxmtxy_tab.html new file mode 100644 index 0000000..0aee47c --- /dev/null +++ b/pydoc/wxmtxy_tab.html @@ -0,0 +1,1899 @@ + + +Python: module wxmtxy_tab + + + + +
 
+ 
wxmtxy_tab
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy_tab.py
+

Define the GUI elements and interface for one tab (table) of the X,Y pair

+@version: 
+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_tab.py $
+# $Id: wxmtxy_tab.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+

+ + + + + +
 
+Modules
       
wx
+
wxmtxy_row
+

+ + + + + +
 
+Classes
       
+
wx.lib.scrolledpanel.ScrolledPanel(wx._windows.PyScrolledWindow) +
+
+
Tab +
+
+
+

+ + + + + + + +
 
+class Tab(wx.lib.scrolledpanel.ScrolledPanel)
   Create a panel to display rows of settings
 
 
Method resolution order:
+
Tab
+
wx.lib.scrolledpanel.ScrolledPanel
+
wx._windows.PyScrolledWindow
+
wx._windows.ScrolledWindow
+
wx._windows.Panel
+
wx._core.Window
+
wx._core.EvtHandler
+
wx._core.Object
+
__builtin__.object
+
+
+Methods defined here:
+
DeleteRow(self, theRow)
Delete a row object
+@param theRow:
+ +
GetRowLabel(self, rownum)
return the text in the label slot for the given row
+ +
GetRowXY(self, rownum)
return the X,Y values in the label slot for the given row
+ +
NewRow(self, remap=False)
Make a new row and append it to the current tab
+@param remap: [Boolean] option to call Remap()
+ +
Remap(self)
adjust the layout for any changes
+ +
RowHandler(self, theRow, command)
Handle a command from a row
+ +
SetRowLabel(self, rownum, label)
set the text in the label slot for the given row
+ +
SetRowXY(self, rownum, x, y)
set the text in the label slot for the given row
+ +
__init__(self, parent, pair, pairCallback, newrow=False)
create the panel
+ +
+Methods inherited from wx.lib.scrolledpanel.ScrolledPanel:
+
OnChildFocus(self, evt)
+ +
ScrollChildIntoView(self, child)
Scrolls the panel such that the specified child window is in view.
+ +
SetupScrolling(self, scroll_x=True, scroll_y=True, rate_x=20, rate_y=20)
This function sets up the event handling necessary to handle
+scrolling properly. It should be called within the __init__
+function of any class that is derived from ScrolledPanel,
+once the controls on the panel have been constructed and
+thus the size of the scrolling area can be determined.
+ +
+Methods inherited from wx._windows.PyScrolledWindow:
+
DoEraseBackground(*args, **kwargs)
DoEraseBackground(self, DC dc) -> bool
+ +
DoGetBestSize(*args, **kwargs)
DoGetBestSize(self) -> Size
+ +
DoGetClientSize(*args, **kwargs)
DoGetClientSize() -> (width, height)
+ +
DoGetPosition(*args, **kwargs)
DoGetPosition() -> (x,y)
+ +
DoGetSize(*args, **kwargs)
DoGetSize() -> (width, height)
+ +
DoGetVirtualSize(*args, **kwargs)
DoGetVirtualSize(self) -> Size
+ +
DoMoveWindow(*args, **kwargs)
DoMoveWindow(self, int x, int y, int width, int height)
+ +
DoSetClientSize(*args, **kwargs)
DoSetClientSize(self, int width, int height)
+ +
DoSetSize(*args, **kwargs)
DoSetSize(self, int x, int y, int width, int height, int sizeFlags=SIZE_AUTO)
+ +
DoSetVirtualSize(*args, **kwargs)
DoSetVirtualSize(self, int x, int y)
+ +
GetDefaultAttributes(*args, **kwargs)
GetDefaultAttributes(self) -> VisualAttributes
+ +
OnInternalIdle(*args, **kwargs)
OnInternalIdle(self)
+ +
SetBestSize = SetInitialSize(*args, **kwargs)
SetInitialSize(self, Size size=DefaultSize)

+A 'Smart' SetSize that will fill in default size components with the
+window's *best size* values.  Also set's the minsize for use with sizers.
+ +
__repr__ = _swig_repr(self)
+ +
base_AcceptsFocus = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.AcceptsFocus instead.
+ +
base_AcceptsFocusFromKeyboard = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.AcceptsFocusFromKeyboard instead.
+ +
base_AddChild = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.AddChild instead.
+ +
base_DoGetBestSize = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.DoGetBestSize instead.
+ +
base_DoGetClientSize = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.DoGetClientSize instead.
+ +
base_DoGetPosition = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.DoGetPosition instead.
+ +
base_DoGetSize = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.DoGetSize instead.
+ +
base_DoGetVirtualSize = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.DoGetVirtualSize instead.
+ +
base_DoMoveWindow = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.DoMoveWindow instead.
+ +
base_DoSetClientSize = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.DoSetClientSize instead.
+ +
base_DoSetSize = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.DoSetSize instead.
+ +
base_DoSetVirtualSize = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.DoSetVirtualSize instead.
+ +
base_GetDefaultAttributes = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.GetDefaultAttributes instead.
+ +
base_GetMaxSize = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.GetMaxSize instead.
+ +
base_InitDialog = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.InitDialog instead.
+ +
base_OnInternalIdle = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.OnInternalIdle instead.
+ +
base_RemoveChild = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.RemoveChild instead.
+ +
base_ShouldInheritColours = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.ShouldInheritColours instead.
+ +
base_TransferDataFromWindow = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.TransferDataFromWindow instead.
+ +
base_TransferDataToWindow = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.TransferDataToWindow instead.
+ +
base_Validate = deprecatedWrapper(*args, **kwargs)
Please use PyScrolledWindow.Validate instead.
+ +
+Data descriptors inherited from wx._windows.PyScrolledWindow:
+
thisown
+
The membership flag
+
+
+Methods inherited from wx._windows.ScrolledWindow:
+
AdjustScrollbars(*args, **kwargs)
AdjustScrollbars(self)
+ +
CalcScrollInc(*args, **kwargs)
CalcScrollInc(self, ScrollWinEvent event) -> int
+ +
CalcScrolledPosition(*args)
CalcScrolledPosition(self, Point pt) -> Point
+CalcScrolledPosition(int x, int y) -> (sx, sy)

+Translate between scrolled and unscrolled coordinates.
+ +
CalcUnscrolledPosition(*args)
CalcUnscrolledPosition(self, Point pt) -> Point
+CalcUnscrolledPosition(int x, int y) -> (ux, uy)

+Translate between scrolled and unscrolled coordinates.
+ +
Create(*args, **kwargs)
Create(self, Window parent, int id=-1, Point pos=DefaultPosition, 
+    Size size=DefaultSize, long style=wxHSCROLL|wxVSCROLL, 
+    String name=PanelNameStr) -> bool

+Create the GUI part of the Window for 2-phase creation mode.
+ +
DoPrepareDC(*args, **kwargs)
DoPrepareDC(self, DC dc)

+Normally what is called by `PrepareDC`.
+ +
EnableScrolling(*args, **kwargs)
EnableScrolling(self, bool x_scrolling, bool y_scrolling)
+ +
GetScaleX(*args, **kwargs)
GetScaleX(self) -> double
+ +
GetScaleY(*args, **kwargs)
GetScaleY(self) -> double
+ +
GetScrollPageSize(*args, **kwargs)
GetScrollPageSize(self, int orient) -> int
+ +
GetScrollPixelsPerUnit(*args, **kwargs)
GetScrollPixelsPerUnit() -> (xUnit, yUnit)

+Get the size of one logical unit in physical units.
+ +
GetTargetWindow(*args, **kwargs)
GetTargetWindow(self) -> Window
+ +
GetViewStart(*args, **kwargs)
GetViewStart() -> (x,y)

+Get the view start
+ +
Scroll(*args, **kwargs)
Scroll(self, int x, int y)
+ +
SetScale(*args, **kwargs)
SetScale(self, double xs, double ys)
+ +
SetScrollPageSize(*args, **kwargs)
SetScrollPageSize(self, int orient, int pageSize)
+ +
SetScrollRate(*args, **kwargs)
SetScrollRate(self, int xstep, int ystep)
+ +
SetScrollbars(*args, **kwargs)
SetScrollbars(self, int pixelsPerUnitX, int pixelsPerUnitY, int noUnitsX, 
+    int noUnitsY, int xPos=0, int yPos=0, bool noRefresh=False)
+ +
SetTargetWindow(*args, **kwargs)
SetTargetWindow(self, Window target)
+ +
+Static methods inherited from wx._windows.ScrolledWindow:
+
GetClassDefaultAttributes(*args, **kwargs)
GetClassDefaultAttributes(int variant=WINDOW_VARIANT_NORMAL) -> VisualAttributes

+Get the default attributes for this class.  This is useful if you want
+to use the same font or colour in your own control as in a standard
+control -- which is a much better idea than hard coding specific
+colours or fonts which might look completely out of place on the
+user's system, especially if it uses themes.

+The variant parameter is only relevant under Mac currently and is
+ignore under other platforms. Under Mac, it will change the size of
+the returned font. See `wx.Window.SetWindowVariant` for more about
+this.
+ +
+Data descriptors inherited from wx._windows.ScrolledWindow:
+
ScaleX
+
See `GetScaleX`
+
+
ScaleY
+
See `GetScaleY`
+
+
TargetWindow
+
See `GetTargetWindow` and `SetTargetWindow`
+
+
ViewStart
+
See `GetViewStart`
+
+
+Methods inherited from wx._windows.Panel:
+
SetFocusIgnoringChildren(*args, **kwargs)
SetFocusIgnoringChildren(self)

+In contrast to `SetFocus` (see above) this will set the focus to the
+panel even of there are child windows in the panel. This is only
+rarely needed.
+ +
+Methods inherited from wx._core.Window:
+
AcceptsFocus(*args, **kwargs)
AcceptsFocus(self) -> bool

+Can this window have focus?
+ +
AcceptsFocusFromKeyboard(*args, **kwargs)
AcceptsFocusFromKeyboard(self) -> bool

+Can this window be given focus by keyboard navigation? if not, the
+only way to give it focus (provided it accepts it at all) is to click
+it.
+ +
AddChild(*args, **kwargs)
AddChild(self, Window child)

+Adds a child window. This is called automatically by window creation
+functions so should not be required by the application programmer.
+ +
AdjustForLayoutDirection(*args, **kwargs)
AdjustForLayoutDirection(self, int x, int width, int widthTotal) -> int

+Mirror coordinates for RTL layout if this window uses it and if the
+mirroring is not done automatically like Win32.
+ +
AssociateHandle(*args, **kwargs)
AssociateHandle(self, long handle)

+Associate the window with a new native handle
+ +
CacheBestSize(*args, **kwargs)
CacheBestSize(self, Size size)

+Cache the best size so it doesn't need to be calculated again, (at least until
+some properties of the window change.)
+ +
CanSetTransparent(*args, **kwargs)
CanSetTransparent(self) -> bool

+Returns ``True`` if the platform supports setting the transparency for
+this window.  Note that this method will err on the side of caution,
+so it is possible that this will return ``False`` when it is in fact
+possible to set the transparency.

+NOTE: On X-windows systems the X server must have the composite
+extension loaded, and there must be a composite manager program (such
+as xcompmgr) running.
+ +
CaptureMouse(*args, **kwargs)
CaptureMouse(self)

+Directs all mouse input to this window. Call wx.Window.ReleaseMouse to
+release the capture.

+Note that wxWindows maintains the stack of windows having captured the
+mouse and when the mouse is released the capture returns to the window
+which had had captured it previously and it is only really released if
+there were no previous window. In particular, this means that you must
+release the mouse as many times as you capture it, unless the window
+receives the `wx.MouseCaptureLostEvent` event.

+Any application which captures the mouse in the beginning of some
+operation *must* handle `wx.MouseCaptureLostEvent` and cancel this
+operation when it receives the event. The event handler must not
+recapture mouse.
+ +
Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
Centre = Center(*args, **kwargs)
Center(self, int direction=BOTH)

+Centers the window.  The parameter specifies the direction for
+cetering, and may be wx.HORIZONTAL, wx.VERTICAL or wx.BOTH. It may
+also include wx.CENTER_ON_SCREEN flag if you want to center the window
+on the entire screen and not on its parent window.  If it is a
+top-level window and has no parent then it will always be centered
+relative to the screen.
+ +
CentreOnParent = CenterOnParent(*args, **kwargs)
CenterOnParent(self, int dir=BOTH)

+Center with respect to the the parent window
+ +
ClearBackground(*args, **kwargs)
ClearBackground(self)

+Clears the window by filling it with the current background
+colour. Does not cause an erase background event to be generated.
+ +
ClientToScreen(*args, **kwargs)
ClientToScreen(self, Point pt) -> Point

+Converts to screen coordinates from coordinates relative to this window.
+ +
ClientToScreenXY(*args, **kwargs)
ClientToScreenXY(int x, int y) -> (x,y)

+Converts to screen coordinates from coordinates relative to this window.
+ +
Close(*args, **kwargs)
Close(self, bool force=False) -> bool

+This function simply generates a EVT_CLOSE event whose handler usually
+tries to close the window. It doesn't close the window itself,
+however.  If force is False (the default) then the window's close
+handler will be allowed to veto the destruction of the window.
+ +
ConvertDialogPointToPixels(*args, **kwargs)
ConvertDialogPointToPixels(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertDialogSizeToPixels(*args, **kwargs)
ConvertDialogSizeToPixels(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
ConvertPixelPointToDialog(*args, **kwargs)
ConvertPixelPointToDialog(self, Point pt) -> Point
+ +
ConvertPixelSizeToDialog(*args, **kwargs)
ConvertPixelSizeToDialog(self, Size sz) -> Size
+ +
DLG_PNT(*args, **kwargs)
DLG_PNT(self, Point pt) -> Point

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
DLG_SZE(*args, **kwargs)
DLG_SZE(self, Size sz) -> Size

+Converts a point or size from dialog units to pixels.  Dialog units
+are used for maintaining a dialog's proportions even if the font
+changes. For the x dimension, the dialog units are multiplied by the
+average character width and then divided by 4. For the y dimension,
+the dialog units are multiplied by the average character height and
+then divided by 8.
+ +
Destroy(*args, **kwargs)
Destroy(self) -> bool

+Destroys the window safely.  Frames and dialogs are not destroyed
+immediately when this function is called -- they are added to a list
+of windows to be deleted on idle time, when all the window's events
+have been processed. This prevents problems with events being sent to
+non-existent windows.

+Returns True if the window has either been successfully deleted, or it
+has been added to the list of windows pending real deletion.
+ +
DestroyChildren(*args, **kwargs)
DestroyChildren(self) -> bool

+Destroys all children of a window. Called automatically by the
+destructor.
+ +
Disable(*args, **kwargs)
Disable(self) -> bool

+Disables the window, same as Enable(false).
+ +
DissociateHandle(*args, **kwargs)
DissociateHandle(self)

+Dissociate the current native handle from the window
+ +
DragAcceptFiles(*args, **kwargs)
DragAcceptFiles(self, bool accept)

+Enables or disables eligibility for drop file events, EVT_DROP_FILES.
+Only functional on Windows.
+ +
Enable(*args, **kwargs)
Enable(self, bool enable=True) -> bool

+Enable or disable the window for user input. Note that when a parent
+window is disabled, all of its children are disabled as well and they
+are reenabled again when the parent is.  Returns true if the window
+has been enabled or disabled, false if nothing was done, i.e. if the
+window had already been in the specified state.
+ +
FindWindowById(*args, **kwargs)
FindWindowById(self, long winid) -> Window

+Find a child of this window by window ID
+ +
FindWindowByName(*args, **kwargs)
FindWindowByName(self, String name) -> Window

+Find a child of this window by name
+ +
Fit(*args, **kwargs)
Fit(self)

+Sizes the window so that it fits around its subwindows. This function
+won't do anything if there are no subwindows and will only really work
+correctly if sizers are used for the subwindows layout. Also, if the
+window has exactly one subwindow it is better (faster and the result
+is more precise as Fit adds some margin to account for fuzziness of
+its calculations) to call window.SetClientSize(child.GetSize())
+instead of calling Fit.
+ +
FitInside(*args, **kwargs)
FitInside(self)

+Similar to Fit, but sizes the interior (virtual) size of a
+window. Mainly useful with scrolled windows to reset scrollbars after
+sizing changes that do not trigger a size event, and/or scrolled
+windows without an interior sizer. This function similarly won't do
+anything if there are no subwindows.
+ +
Freeze(*args, **kwargs)
Freeze(self)

+Freezes the window or, in other words, prevents any updates from
+taking place on screen, the window is not redrawn at all. Thaw must be
+called to reenable window redrawing.  Calls to Freeze/Thaw may be
+nested, with the actual Thaw being delayed until all the nesting has
+been undone.

+This method is useful for visual appearance optimization (for example,
+it is a good idea to use it before inserting large amount of text into
+a wxTextCtrl under wxGTK) but is not implemented on all platforms nor
+for all controls so it is mostly just a hint to wxWindows and not a
+mandatory directive.
+ +
GetAcceleratorTable(*args, **kwargs)
GetAcceleratorTable(self) -> AcceleratorTable

+Gets the accelerator table for this window.
+ +
GetAdjustedBestSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetAutoLayout(*args, **kwargs)
GetAutoLayout(self) -> bool

+Returns the current autoLayout setting
+ +
GetBackgroundColour(*args, **kwargs)
GetBackgroundColour(self) -> Colour

+Returns the background colour of the window.
+ +
GetBackgroundStyle(*args, **kwargs)
GetBackgroundStyle(self) -> int

+Returns the background style of the window.

+:see: `SetBackgroundStyle`
+ +
GetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `GetEffectiveMinSize` instead.
+ +
GetBestSize(*args, **kwargs)
GetBestSize(self) -> Size

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestSizeTuple(*args, **kwargs)
GetBestSizeTuple() -> (width, height)

+This function returns the best acceptable minimal size for the
+window, if applicable. For example, for a static text control, it will
+be the minimal size such that the control label is not truncated. For
+windows containing subwindows (suzh aswx.Panel), the size returned by
+this function will be the same as the size the window would have had
+after calling Fit.
+ +
GetBestVirtualSize(*args, **kwargs)
GetBestVirtualSize(self) -> Size

+Return the largest of ClientSize and BestSize (as determined by a
+sizer, interior children, or other means)
+ +
GetBorder(*args)
GetBorder(self, long flags) -> int
+GetBorder(self) -> int

+Get border for the flags of this window
+ +
GetCaret(*args, **kwargs)
GetCaret(self) -> Caret

+Returns the caret associated with the window.
+ +
GetCharHeight(*args, **kwargs)
GetCharHeight(self) -> int

+Get the (average) character size for the current font.
+ +
GetCharWidth(*args, **kwargs)
GetCharWidth(self) -> int

+Get the (average) character size for the current font.
+ +
GetChildren(*args, **kwargs)
GetChildren(self) -> WindowList

+Returns an object containing a list of the window's children.  The
+object provides a Python sequence-like interface over the internal
+list maintained by the window..
+ +
GetClientAreaOrigin(*args, **kwargs)
GetClientAreaOrigin(self) -> Point

+Get the origin of the client area of the window relative to the
+window's top left corner (the client area may be shifted because of
+the borders, scrollbars, other decorations...)
+ +
GetClientRect(*args, **kwargs)
GetClientRect(self) -> Rect

+Get the client area position and size as a `wx.Rect` object.
+ +
GetClientSize(*args, **kwargs)
GetClientSize(self) -> Size

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetClientSizeTuple(*args, **kwargs)
GetClientSizeTuple() -> (width, height)

+This gets the size of the window's 'client area' in pixels. The client
+area is the area which may be drawn on by the programmer, excluding
+title bar, border, scrollbars, etc.
+ +
GetConstraints(*args, **kwargs)
GetConstraints(self) -> LayoutConstraints

+Returns a pointer to the window's layout constraints, or None if there
+are none.
+ +
GetContainingSizer(*args, **kwargs)
GetContainingSizer(self) -> Sizer

+Return the sizer that this window is a member of, if any, otherwise None.
+ +
GetCursor(*args, **kwargs)
GetCursor(self) -> Cursor

+Return the cursor associated with this window.
+ +
GetDropTarget(*args, **kwargs)
GetDropTarget(self) -> DropTarget

+Returns the associated drop target, which may be None.
+ +
GetEffectiveMinSize(*args, **kwargs)
GetEffectiveMinSize(self) -> Size

+This function will merge the window's best size into the window's
+minimum size, giving priority to the min size components, and returns
+the results.
+ +
GetEventHandler(*args, **kwargs)
GetEventHandler(self) -> EvtHandler

+Returns the event handler for this window. By default, the window is
+its own event handler.
+ +
GetExtraStyle(*args, **kwargs)
GetExtraStyle(self) -> long

+Returns the extra style bits for the window.
+ +
GetFont(*args, **kwargs)
GetFont(self) -> Font

+Returns the default font used for this window.
+ +
GetForegroundColour(*args, **kwargs)
GetForegroundColour(self) -> Colour

+Returns the foreground colour of the window.  The interpretation of
+foreground colour is dependent on the window class; it may be the text
+colour or other colour, or it may not be used at all.
+ +
GetFullTextExtent(*args, **kwargs)
GetFullTextExtent(String string, Font font=None) ->
+   (width, height, descent, externalLeading)

+Get the width, height, decent and leading of the text using the
+current or specified font.
+ +
GetGrandParent(*args, **kwargs)
GetGrandParent(self) -> Window

+Returns the parent of the parent of this window, or None if there
+isn't one.
+ +
GetGtkWidget(*args, **kwargs)
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+ +
GetHandle(*args, **kwargs)
GetHandle(self) -> long

+Returns the platform-specific handle (as a long integer) of the
+physical window.  On wxMSW this is the win32 window handle, on wxGTK
+it is the XWindow ID, and on wxMac it is the ControlRef.
+ +
GetHelpText(*args, **kwargs)
GetHelpText(self) -> String

+Gets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
GetHelpTextAtPoint(*args, **kwargs)
GetHelpTextAtPoint(self, Point pt, wxHelpEvent::Origin origin) -> String

+Get the help string associated with the given position in this window.

+Notice that pt may be invalid if event origin is keyboard or unknown
+and this method should return the global window help text then
+ +
GetId(*args, **kwargs)
GetId(self) -> int

+Returns the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one (or the default Id
+-1 is used) then an unique identifier with a negative value will be
+generated.
+ +
GetLabel(*args, **kwargs)
GetLabel(self) -> String

+Generic way of getting a label from any window, for identification
+purposes.  The interpretation of this function differs from class to
+class. For frames and dialogs, the value returned is the title. For
+buttons or static text controls, it is the button text. This function
+can be useful for meta-programs such as testing tools or special-needs
+access programs)which need to identify windows by name.
+ +
GetLayoutDirection(*args, **kwargs)
GetLayoutDirection(self) -> int

+Get the layout direction (LTR or RTL) for this window.  Returns
+``wx.Layout_Default`` if layout direction is not supported.
+ +
GetMaxHeight(*args, **kwargs)
GetMaxHeight(self) -> int
+ +
GetMaxSize(*args, **kwargs)
GetMaxSize(self) -> Size
+ +
GetMaxWidth(*args, **kwargs)
GetMaxWidth(self) -> int
+ +
GetMinHeight(*args, **kwargs)
GetMinHeight(self) -> int
+ +
GetMinSize(*args, **kwargs)
GetMinSize(self) -> Size
+ +
GetMinWidth(*args, **kwargs)
GetMinWidth(self) -> int
+ +
GetName(*args, **kwargs)
GetName(self) -> String

+Returns the windows name.  This name is not guaranteed to be unique;
+it is up to the programmer to supply an appropriate name in the window
+constructor or via wx.Window.SetName.
+ +
GetParent(*args, **kwargs)
GetParent(self) -> Window

+Returns the parent window of this window, or None if there isn't one.
+ +
GetPosition(*args, **kwargs)
GetPosition(self) -> Point

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetPositionTuple(*args, **kwargs)
GetPositionTuple() -> (x,y)

+Get the window's position.  Notice that the position is in client
+coordinates for child windows and screen coordinates for the top level
+ones, use `GetScreenPosition` if you need screen coordinates for all
+kinds of windows.
+ +
GetRect(*args, **kwargs)
GetRect(self) -> Rect

+Returns the size and position of the window as a `wx.Rect` object.
+ +
GetScreenPosition(*args, **kwargs)
GetScreenPosition(self) -> Point

+Get the position of the window in screen coordinantes.
+ +
GetScreenPositionTuple(*args, **kwargs)
GetScreenPositionTuple() -> (x,y)

+Get the position of the window in screen coordinantes.
+ +
GetScreenRect(*args, **kwargs)
GetScreenRect(self) -> Rect

+Returns the size and position of the window in screen coordinantes as
+a `wx.Rect` object.
+ +
GetScrollPos(*args, **kwargs)
GetScrollPos(self, int orientation) -> int

+Returns the built-in scrollbar position.
+ +
GetScrollRange(*args, **kwargs)
GetScrollRange(self, int orientation) -> int

+Returns the built-in scrollbar range.
+ +
GetScrollThumb(*args, **kwargs)
GetScrollThumb(self, int orientation) -> int

+Returns the built-in scrollbar thumb size.
+ +
GetSize(*args, **kwargs)
GetSize(self) -> Size

+Get the window size.
+ +
GetSizeTuple(*args, **kwargs)
GetSizeTuple() -> (width, height)

+Get the window size.
+ +
GetSizer(*args, **kwargs)
GetSizer(self) -> Sizer

+Return the sizer associated with the window by a previous call to
+SetSizer or None if there isn't one.
+ +
GetTextExtent(*args, **kwargs)
GetTextExtent(String string) -> (width, height)

+Get the width and height of the text using the current font.
+ +
GetThemeEnabled(*args, **kwargs)
GetThemeEnabled(self) -> bool

+Return the themeEnabled flag.
+ +
GetToolTip(*args, **kwargs)
GetToolTip(self) -> ToolTip

+get the associated tooltip or None if none
+ +
GetTopLevelParent(*args, **kwargs)
GetTopLevelParent(self) -> Window

+Returns the first frame or dialog in this window's parental hierarchy.
+ +
GetUpdateClientRect(*args, **kwargs)
GetUpdateClientRect(self) -> Rect

+Get the update rectangle region bounding box in client coords.
+ +
GetUpdateRegion(*args, **kwargs)
GetUpdateRegion(self) -> Region

+Returns the region specifying which parts of the window have been
+damaged. Should only be called within an EVT_PAINT handler.
+ +
GetValidator(*args, **kwargs)
GetValidator(self) -> Validator

+Returns a pointer to the current validator for the window, or None if
+there is none.
+ +
GetVirtualSize(*args, **kwargs)
GetVirtualSize(self) -> Size

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetVirtualSizeTuple(*args, **kwargs)
GetVirtualSizeTuple() -> (width, height)

+Get the the virtual size of the window in pixels.  For most windows
+this is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
GetWindowBorderSize(*args, **kwargs)
GetWindowBorderSize(self) -> Size

+Return the size of the left/right and top/bottom borders.
+ +
GetWindowStyle = GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowStyleFlag(*args, **kwargs)
GetWindowStyleFlag(self) -> long

+Gets the window style that was passed to the constructor or Create
+method.
+ +
GetWindowVariant(*args, **kwargs)
GetWindowVariant(self) -> int
+ +
HasCapture(*args, **kwargs)
HasCapture(self) -> bool

+Returns true if this window has the current mouse capture.
+ +
HasFlag(*args, **kwargs)
HasFlag(self, int flag) -> bool

+Test if the given style is set for this window.
+ +
HasMultiplePages(*args, **kwargs)
HasMultiplePages(self) -> bool
+ +
HasScrollbar(*args, **kwargs)
HasScrollbar(self, int orient) -> bool

+Does the window have the scrollbar for this orientation?
+ +
HasTransparentBackground(*args, **kwargs)
HasTransparentBackground(self) -> bool

+Returns True if this window's background is transparent (as, for
+example, for `wx.StaticText`) and should show the parent window's
+background.

+This method is mostly used internally by the library itself and you
+normally shouldn't have to call it. You may, however, have to override
+it in your custom control classes to ensure that background is painted
+correctly.
+ +
Hide(*args, **kwargs)
Hide(self) -> bool

+Equivalent to calling Show(False).
+ +
HitTest(*args, **kwargs)
HitTest(self, Point pt) -> int

+Test where the given (in client coords) point lies
+ +
HitTestXY(*args, **kwargs)
HitTestXY(self, int x, int y) -> int

+Test where the given (in client coords) point lies
+ +
InheritAttributes(*args, **kwargs)
InheritAttributes(self)

+This function is (or should be, in case of custom controls) called
+during window creation to intelligently set up the window visual
+attributes, that is the font and the foreground and background
+colours.

+By 'intelligently' the following is meant: by default, all windows use
+their own default attributes. However if some of the parent's
+attributes are explicitly changed (that is, using SetFont and not
+SetOwnFont) and if the corresponding attribute hadn't been
+explicitly set for this window itself, then this window takes the same
+value as used by the parent. In addition, if the window overrides
+ShouldInheritColours to return false, the colours will not be changed
+no matter what and only the font might.

+This rather complicated logic is necessary in order to accommodate the
+different usage scenarios. The most common one is when all default
+attributes are used and in this case, nothing should be inherited as
+in modern GUIs different controls use different fonts (and colours)
+than their siblings so they can't inherit the same value from the
+parent. However it was also deemed desirable to allow to simply change
+the attributes of all children at once by just changing the font or
+colour of their common parent, hence in this case we do inherit the
+parents attributes.
+ +
InheritsBackgroundColour(*args, **kwargs)
InheritsBackgroundColour(self) -> bool
+ +
InitDialog(*args, **kwargs)
InitDialog(self)

+Sends an EVT_INIT_DIALOG event, whose handler usually transfers data
+to the dialog via validators.
+ +
InvalidateBestSize(*args, **kwargs)
InvalidateBestSize(self)

+Reset the cached best size value so it will be recalculated the next
+time it is needed.
+ +
IsBeingDeleted(*args, **kwargs)
IsBeingDeleted(self) -> bool

+Is the window in the process of being deleted?
+ +
IsDoubleBuffered(*args, **kwargs)
IsDoubleBuffered(self) -> bool

+Returns ``True`` if the window contents is double-buffered by the
+system, i.e. if any drawing done on the window is really done on a
+temporary backing surface and transferred to the screen all at once
+later.
+ +
IsEnabled(*args, **kwargs)
IsEnabled(self) -> bool

+Returns true if the window is enabled for input, false otherwise.
+ +
IsExposed(*args, **kwargs)
IsExposed(self, int x, int y, int w=1, int h=1) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedPoint(*args, **kwargs)
IsExposedPoint(self, Point pt) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsExposedRect(*args, **kwargs)
IsExposedRect(self, Rect rect) -> bool

+Returns true if the given point or rectangle area has been exposed
+since the last repaint. Call this in an paint event handler to
+optimize redrawing by only redrawing those areas, which have been
+exposed.
+ +
IsFrozen(*args, **kwargs)
IsFrozen(self) -> bool

+Returns ``True`` if the window has been frozen and not thawed yet.

+:see: `Freeze` and `Thaw`
+ +
IsRetained(*args, **kwargs)
IsRetained(self) -> bool

+Returns true if the window is retained, false otherwise.  Retained
+windows are only available on X platforms.
+ +
IsShown(*args, **kwargs)
IsShown(self) -> bool

+Returns true if the window is shown, false if it has been hidden.
+ +
IsShownOnScreen(*args, **kwargs)
IsShownOnScreen(self) -> bool

+Returns ``True`` if the window is physically visible on the screen,
+i.e. it is shown and all its parents up to the toplevel window are
+shown as well.
+ +
IsTopLevel(*args, **kwargs)
IsTopLevel(self) -> bool

+Returns true if the given window is a top-level one. Currently all
+frames and dialogs are always considered to be top-level windows (even
+if they have a parent window).
+ +
Layout(*args, **kwargs)
Layout(self) -> bool

+Invokes the constraint-based layout algorithm or the sizer-based
+algorithm for this window.  See SetAutoLayout: when auto layout is on,
+this function gets called automatically by the default EVT_SIZE
+handler when the window is resized.
+ +
LineDown(*args, **kwargs)
LineDown(self) -> bool

+This is just a wrapper for ScrollLines(1).
+ +
LineUp(*args, **kwargs)
LineUp(self) -> bool

+This is just a wrapper for ScrollLines(-1).
+ +
Lower(*args, **kwargs)
Lower(self)

+Lowers the window to the bottom of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
MakeModal(*args, **kwargs)
MakeModal(self, bool modal=True)

+Disables all other windows in the application so that the user can
+only interact with this window.  Passing False will reverse this
+effect.
+ +
Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
MoveAfterInTabOrder(*args, **kwargs)
MoveAfterInTabOrder(self, Window win)

+Moves this window in the tab navigation order after the specified
+sibling window.  This means that when the user presses the TAB key on
+that other window, the focus switches to this window.

+The default tab order is the same as creation order.  This function
+and `MoveBeforeInTabOrder` allow to change it after creating all the
+windows.
+ +
MoveBeforeInTabOrder(*args, **kwargs)
MoveBeforeInTabOrder(self, Window win)

+Same as `MoveAfterInTabOrder` except that it inserts this window just
+before win instead of putting it right after it.
+ +
MoveXY(*args, **kwargs)
MoveXY(self, int x, int y, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
Navigate(*args, **kwargs)
Navigate(self, int flags=NavigationKeyEvent.IsForward) -> bool

+Does keyboard navigation from this window to another, by sending a
+`wx.NavigationKeyEvent`.
+ +
PageDown(*args, **kwargs)
PageDown(self) -> bool

+This is just a wrapper for ScrollPages(1).
+ +
PageUp(*args, **kwargs)
PageUp(self) -> bool

+This is just a wrapper for ScrollPages(-1).
+ +
PopEventHandler(*args, **kwargs)
PopEventHandler(self, bool deleteHandler=False) -> EvtHandler

+Removes and returns the top-most event handler on the event handler
+stack.  If deleteHandler is True then the wx.EvtHandler object will be
+destroyed after it is popped, and ``None`` will be returned instead.
+ +
PopupMenu(*args, **kwargs)
PopupMenu(self, Menu menu, Point pos=DefaultPosition) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PopupMenuXY(*args, **kwargs)
PopupMenuXY(self, Menu menu, int x=-1, int y=-1) -> bool

+Pops up the given menu at the specified coordinates, relative to this window,
+and returns control when the user has dismissed the menu. If a menu item is
+selected, the corresponding menu event is generated and will be processed as
+usual.  If the default position is given then the current position of the
+mouse cursor will be used.
+ +
PostCreate(self, pre)
Phase 3 of the 2-phase create <wink!>
+Call this method after precreating the window with the 2-phase create method.
+ +
PrepareDC(*args, **kwargs)
PrepareDC(self, DC dc)

+Call this function to prepare the device context for drawing a
+scrolled image. It sets the device origin according to the current
+scroll position.
+ +
PushEventHandler(*args, **kwargs)
PushEventHandler(self, EvtHandler handler)

+Pushes this event handler onto the event handler stack for the window.
+An event handler is an object that is capable of processing the events
+sent to a window.  (In other words, is able to dispatch the events to a
+handler function.)  By default, the window is its own event handler,
+but an application may wish to substitute another, for example to
+allow central implementation of event-handling for a variety of
+different window classes.

+wx.Window.PushEventHandler allows an application to set up a chain of
+event handlers, where an event not handled by one event handler is
+handed to the next one in the chain.  Use `wx.Window.PopEventHandler`
+to remove the event handler.  Ownership of the handler is *not* given
+to the window, so you should be sure to pop the handler before the
+window is destroyed and either let PopEventHandler destroy it, or call
+its Destroy method yourself.
+ +
Raise(*args, **kwargs)
Raise(self)

+Raises the window to the top of the window hierarchy.  In current
+version of wxWidgets this works both for managed and child windows.
+ +
Refresh(*args, **kwargs)
Refresh(self, bool eraseBackground=True, Rect rect=None)

+Mark the specified rectangle (or the whole window) as "dirty" so it
+will be repainted.  Causes an EVT_PAINT event to be generated and sent
+to the window.
+ +
RefreshRect(*args, **kwargs)
RefreshRect(self, Rect rect, bool eraseBackground=True)

+Redraws the contents of the given rectangle: the area inside it will
+be repainted.  This is the same as Refresh but has a nicer syntax.
+ +
RegisterHotKey(*args, **kwargs)
RegisterHotKey(self, int hotkeyId, int modifiers, int keycode) -> bool

+Registers a system wide hotkey. Every time the user presses the hotkey
+registered here, this window will receive a hotkey event. It will
+receive the event even if the application is in the background and
+does not have the input focus because the user is working with some
+other application.  To bind an event handler function to this hotkey
+use EVT_HOTKEY with an id equal to hotkeyId.  Returns True if the
+hotkey was registered successfully.
+ +
ReleaseMouse(*args, **kwargs)
ReleaseMouse(self)

+Releases mouse input captured with wx.Window.CaptureMouse.
+ +
RemoveChild(*args, **kwargs)
RemoveChild(self, Window child)

+Removes a child window. This is called automatically by window
+deletion functions so should not be required by the application
+programmer.
+ +
RemoveEventHandler(*args, **kwargs)
RemoveEventHandler(self, EvtHandler handler) -> bool

+Find the given handler in the event handler chain and remove (but not
+delete) it from the event handler chain, returns True if it was found
+and False otherwise (this also results in an assert failure so this
+function should only be called when the handler is supposed to be
+there.)
+ +
Reparent(*args, **kwargs)
Reparent(self, Window newParent) -> bool

+Reparents the window, i.e the window will be removed from its current
+parent window (e.g. a non-standard toolbar in a wxFrame) and then
+re-inserted into another. Available on Windows and GTK.  Returns True
+if the parent was changed, False otherwise (error or newParent ==
+oldParent)
+ +
ScreenToClient(*args, **kwargs)
ScreenToClient(self, Point pt) -> Point

+Converts from screen to client window coordinates.
+ +
ScreenToClientXY(*args, **kwargs)
ScreenToClientXY(int x, int y) -> (x,y)

+Converts from screen to client window coordinates.
+ +
ScrollLines(*args, **kwargs)
ScrollLines(self, int lines) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of lines down, if lines is positive, or up if lines
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollPages(*args, **kwargs)
ScrollPages(self, int pages) -> bool

+If the platform and window class supports it, scrolls the window by
+the given number of pages down, if pages is positive, or up if pages
+is negative.  Returns True if the window was scrolled, False if it was
+already on top/bottom and nothing was done.
+ +
ScrollWindow(*args, **kwargs)
ScrollWindow(self, int dx, int dy, Rect rect=None)

+Physically scrolls the pixels in the window and move child windows
+accordingly.  Use this function to optimise your scrolling
+implementations, to minimise the area that must be redrawn. Note that
+it is rarely required to call this function from a user program.
+ +
SendSizeEvent(self)
+ +
SetAcceleratorTable(*args, **kwargs)
SetAcceleratorTable(self, AcceleratorTable accel)

+Sets the accelerator table for this window.
+ +
SetAutoLayout(*args, **kwargs)
SetAutoLayout(self, bool autoLayout)

+Determines whether the Layout function will be called automatically
+when the window is resized.  lease note that this only happens for the
+windows usually used to contain children, namely `wx.Panel` and
+`wx.TopLevelWindow` (and the classes deriving from them).

+This method is called implicitly by `SetSizer` but if you use
+`SetConstraints` you should call it manually or otherwise the window
+layout won't be correctly updated when its size changes.
+ +
SetBackgroundColour(*args, **kwargs)
SetBackgroundColour(self, Colour colour) -> bool

+Sets the background colour of the window.  Returns True if the colour
+was changed.  The background colour is usually painted by the default
+EVT_ERASE_BACKGROUND event handler function under Windows and
+automatically under GTK.  Using `wx.NullColour` will reset the window
+to the default background colour.

+Note that setting the background colour may not cause an immediate
+refresh, so you may wish to call `ClearBackground` or `Refresh` after
+calling this function.

+Using this function will disable attempts to use themes for this
+window, if the system supports them.  Use with care since usually the
+themes represent the appearance chosen by the user to be used for all
+applications on the system.
+ +
SetBackgroundStyle(*args, **kwargs)
SetBackgroundStyle(self, int style) -> bool

+Returns the background style of the window. The background style
+indicates how the background of the window is drawn.

+    ======================  ========================================
+    wx.BG_STYLE_SYSTEM      The background colour or pattern should
+                            be determined by the system
+    wx.BG_STYLE_COLOUR      The background should be a solid colour
+    wx.BG_STYLE_CUSTOM      The background will be implemented by the
+                            application.
+    ======================  ========================================

+On GTK+, use of wx.BG_STYLE_CUSTOM allows the flicker-free drawing of
+a custom background, such as a tiled bitmap. Currently the style has
+no effect on other platforms.

+:see: `GetBackgroundStyle`, `SetBackgroundColour`
+ +
SetBestFittingSize = deprecatedWrapper(*args, **kwargs)
Use `SetInitialSize`
+ +
SetCaret(*args, **kwargs)
SetCaret(self, Caret caret)

+Sets the caret associated with the window.
+ +
SetClientRect(*args, **kwargs)
SetClientRect(self, Rect rect)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSize(*args, **kwargs)
SetClientSize(self, Size size)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetClientSizeWH(*args, **kwargs)
SetClientSizeWH(self, int width, int height)

+This sets the size of the window client area in pixels. Using this
+function to size a window tends to be more device-independent than
+wx.Window.SetSize, since the application need not worry about what
+dimensions the border or title bar have when trying to fit the window
+around panel items, for example.
+ +
SetConstraints(*args, **kwargs)
SetConstraints(self, LayoutConstraints constraints)

+Sets the window to have the given layout constraints. If an existing
+layout constraints object is already owned by the window, it will be
+deleted.  Pass None to disassociate and delete the window's current
+constraints.

+You must call SetAutoLayout to tell a window to use the constraints
+automatically in its default EVT_SIZE handler; otherwise, you must
+handle EVT_SIZE yourself and call Layout() explicitly. When setting
+both a wx.LayoutConstraints and a wx.Sizer, only the sizer will have
+effect.
+ +
SetContainingSizer(*args, **kwargs)
SetContainingSizer(self, Sizer sizer)

+This normally does not need to be called by application code. It is
+called internally when a window is added to a sizer, and is used so
+the window can remove itself from the sizer when it is destroyed.
+ +
SetCursor(*args, **kwargs)
SetCursor(self, Cursor cursor) -> bool

+Sets the window's cursor. Notice that the window cursor also sets it
+for the children of the window implicitly.

+The cursor may be wx.NullCursor in which case the window cursor will
+be reset back to default.
+ +
SetDimensions(*args, **kwargs)
SetDimensions(self, int x, int y, int width, int height, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels.  The sizeFlags
+parameter indicates the interpretation of the other params if they are
+equal to -1.

+    ========================  ======================================
+    wx.SIZE_AUTO              A -1 indicates that a class-specific
+                              default should be used.
+    wx.SIZE_USE_EXISTING      Axisting dimensions should be used if
+                              -1 values are supplied.
+    wxSIZE_ALLOW_MINUS_ONE    Allow dimensions of -1 and less to be
+                              interpreted as real dimensions, not
+                              default values.
+    ========================  ======================================
+ +
SetDoubleBuffered(*args, **kwargs)
SetDoubleBuffered(self, bool on)

+Currently wxGTK2 only.
+ +
SetDropTarget(*args, **kwargs)
SetDropTarget(self, DropTarget dropTarget)

+Associates a drop target with this window.  If the window already has
+a drop target, it is deleted.
+ +
SetEventHandler(*args, **kwargs)
SetEventHandler(self, EvtHandler handler)

+Sets the event handler for this window.  An event handler is an object
+that is capable of processing the events sent to a window.  (In other
+words, is able to dispatch the events to handler function.)  By
+default, the window is its own event handler, but an application may
+wish to substitute another, for example to allow central
+implementation of event-handling for a variety of different window
+classes.

+It is usually better to use `wx.Window.PushEventHandler` since this sets
+up a chain of event handlers, where an event not handled by one event
+handler is handed off to the next one in the chain.
+ +
SetExtraStyle(*args, **kwargs)
SetExtraStyle(self, long exStyle)

+Sets the extra style bits for the window.  Extra styles are the less
+often used style bits which can't be set with the constructor or with
+SetWindowStyleFlag()
+ +
SetFocus(*args, **kwargs)
SetFocus(self)

+Set's the focus to this window, allowing it to receive keyboard input.
+ +
SetFocusFromKbd(*args, **kwargs)
SetFocusFromKbd(self)

+Set focus to this window as the result of a keyboard action.  Normally
+only called internally.
+ +
SetFont(*args, **kwargs)
SetFont(self, Font font) -> bool

+Sets the font for this window.
+ +
SetForegroundColour(*args, **kwargs)
SetForegroundColour(self, Colour colour) -> bool

+Sets the foreground colour of the window.  Returns True is the colour
+was changed.  The interpretation of foreground colour is dependent on
+the window class; it may be the text colour or other colour, or it may
+not be used at all.
+ +
SetHelpText(*args, **kwargs)
SetHelpText(self, String text)

+Sets the help text to be used as context-sensitive help for this
+window.  Note that the text is actually stored by the current
+`wx.HelpProvider` implementation, and not in the window object itself.
+ +
SetHelpTextForId(*args, **kwargs)
SetHelpTextForId(self, String text)

+Associate this help text with all windows with the same id as this
+one.
+ +
SetId(*args, **kwargs)
SetId(self, int winid)

+Sets the identifier of the window.  Each window has an integer
+identifier. If the application has not provided one, an identifier
+will be generated. Normally, the identifier should be provided on
+creation and should not be modified subsequently.
+ +
SetInitialSize(*args, **kwargs)
SetInitialSize(self, Size size=DefaultSize)

+A 'Smart' SetSize that will fill in default size components with the
+window's *best size* values.  Also set's the minsize for use with sizers.
+ +
SetLabel(*args, **kwargs)
SetLabel(self, String label)

+Set the text which the window shows in its label if applicable.
+ +
SetLayoutDirection(*args, **kwargs)
SetLayoutDirection(self, int dir)

+Set the layout direction (LTR or RTL) for this window.
+ +
SetMaxSize(*args, **kwargs)
SetMaxSize(self, Size maxSize)

+A more convenient method than `SetSizeHints` for setting just the
+max size.
+ +
SetMinSize(*args, **kwargs)
SetMinSize(self, Size minSize)

+A more convenient method than `SetSizeHints` for setting just the
+min size.
+ +
SetName(*args, **kwargs)
SetName(self, String name)

+Sets the window's name.  The window name is used for ressource setting
+in X, it is not the same as the window title/label
+ +
SetOwnBackgroundColour(*args, **kwargs)
SetOwnBackgroundColour(self, Colour colour)
+ +
SetOwnFont(*args, **kwargs)
SetOwnFont(self, Font font)
+ +
SetOwnForegroundColour(*args, **kwargs)
SetOwnForegroundColour(self, Colour colour)
+ +
SetPosition = Move(*args, **kwargs)
Move(self, Point pt, int flags=SIZE_USE_EXISTING)

+Moves the window to the given position.
+ +
SetRect(*args, **kwargs)
SetRect(self, Rect rect, int sizeFlags=SIZE_AUTO)

+Sets the position and size of the window in pixels using a wx.Rect.
+ +
SetScrollPos(*args, **kwargs)
SetScrollPos(self, int orientation, int pos, bool refresh=True)

+Sets the position of one of the built-in scrollbars.
+ +
SetScrollbar(*args, **kwargs)
SetScrollbar(self, int orientation, int position, int thumbSize, int range, 
+    bool refresh=True)

+Sets the scrollbar properties of a built-in scrollbar.
+ +
SetSize(*args, **kwargs)
SetSize(self, Size size)

+Sets the size of the window in pixels.
+ +
SetSizeHints(*args, **kwargs)
SetSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1, int incW=-1, 
+    int incH=-1)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeHintsSz(*args, **kwargs)
SetSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize, Size incSize=DefaultSize)

+Allows specification of minimum and maximum window sizes, and window
+size increments. If a pair of values is not set (or set to -1), the
+default values will be used.  If this function is called, the user
+will not be able to size the window outside the given bounds (if it is
+a top-level window.)  Sizers will also inspect the minimum window size
+and will use that value if set when calculating layout.

+The resizing increments are only significant under Motif or Xt.
+ +
SetSizeWH(*args, **kwargs)
SetSizeWH(self, int width, int height)

+Sets the size of the window in pixels.
+ +
SetSizer(*args, **kwargs)
SetSizer(self, Sizer sizer, bool deleteOld=True)

+Sets the window to have the given layout sizer. The window will then
+own the object, and will take care of its deletion. If an existing
+layout sizer object is already owned by the window, it will be deleted
+if the deleteOld parameter is true. Note that this function will also
+call SetAutoLayout implicitly with a True parameter if the sizer is
+non-None, and False otherwise.
+ +
SetSizerAndFit(*args, **kwargs)
SetSizerAndFit(self, Sizer sizer, bool deleteOld=True)

+The same as SetSizer, except it also sets the size hints for the
+window based on the sizer's minimum size.
+ +
SetThemeEnabled(*args, **kwargs)
SetThemeEnabled(self, bool enableTheme)

+This function tells a window if it should use the system's "theme"
+ code to draw the windows' background instead if its own background
+ drawing code. This will only have an effect on platforms that support
+ the notion of themes in user defined windows. One such platform is
+ GTK+ where windows can have (very colourful) backgrounds defined by a
+ user's selected theme.

+Dialogs, notebook pages and the status bar have this flag set to true
+by default so that the default look and feel is simulated best.
+ +
SetToolTip(*args, **kwargs)
SetToolTip(self, ToolTip tip)

+Attach a tooltip to the window.
+ +
SetToolTipString(*args, **kwargs)
SetToolTipString(self, String tip)

+Attach a tooltip to the window.
+ +
SetTransparent(*args, **kwargs)
SetTransparent(self, byte alpha) -> bool

+Attempt to set the transparency of this window to the ``alpha`` value,
+returns True on success.  The ``alpha`` value is an integer in the
+range of 0 to 255, where 0 is fully transparent and 255 is fully
+opaque.
+ +
SetValidator(*args, **kwargs)
SetValidator(self, Validator validator)

+Deletes the current validator (if any) and sets the window validator,
+having called wx.Validator.Clone to create a new validator of this
+type.
+ +
SetVirtualSize(*args, **kwargs)
SetVirtualSize(self, Size size)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetVirtualSizeHints(*args, **kwargs)
SetVirtualSizeHints(self, int minW, int minH, int maxW=-1, int maxH=-1)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeHintsSz(*args, **kwargs)
SetVirtualSizeHintsSz(self, Size minSize, Size maxSize=DefaultSize)

+Allows specification of minimum and maximum virtual window sizes. If a
+pair of values is not set (or set to -1), the default values will be
+used.  If this function is called, the user will not be able to size
+the virtual area of the window outside the given bounds.
+ +
SetVirtualSizeWH(*args, **kwargs)
SetVirtualSizeWH(self, int w, int h)

+Set the the virtual size of a window in pixels.  For most windows this
+is just the client area of the window, but for some like scrolled
+windows it is more or less independent of the screen window size.
+ +
SetWindowStyle = SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowStyleFlag(*args, **kwargs)
SetWindowStyleFlag(self, long style)

+Sets the style of the window. Please note that some styles cannot be
+changed after the window creation and that Refresh() might need to be
+called after changing the others for the change to take place
+immediately.
+ +
SetWindowVariant(*args, **kwargs)
SetWindowVariant(self, int variant)

+Sets the variant of the window/font size to use for this window, if
+the platform supports variants, for example, wxMac.
+ +
ShouldInheritColours(*args, **kwargs)
ShouldInheritColours(self) -> bool

+Return true from here to allow the colours of this window to be
+changed by InheritAttributes, returning false forbids inheriting them
+from the parent window.

+The base class version returns false, but this method is overridden in
+wxControl where it returns true.
+ +
Show(*args, **kwargs)
Show(self, bool show=True) -> bool

+Shows or hides the window. You may need to call Raise for a top level
+window if you want to bring it to top, although this is not needed if
+Show is called immediately after the frame creation.  Returns True if
+the window has been shown or hidden or False if nothing was done
+because it already was in the requested state.
+ +
Thaw(*args, **kwargs)
Thaw(self)

+Reenables window updating after a previous call to Freeze.  Calls to
+Freeze/Thaw may be nested, so Thaw must be called the same number of
+times that Freeze was before the window will be updated.
+ +
ToggleWindowStyle(*args, **kwargs)
ToggleWindowStyle(self, int flag) -> bool

+Turn the flag on if it had been turned off before and vice versa,
+returns True if the flag is turned on by this function call.
+ +
TransferDataFromWindow(*args, **kwargs)
TransferDataFromWindow(self) -> bool

+Transfers values from child controls to data areas specified by their
+validators. Returns false if a transfer failed.  If the window has
+wx.WS_EX_VALIDATE_RECURSIVELY extra style flag set, the method will
+also call TransferDataFromWindow() of all child windows.
+ +
TransferDataToWindow(*args, **kwargs)
TransferDataToWindow(self) -> bool

+Transfers values to child controls from data areas specified by their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call TransferDataToWindow() of
+all child windows.
+ +
UnregisterHotKey(*args, **kwargs)
UnregisterHotKey(self, int hotkeyId) -> bool

+Unregisters a system wide hotkey.
+ +
Update(*args, **kwargs)
Update(self)

+Calling this method immediately repaints the invalidated area of the
+window instead of waiting for the EVT_PAINT event to happen, (normally
+this would usually only happen when the flow of control returns to the
+event loop.)  Notice that this function doesn't refresh the window and
+does nothing if the window has been already repainted.  Use `Refresh`
+first if you want to immediately redraw the window (or some portion of
+it) unconditionally.
+ +
UpdateWindowUI(*args, **kwargs)
UpdateWindowUI(self, long flags=UPDATE_UI_NONE)

+This function sends EVT_UPDATE_UI events to the window. The particular
+implementation depends on the window; for example a wx.ToolBar will
+send an update UI event for each toolbar button, and a wx.Frame will
+send an update UI event for each menubar menu item. You can call this
+function from your application to ensure that your UI is up-to-date at
+a particular point in time (as far as your EVT_UPDATE_UI handlers are
+concerned). This may be necessary if you have called
+`wx.UpdateUIEvent.SetMode` or `wx.UpdateUIEvent.SetUpdateInterval` to
+limit the overhead that wxWindows incurs by sending update UI events
+in idle time.
+ +
UseBgCol(*args, **kwargs)
UseBgCol(self) -> bool
+ +
Validate(*args, **kwargs)
Validate(self) -> bool

+Validates the current values of the child controls using their
+validators.  If the window has wx.WS_EX_VALIDATE_RECURSIVELY extra
+style flag set, the method will also call Validate() of all child
+windows.  Returns false if any of the validations failed.
+ +
WarpPointer(*args, **kwargs)
WarpPointer(self, int x, int y)

+Moves the pointer to the given position on the window.

+NOTE: This function is not supported under Mac because Apple Human
+Interface Guidelines forbid moving the mouse cursor programmatically.
+ +
+Static methods inherited from wx._core.Window:
+
FindFocus(*args, **kwargs)
FindFocus() -> Window

+Returns the window or control that currently has the keyboard focus,
+or None.
+ +
GetCapture(*args, **kwargs)
GetCapture() -> Window

+Returns the window which currently captures the mouse or None
+ +
NewControlId(*args, **kwargs)
NewControlId() -> int

+Generate a control id for the controls which were not given one.
+ +
NextControlId(*args, **kwargs)
NextControlId(int winid) -> int

+Get the id of the control following the one with the given
+autogenerated) id
+ +
PrevControlId(*args, **kwargs)
PrevControlId(int winid) -> int

+Get the id of the control preceding the one with the given
+autogenerated) id
+ +
+Data descriptors inherited from wx._core.Window:
+
AcceleratorTable
+
See `GetAcceleratorTable` and `SetAcceleratorTable`
+
+
AutoLayout
+
See `GetAutoLayout` and `SetAutoLayout`
+
+
BackgroundColour
+
See `GetBackgroundColour` and `SetBackgroundColour`
+
+
BackgroundStyle
+
See `GetBackgroundStyle` and `SetBackgroundStyle`
+
+
BestSize
+
See `GetBestSize`
+
+
BestVirtualSize
+
See `GetBestVirtualSize`
+
+
Border
+
See `GetBorder`
+
+
Caret
+
See `GetCaret` and `SetCaret`
+
+
CharHeight
+
See `GetCharHeight`
+
+
CharWidth
+
See `GetCharWidth`
+
+
Children
+
See `GetChildren`
+
+
ClientAreaOrigin
+
See `GetClientAreaOrigin`
+
+
ClientRect
+
See `GetClientRect` and `SetClientRect`
+
+
ClientSize
+
See `GetClientSize` and `SetClientSize`
+
+
Constraints
+
See `GetConstraints` and `SetConstraints`
+
+
ContainingSizer
+
See `GetContainingSizer` and `SetContainingSizer`
+
+
Cursor
+
See `GetCursor` and `SetCursor`
+
+
DefaultAttributes
+
See `GetDefaultAttributes`
+
+
DropTarget
+
See `GetDropTarget` and `SetDropTarget`
+
+
EffectiveMinSize
+
See `GetEffectiveMinSize`
+
+
Enabled
+
See `IsEnabled` and `Enable`
+
+
EventHandler
+
See `GetEventHandler` and `SetEventHandler`
+
+
ExtraStyle
+
See `GetExtraStyle` and `SetExtraStyle`
+
+
Font
+
See `GetFont` and `SetFont`
+
+
ForegroundColour
+
See `GetForegroundColour` and `SetForegroundColour`
+
+
GrandParent
+
See `GetGrandParent`
+
+
GtkWidget
+
GetGtkWidget(self) -> long

+On wxGTK returns a pointer to the GtkWidget for this window as a long
+integer.  On the other platforms this method returns zero.
+
+
Handle
+
See `GetHandle`
+
+
HelpText
+
See `GetHelpText` and `SetHelpText`
+
+
Id
+
See `GetId` and `SetId`
+
+
Label
+
See `GetLabel` and `SetLabel`
+
+
LayoutDirection
+
See `GetLayoutDirection` and `SetLayoutDirection`
+
+
MaxHeight
+
See `GetMaxHeight`
+
+
MaxSize
+
See `GetMaxSize` and `SetMaxSize`
+
+
MaxWidth
+
See `GetMaxWidth`
+
+
MinHeight
+
See `GetMinHeight`
+
+
MinSize
+
See `GetMinSize` and `SetMinSize`
+
+
MinWidth
+
See `GetMinWidth`
+
+
Name
+
See `GetName` and `SetName`
+
+
Parent
+
See `GetParent`
+
+
Position
+
See `GetPosition` and `SetPosition`
+
+
Rect
+
See `GetRect` and `SetRect`
+
+
ScreenPosition
+
See `GetScreenPosition`
+
+
ScreenRect
+
See `GetScreenRect`
+
+
Shown
+
See `IsShown` and `Show`
+
+
Size
+
See `GetSize` and `SetSize`
+
+
Sizer
+
See `GetSizer` and `SetSizer`
+
+
ThemeEnabled
+
See `GetThemeEnabled` and `SetThemeEnabled`
+
+
ToolTip
+
See `GetToolTip` and `SetToolTip`
+
+
TopLevel
+
See `IsTopLevel`
+
+
TopLevelParent
+
See `GetTopLevelParent`
+
+
UpdateClientRect
+
See `GetUpdateClientRect`
+
+
UpdateRegion
+
See `GetUpdateRegion`
+
+
Validator
+
See `GetValidator` and `SetValidator`
+
+
VirtualSize
+
See `GetVirtualSize` and `SetVirtualSize`
+
+
WindowStyle
+
See `GetWindowStyle` and `SetWindowStyle`
+
+
WindowStyleFlag
+
See `GetWindowStyleFlag` and `SetWindowStyleFlag`
+
+
WindowVariant
+
See `GetWindowVariant` and `SetWindowVariant`
+
+
+Methods inherited from wx._core.EvtHandler:
+
AddPendingEvent(*args, **kwargs)
AddPendingEvent(self, Event event)
+ +
Bind(self, event, handler, source=None, id=-1, id2=-1)
Bind an event to an event handler.

+:param event: One of the EVT_* objects that specifies the
+              type of event to bind,

+:param handler: A callable object to be invoked when the
+              event is delivered to self.  Pass None to
+              disconnect an event handler.

+:param source: Sometimes the event originates from a
+              different window than self, but you still
+              want to catch it in self.  (For example, a
+              button event delivered to a frame.)  By
+              passing the source of the event, the event
+              handling system is able to differentiate
+              between the same event type from different
+              controls.

+:param id: Used to spcify the event source by ID instead
+           of instance.

+:param id2: Used when it is desirable to bind a handler
+              to a range of IDs, such as with EVT_MENU_RANGE.
+ +
Connect(*args, **kwargs)
Connect(self, int id, int lastId, int eventType, PyObject func)
+ +
Disconnect(*args, **kwargs)
Disconnect(self, int id, int lastId=-1, EventType eventType=wxEVT_NULL) -> bool
+ +
GetEvtHandlerEnabled(*args, **kwargs)
GetEvtHandlerEnabled(self) -> bool
+ +
GetNextHandler(*args, **kwargs)
GetNextHandler(self) -> EvtHandler
+ +
GetPreviousHandler(*args, **kwargs)
GetPreviousHandler(self) -> EvtHandler
+ +
ProcessEvent(*args, **kwargs)
ProcessEvent(self, Event event) -> bool
+ +
ProcessPendingEvents(*args, **kwargs)
ProcessPendingEvents(self)
+ +
SetEvtHandlerEnabled(*args, **kwargs)
SetEvtHandlerEnabled(self, bool enabled)
+ +
SetNextHandler(*args, **kwargs)
SetNextHandler(self, EvtHandler handler)
+ +
SetPreviousHandler(*args, **kwargs)
SetPreviousHandler(self, EvtHandler handler)
+ +
Unbind(self, event, source=None, id=-1, id2=-1)
Disconencts the event handler binding for event from self.
+Returns True if successful.
+ +
+Data descriptors inherited from wx._core.EvtHandler:
+
EvtHandlerEnabled
+
See `GetEvtHandlerEnabled` and `SetEvtHandlerEnabled`
+
+
NextHandler
+
See `GetNextHandler` and `SetNextHandler`
+
+
PreviousHandler
+
See `GetPreviousHandler` and `SetPreviousHandler`
+
+
+Methods inherited from wx._core.Object:
+
GetClassName(*args, **kwargs)
GetClassName(self) -> String

+Returns the class name of the C++ class using wxRTTI.
+ +
IsSameAs(*args, **kwargs)
IsSameAs(self, Object p) -> bool

+For wx.Objects that use C++ reference counting internally, this method
+can be used to determine if two objects are referencing the same data
+object.
+ +
+Data descriptors inherited from wx._core.Object:
+
ClassName
+
See `GetClassName`
+
+
__dict__
+
dictionary for instance variables (if defined)
+
+
__weakref__
+
list of weak references to the object (if defined)
+
+

+ + + + + +
 
+Data
       wxID_TAB = 112
+ \ No newline at end of file diff --git a/pydoc/wxmtxy_version.html b/pydoc/wxmtxy_version.html new file mode 100644 index 0000000..2bf22fc --- /dev/null +++ b/pydoc/wxmtxy_version.html @@ -0,0 +1,44 @@ + + +Python: module wxmtxy_version + + + + +
 
+ 
wxmtxy_version (version 0.5)
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy_version.py
+

# full contents of __file_license__ appear at the top of each file

+

+ + + + + +
 
+Data
       __author__ = 'Pete R. Jemian'
+__author_email__ = 'jemian@anl.gov'
+__company_name__ = 'Advanced Photon Source'
+__contributor_credits__ = ['', 'other contributors:', 'Geoff Savage/FNAL and John Hammonds/APS for CaChannel', 'Tim Mooney/APS for ca_util']
+__copyright__ = '(c) 2009, 2010'
+__documentation__ = '\n *wxmtxy* (an EPICS GUI tool) provides suppo...pe of EPICS PV that will accept a numeric value.\n'
+__file_license__ = '\n#**********************************************...************************************************\n'
+__license__ = 'Copyright (c) 2009-2010 University of Chicago. A... OF THE\n POSSIBILITY OF SUCH LOSS OR DAMAGES.\n'
+__long_description__ = 'wxmtxy is an EPICS GUI tool to assist users in routine operation of positioning devices'
+__main_script__ = 'wxmtxy.py'
+__summary__ = 'wxmtxy: a GUI tool for EPICS'
+__svndesc__ = 'wxmtxy SVN repo page'
+__target_name__ = 'wxmtxy'
+__url__ = 'https://subversion.xor.aps.anl.gov/trac/bcdaext/wiki/wxmtxy'
+__urlsvn__ = 'https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy'
+__version__ = '0.5'
+fp = <closed file 'LICENSE', mode 'r' at 0xf69103c8>

+ + + + + +
 
+Author
       Pete R. Jemian
+ \ No newline at end of file diff --git a/pydoc/wxmtxy_xml.html b/pydoc/wxmtxy_xml.html new file mode 100644 index 0000000..80d85a8 --- /dev/null +++ b/pydoc/wxmtxy_xml.html @@ -0,0 +1,250 @@ + + +Python: module wxmtxy_xml + + + + +
 
+ 
wxmtxy_xml
index
/home/oxygen18/JEMIAN/Documents/eclipse/usaxs/wxmtxy/trunk/wxmtxy_xml.py
+

@note: support the XML settings file for the wxmtxy application

+This Python file provides routines to read and write XML settings
+files for the wxmtxy application.  An example of the XML file is 
+shown below.  The routines manage the settings internally with a 
+Python dictionary.  Interface routines are used to read and write 
+the various components of the file.  *HOWEVER*, the EPICS configuration 
+is communicated in a Python dictionary.  An example of the Python 
+dictionary with the EPICS configuration is shown below.

+@version: 
+########### SVN repository information ###################
+# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $
+# $Author: jemian $
+# $Revision: 184 $
+# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_xml.py $
+# $Id: wxmtxy_xml.py 184 2010-06-03 21:04:15Z jemian $
+########### SVN repository information ###################

+@note: for help with xml.dom, see http://docs.python.org/library/xml.dom.html

+@note: Here is an example XML file:
+<?xml version="1.0" ?>
+<wxmtxy date="2009-04-09" time="10:27:00" version="1.0">
+  <XYpair name="example" selected="True">
+    <EPICS_configuration>
+      <axis name="x">
+        <flag isMotorRec="False" />
+        <field name="VAL" pv="32idbLAX:float1" />
+        <field name="RBV" pv="32idbLAX:float2" />
+        <field name="DESC" pv="32idbLAX:string1" />
+        <field name="EGU" pv="32idbLAX:string2" />
+        <field name="DMOV" pv="32idbLAX:bit1" />
+        <field name="STOP" pv="32idbLAX:bit2" />
+      </axis>
+      <axis name="y">
+        <flag isMotorRec="True" />
+        <field name="VAL" pv="32idbLAX:m58:c1:m1" /><!-- USAXS a1y -->
+      </axis>
+    </EPICS_configuration>
+    <tab name="page 1">
+      <row name="page 1, row 0" x="1.0" y="-1.0" selected="True"/>
+      <row name="page 1, row 1" x="1.1" y="-1.1"/>
+      <row/>
+    </tab>
+    <tab name="page 2" selected="True">
+      <row name="page 2, row 0" x="2.0" y="-2.0"/>
+      <row name="page 2, row 1" x="2.1" y="-2.1"/>
+      <row name="page 2, row 2" x="2.2" y="-2.2" selected="True"/>
+      <row name="page 2, row 3" x="2.3" y="-2.3"/>
+      <row name="page 2, row 4" x="2.4" y="-2.4"/>
+      <row name="page 2, row 5" x="2.5" y="-2.5"/>
+      <row name="page 2, row 6" x="2.6" y="-2.6"/>
+    </tab>
+    <tab name="empty page"/>
+    <tab name="page 3">
+  </XYpair>
+</wxmtxy>

+@note: Here is an example Python dictionary of the EPICS configuration above:
+    example_dictionary = {
+        'x': {
+            'isMotorRec': False,
+            'VAL': '32idbLAX:float1',
+            'RBV': '32idbLAX:float2',
+            'DESC': '32idbLAX:string1',
+            'EGU': '32idbLAX:string2',
+            'DMOV': '32idbLAX:bit1',
+            'STOP': '32idbLAX:bit2'
+        },
+        'y': {
+            'isMotorRec': True,
+            'VAL': '32idbLAX:m58:c1:m1.VAL'
+        }
+    }

+

+ + + + + +
 
+Modules
       
copy
+
datetime
+
xml.dom.minidom
+
wxmtxy_axis
+

+ + + + + +
 
+Classes
       
+
Settings +
+

+ + + + + + + +
 
+class Settings
   handle the XML settings file
 
 Methods defined here:
+
Clear(self)
reset the internal data representation (db) to empty
+ +
CountPairs(self)
@return: number of pairs
+ +
CountRows(self, pairnum, tabnum)
return the number of rows
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+ +
CountTabs(self, pairnum)
return the number of tabs
+@param pairnum: [int] index number of the XY_pair
+ +
GetDb(self)
@return: database
+ +
GetEpicsConfig(self, pairnum)
Get a deep copy Python dictionary of the current EPICS PV config.
+@param pairnum: [int] index number of the XY_pair
+@return: the current EPICS configuration
+ +
GetPairTitle(self, pairnum)
return the name of the XY_pair
+@param pairnum: [int] index number of the XY_pair
+ +
GetRowTitle(self, pairnum, tabnum, rownum)
return the name of the row
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+@param rownum: [int] index number of the Row object
+ +
GetRowXY(self, pairnum, tabnum, rownum)
return the name of the row
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+@param rownum: [int] index number of the Row object
+ +
GetSelectedPair(self)
@return: index number of the "selected" pair (-1 if none selected)
+ +
GetSelectedRow(self, pairnum, tabnum)
return the index number of the selected row
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+ +
GetSelectedTab(self, pairnum)
return the index number of the selected tab
+@param pairnum: [int] index number of the XY_pair
+ +
GetSettingsFile(self)
@return: name of XML settings file
+ +
GetTabTitle(self, pairnum, tabnum)
return the name of the tab
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+ +
NewEpicsConfig(self, pairnum)
Create internal space for a new EPICS configuration
+@param pairnum: [int] index number of the XY_pair
+ +
NewPair(self, title='')
create space in the database (db) for a new pair
+and sets defaults for fields

+@param title: [string] the title of the XY_pair set (default="")
+@return: the index number
+ +
NewRow(self, pairnum, tabnum, title='')
create space in the database (db) pair for a new tab
+and sets defaults for fields

+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+@param title: the title of the Tab object (default="")
+@return the index number
+ +
NewTab(self, pairnum, title='')
create space in the database (db) pair for a new tab
+and sets defaults for fields

+@param pairnum: [int] index number of the XY_pair
+@param title: the title of the pair set (default="")
+@return the index number
+ +
ReadXmlFile(self)
read the settings from a file into an internal dictionary (self.db)

+@note: this method uses xml.dom.minidom (built into all Pythons)
+@see: http://docs.python.org/library/xml.dom.minidom.html
+ +
SaveXmlFile(self)
save the internal dictionary (self.db) to an XML file
+@note: What about using/saving a default stylesheet?
+@see: http://www.boddie.org.uk/python/XML_intro.html
+ +
SelectPair(self, pairnum)
set the "selected" attribute of the pair
+@param pairnum: [int] index number of the XY_pair
+ +
SelectRow(self, pairnum, tabnum, rownum)
set the selected attribute of the pair
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+@param rownum: [int] index number of the Row object
+ +
SelectTab(self, pairnum, tabnum)
set the selected attribute of the pair
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+ +
SetEpicsConfig(self, pairnum, config)
set the current EPICS configuration
+@param pairnum: [int] index number of the XY_pair
+@param config: Python dictionary of EPICS PV configuration
+ +
SetEpicsField(self, pairnum, axis, field, value)
Define the EPICS config for a specific field
+@param pairnum: [int] index number of the XY_pair'
+@param axis: [string] "x" or "y"'
+@param field: [string] member of wxmtxy_axis.field_list'
+@param value: [string] value of this field
+ +
SetPairTitle(self, pairnum, title)
set the name of the XY_pair
+@param pairnum: [int] index number of the XY_pair'
+@param title: [string] name of the XY_pair
+ +
SetRowTitle(self, pairnum, tabnum, rownum, title)
set the name attribute of the row
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+@param rownum: [int] index number of the Row object
+@param title: [string] title the Tab object
+ +
SetRowXY(self, pairnum, tabnum, rownum, x, y)
set the name attribute of the row
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+@param x: [float] X axis position
+@param y: [float] Y axis position
+ +
SetSettingsFile(self, thefile)
set the name of XML settings file
+@param thefile: [string] name of XML file with settings
+ +
SetTabTitle(self, pairnum, tabnum, title)
set the name attribute of the tab
+@param pairnum: [int] index number of the XY_pair
+@param tabnum: [int] index number of the Tab object
+@param title: [string] title the Tab object
+ +
__init__(self, settingsFile=None)
prepare the settings file
+@param settingsFile: [string] name of XML file with settings
+ +
__repr__(self)
default representation of this structure is XML
+@return: XML representation of internal database (db)
+@note: What about a default stylesheet?
+ +

+ \ No newline at end of file diff --git a/wxmtxy b/wxmtxy new file mode 100755 index 0000000..42414c3 --- /dev/null +++ b/wxmtxy @@ -0,0 +1,13 @@ +#!/bin/bash + +/APSshare/bin/python /APSshare/pythonlib/wxmtxy/wxmtxy.py $* + + +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy $ +# $Id: wxmtxy 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### + diff --git a/wxmtxy.py b/wxmtxy.py new file mode 100755 index 0000000..5e06b62 --- /dev/null +++ b/wxmtxy.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python +#Boa:App:BoaApp + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +''' +start the wxmtxy GUI + +@version: +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy.py $ +# $Id: wxmtxy.py 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### + +README + + *wxmtxy* (an EPICS GUI tool) provides support for an X,Y positioner + (motor) pair by allowing users to define a table of known positions + and providing a one-button click to drive a chosen X,Y pair to a specific + table setting. Also can record current position into a setting. + + Several sets of X,Y positioners can be configured. (Each set is + separate.) In fact, the positioners do not have to be motors, + but can be any type of EPICS PV that will accept a numeric value. + + + wxmtxy is based on wxPython and relies on CaChannel to communicate + with EPICS. + + In the Graphical User Interface (GUI), tooltips are provided for + most items. Moving and pausing the mouse over a widget (GUI + component such as a button or a label) will cause a terse description + of that widget to be displayed. Moving the mouse away will cause that + tooltip to disappear. + + For more help, explanations are provided in the HTML pages. + + TRAC wiki + @see: https://subversion.xor.aps.anl.gov/trac/bcdaext/wiki/wxmtxy + + @note: subversion checkout: svn co https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/ + +---- + @note: wxPython does not provide standard tear-off windows + @see: http://wiki.python.org/moin/Distutils/Tutorial + @see: http://www.py2exe.org/index.cgi/Tutorial + @note: for an undo example, see: http://wiki.wxpython.org/AnotherTutorial +''' + + +import wx +import wxmtxy_root +import pvConnect +import sys + + +modules ={u'wxmtxy_htmlview': [0, + 'HtmlView to view HTML-formatted help files', + u'wxmtxy_htmlview.py'], + u'wxmtxy_pair': [0, + 'configuration for X,Y pair of EPICS positioners', + u'wxmtxy_pair.py'], + u'wxmtxy_pvsetup': [0, 'configure EPICS for X,Y pair', u'wxmtxy_pvsetup.py'], + u'wxmtxy_root': [1, 'Main frame of Application', u'wxmtxy_root.py'], + u'wxmtxy_row': [0, 'one row of settings', u'wxmtxy_row.py'], + u'wxmtxy_tab': [0, 'set of rows with positioner settings', u'wxmtxy_tab.py']} + + +class BoaApp(wx.App): + '''Built using Boa-constructor (as a subclass of wx.App)''' + + def OnInit(self): + '''demonstrate the use of this tool''' + self.main = wxmtxy_root.create(None) + self.main.Show() + self.SetTopWindow(self.main) + return True + + +def on_exit(timer, epics_db): + '''Exit handler to stop the ca.poll() + @param timer: CaPollWx object + @param epics_db: Python list of pvConnect.EpicsPv objects to be released''' + #print __name__, "exit handler" + #for item in epics_db: + # item.release() + if pvConnect.IMPORTED_CACHANNEL: + pvConnect.on_exit(timer) + + +def main(): + '''operate the tool''' + application = wx.App() + settingsFile = None + if len(sys.argv) == 2: + settingsFile = sys.argv[1] + wxmtxy_root.root(None, settingsFile).Show() + capoll_timer = None + if pvConnect.IMPORTED_CACHANNEL: + capoll_timer = pvConnect.CaPollWx(0.1) + capoll_timer.start() + application.MainLoop() + on_exit(capoll_timer, None) + + +if __name__ == '__main__': + main() diff --git a/wxmtxy_axis.py b/wxmtxy_axis.py new file mode 100755 index 0000000..71fb155 --- /dev/null +++ b/wxmtxy_axis.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python +from compiler.ast import TryExcept + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +'''EPICS PVs and connections for one axis + +@version: +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_axis.py $ +# $Id: wxmtxy_axis.py 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### +''' + + +import pvConnect +import pprint +import copy +import time + + +field_list = ['VAL', 'RBV', 'EGU', 'DESC', 'DMOV', 'STOP'] + + +class Axis: + '''EPICS PVs and connections for one axis''' + + def __init__(self): + '''declare initial storage''' + self.db = {} + self.config = None + self.isMotorRec = False + for field in field_list: + self.db[field] = _data() + + def Connect(self): + '''Try to initiate EPICS connection with named PVs + @return: [Boolean] if all axes connected''' + failures = 0 + for field in field_list: + # TODO: Can these connections be done together? + ch = self.db[field].GetConnection() + if ch != None: + try: + ch.connectw() + ch.monitor() + except: + failures += 1 + print "Could not connect with PV: " + self.db[field].pv + return failures > 0 + + def Disconnect(self): + '''Terminate EPICS connection with named PVs''' + for field in field_list: + ch = self.db[field].GetConnection() + if ch != None: + ch.release() + + def Stop(self): + '''Send a STOP to EPICS''' + field = 'STOP' + ch = self.db[field].GetConnection() + ch.chan.putw(1) + + def Move(self, position): + '''Send new position to VAL field of EPICS''' + field = 'VAL' + ch = self.db[field].GetConnection() + #print __name__, 'Move:', position + ch.chan.putw(position) + + def GetConfigure(self): + '''Get the EPICS PVs for this X,Y pair + @return: Python dictionary of EPICS PV configuration''' + return copy.deepcopy(self.config) + + def SetConfigure(self, config): + '''Define the EPICS PVs for this X,Y pair + @param config: Python dictionary of EPICS PV configuration''' + # pprint.pprint(config) + self.config = copy.deepcopy(config) + if not self.config.has_key('isMotorRec'): + return + self.isMotorRec = self.config['isMotorRec'] + base = self.config['VAL'].split('.')[0] + for field in self.config: + if field in field_list: + self.db[field].SetPv(self.config[field]) + if self.isMotorRec: + # fill in default fields of motor records + for field in field_list: + pv = self.db[field].GetPv() + if pv == None or len(pv) == 0: + self.db[field].SetPv(base + '.' + field) + # What about checking to see how many fields have connected? + # And then dumping if not all fields connect? + + +class _data: + '''the internal data associated with a single PV''' + + def __init__(self): + '''only create the space''' + self.pv = None + self.connection = None + self.widget = None + + def GetPv(self): + '''@return: [string] EPICS PV name''' + return self.pv + + def SetPv(self, pv): + '''set the PV name + @param pv: [string] EPICS PV name''' + self.pv = pv + self.connection = pvConnect.EpicsPv(pv) + + def GetConnection(self): + '''@return: pvConnect.EpicsPv object''' + return self.connection + + def GetWidget(self): + '''@return: widget object''' + return self.widget + + def SetWidget(self, widget): + '''set widget object to be used in a callback + @param widget: used as self.widget(value)''' + self.widget = widget + + def _callback(self, value): + '''receive EPICS CA monitor value + @param value: from epics_get['pv_value']''' + # print __name__, self.pv, value, self.connection.epics_args, self.connection.user_args + if self.widget != None: + self.widget(value) + + +# example code follows + + +def _main_callback(epics_args, user_args): + '''EPICS monitor event received for test code''' + value = epics_args['pv_value'] + pv = user_args[0] + # pprint.pprint(epics_args) + print '_main_callback:', pv, value + + +if __name__ == '__main__': + config = { + 'x': { + # USAXS a1y: 32idbLAX:m58:c1:m1 + 'isMotorRec': True, + 'VAL': '32idbLAX:m58:c1:m1.VAL' + }, + 'y': { + # USAXS a2y: 32idbLAX:m58:c1:m2 + 'isMotorRec': False, + 'VAL': '32idbLAX:m58:c1:m2.VAL', + 'RBV': '32idbLAX:m58:c1:m2.RBV', + 'EGU': '32idbLAX:m58:c1:m2.EGU', + 'DESC': '32idbLAX:m58:c1:m2.DESC', + 'DMOV': '32idbLAX:m58:c1:m2.DMOV', + 'STOP': '32idbLAX:m58:c1:m2.STOP' + }, + 'sr': { + # USAXS a1y: 32idbLAX:m58:c1:m1 + 'isMotorRec': False, + 'VAL': 'S:SRcurrentAI' + } + } + axes = {} + for axis in config: + item = Axis() + axes[axis] = item + item.SetConfigure(config[axis]) + ch = item.db['VAL'].GetConnection() + ch.SetUserArgs(axis) + ch.SetUserCallback(_main_callback) + cfg = item.GetConfigure() + cfg['AXIS'] = axis + # pprint.pprint(cfg) + item.Connect() + print 'axis', axis + interval = 5 + for seconds in range(interval): + time.sleep(1) + ch.chan.pend_event() + print interval - seconds - 1, ch.GetPv(), '=', ch.GetValue() + # pprint.pprint(ch.epics_args) + # pprint.pprint(cfg) + for axis in config: + axes[axis].Disconnect() + pvConnect.on_exit() diff --git a/wxmtxy_htmlview.py b/wxmtxy_htmlview.py new file mode 100755 index 0000000..c0478dc --- /dev/null +++ b/wxmtxy_htmlview.py @@ -0,0 +1,198 @@ +#!/usr/bin/env python +#Boa:Frame:HtmlView + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +''' +HtmlView to view HTML-formatted help files + +@version: +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_htmlview.py $ +# $Id: wxmtxy_htmlview.py 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### +''' + + +import wx +import wx.html +import wx.lib.stattext +import wx.lib.buttons +import os +import inspect + + +def create(parent): + return HtmlView(parent) + + +[wxID_HTMLVIEW, wxID_HTMLVIEWBACK, wxID_HTMLVIEWFORWARD, + wxID_HTMLVIEWGENSTATICTEXT1, wxID_HTMLVIEWHOME, wxID_HTMLVIEWHTML, + wxID_HTMLVIEWLBLPAGENAME, wxID_HTMLVIEWREFRESH, +] = [wx.NewId() for _init_ctrls in range(8)] + + +class HtmlView(wx.Frame): + '''HtmlView to view HTML-formatted help files''' + + def _init_coll_boxSizer1_Items(self, parent): + # generated method, don't edit + + parent.AddSizer(self.boxSizer2, 0, border=0, flag=wx.GROW) + parent.AddWindow(self.html, 1, border=0, flag=wx.GROW) + + def _init_coll_boxSizer2_Items(self, parent): + # generated method, don't edit + + parent.AddWindow(self.back, 0, border=0, flag=0) + parent.AddWindow(self.home, 0, border=0, flag=0) + parent.AddWindow(self.refresh, 0, border=0, flag=0) + parent.AddWindow(self.forward, 0, border=0, flag=0) + parent.AddWindow(self.genStaticText1, 1, border=0, + flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL) + + def _init_sizers(self): + # generated method, don't edit + self.boxSizer1 = wx.BoxSizer(orient=wx.VERTICAL) + + self.boxSizer2 = wx.BoxSizer(orient=wx.HORIZONTAL) + + self._init_coll_boxSizer1_Items(self.boxSizer1) + self._init_coll_boxSizer2_Items(self.boxSizer2) + + self.lblPageName.SetSizer(self.boxSizer1) + + def _init_ctrls(self, prnt): + # generated method, don't edit + wx.Frame.__init__(self, id=wxID_HTMLVIEW, name='HtmlView', parent=prnt, + pos=wx.Point(820, 328), size=wx.Size(800, 600), + style=wx.DEFAULT_FRAME_STYLE, title='HtmlView: home') + self.SetClientSize(wx.Size(792, 566)) + self.Center(wx.BOTH) + + self.lblPageName = wx.Panel(id=wxID_HTMLVIEWLBLPAGENAME, + name='lblPageName', parent=self, pos=wx.Point(0, 0), + size=wx.Size(792, 566), style=wx.TAB_TRAVERSAL) + self.lblPageName.SetToolTipString('name of current page') + self.lblPageName.SetLabel('pagename') + + self.genStaticText1 = wx.lib.stattext.GenStaticText(ID=wxID_HTMLVIEWGENSTATICTEXT1, + label=' HtmlView is a limited-capability WWW browser to view HTML-formatted help', + name='genStaticText1', parent=self.lblPageName, pos=wx.Point(124, + 8), size=wx.Size(370, 13), style=0) + self.genStaticText1.SetToolTipString('name of current page') + + self.back = wx.BitmapButton( + id=wxID_HTMLVIEWBACK, name='back', + parent=self.lblPageName, pos=wx.Point(0, 0), size=wx.Size(31, 30), + style=0) + self.back.SetToolTipString('back to previous page') + self.back.Bind(wx.EVT_BUTTON, self.OnBackButton, id=wxID_HTMLVIEWBACK) + + self.home = wx.BitmapButton( + id=wxID_HTMLVIEWHOME, name='home', + parent=self.lblPageName, pos=wx.Point(31, 0), size=wx.Size(31, + 30), style=0) + self.home.SetToolTipString('home to starting page') + self.home.Bind(wx.EVT_BUTTON, self.OnHomeButton, id=wxID_HTMLVIEWHOME) + + self.refresh = wx.BitmapButton( + id=wxID_HTMLVIEWREFRESH, name='refresh', + parent=self.lblPageName, pos=wx.Point(62, 0), size=wx.Size(31, + 30), style=0) + self.refresh.SetToolTipString('refresh current page') + self.refresh.Bind(wx.EVT_BUTTON, self.OnRefreshButton, + id=wxID_HTMLVIEWREFRESH) + + self.forward = wx.BitmapButton( + id=wxID_HTMLVIEWFORWARD, name='forward', + parent=self.lblPageName, pos=wx.Point(93, 0), size=wx.Size(31, + 30), style=0) + self.forward.SetToolTipString('forward to next page') + self.forward.Bind(wx.EVT_BUTTON, self.OnForwardButton, + id=wxID_HTMLVIEWFORWARD) + + self.html = wx.html.HtmlWindow(id=wxID_HTMLVIEWHTML, name='html', + parent=self.lblPageName, pos=wx.Point(0, 30), size=wx.Size(792, + 536), style=wx.html.HW_SCROLLBAR_AUTO) + self.html.SetToolTipString('HTML Help') + + self._init_sizers() + + def __init__(self, parent=None, homepage='index.html', id=-1, title=''): + '''set up the mini WWW browser to view HTML-formatted help files + @param parent: widget that owns this window + @param homepage: local file name of HTML Help (exception if blank) + @param id: widget identifier + @param title: text for window bar''' + self._init_ctrls(parent) + self.homepage = homepage + # + # locate the graphics files for the bitmap buttons + self.bmp = {} + root_dir = os.path.split(inspect.getsourcefile(HtmlView))[0] + for item in ['back', 'home', 'refresh', 'forward']: + file = os.path.join(root_dir, 'graphics', item + '.bmp') + self.bmp[item] = wx.Bitmap(file, wx.BITMAP_TYPE_BMP) + self.back.SetBitmapLabel(self.bmp['back']) + self.home.SetBitmapLabel(self.bmp['home']) + self.refresh.SetBitmapLabel(self.bmp['refresh']) + self.forward.SetBitmapLabel(self.bmp['forward']) + # + self.refresh.SetToolTipString('not implemented yet') + # + if "gtk2" in wx.PlatformInfo: + self.html.SetStandardFonts() + self.html.LoadFile(str(self.homepage)) + + def OnBackButton(self, event): + '''user pressed the Back button + @param event: wxPython event object''' + if self.html.HistoryCanBack(): + self.html.HistoryBack() + + def OnHomeButton(self, event): + '''user pressed the Home button + @param event: wxPython event object''' + self.html.LoadFile(self.homepage) + + def OnForwardButton(self, event): + '''user pressed the Forward button + @param event: wxPython event object''' + if self.html.HistoryCanForward(): + self.html.HistoryForward() + + def OnOpeningURL(self, type, url): + '''page was opened + @param type: "WxPython in Action": page 491 + @param url: [str] Uniform Resource Locator + + @note: this code is not called yet''' + print __name__, 'url:', url + + def OnRefreshButton(self, event): + '''page was opened + @param type: "WxPython in Action": page 491 + @param url: [str] Uniform Resource Locator + + @note: this code is not implemented yet''' + + +if __name__ == '__main__': + app = wx.PySimpleApp() + root_dir = os.path.split(inspect.getsourcefile(HtmlView))[0] + page = 'index.html' + fullname = os.path.join(root_dir, page) + HtmlView(homepage=fullname, parent=None, id=-1, + title='HtmlView: '+fullname).Show() + app.MainLoop() diff --git a/wxmtxy_motor_config.xml b/wxmtxy_motor_config.xml new file mode 100644 index 0000000..f0cc461 --- /dev/null +++ b/wxmtxy_motor_config.xml @@ -0,0 +1,513 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wxmtxy_pair.py b/wxmtxy_pair.py new file mode 100755 index 0000000..5d850df --- /dev/null +++ b/wxmtxy_pair.py @@ -0,0 +1,448 @@ +#!/usr/bin/env python +#Boa:FramePanel:XYpair + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +''' +Define the GUI elements and interface for one X,Y pair + +@version: +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_pair.py $ +# $Id: wxmtxy_pair.py 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### +''' + +import wx +import wx.lib.stattext +import wxmtxy_tab +import wxmtxy_row +import wxmtxy_axis +import wx.lib.scrolledpanel +#import pvConnect +import copy +import pprint + + +[wxID_XYPAIR, wxID_XYPAIRLBLMOTOR, wxID_XYPAIRLBLREADBACK, + wxID_XYPAIRLBLTARGET, wxID_XYPAIRLBL_X_TITLE, wxID_XYPAIRLBL_Y_TITLE, + wxID_XYPAIRSTOP, wxID_XYPAIRTABLE, wxID_XYPAIRTITLE, wxID_XYPAIRX_RBV, + wxID_XYPAIRX_VAL, wxID_XYPAIRY_RBV, wxID_XYPAIRY_VAL, +] = [wx.NewId() for _init_ctrls in range(13)] + + +class XYpair(wx.Panel): + '''Table of settings for a specified X,Y pair of EPICS motors''' + + # see: http://wiki.wxpython.org/BoaFAQ + _custom_classes = { + 'wx.lib.scrolledpanel.ScrolledPanel': ['Tab'], + 'wx.Dialog': ['PvDialog'] + } + + COLOR_MOVING = wx.Colour(179, 250, 142) # pale green + COLOR_NOT_MOVING = wx.Colour(200, 191, 140) # default below + COLOR_NOT_MOVING = wx.Colour(237, 233, 227) # Boa shows this one, which? + + def _init_coll_fgsEpics_Items(self, parent): + # generated method, don't edit + + parent.AddWindow(self.lblMotor, 0, border=2, + flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.GROW) + parent.AddWindow(self.lbl_x_title, 1, border=2, + flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.GROW) + parent.AddWindow(self.lbl_y_title, 1, border=2, + flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.GROW) + parent.AddWindow(self.lblReadback, 0, border=2, + flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.GROW) + parent.AddWindow(self.x_rbv, 1, border=2, flag=wx.ALL | wx.GROW) + parent.AddWindow(self.y_rbv, 1, border=2, flag=wx.ALL | wx.GROW) + parent.AddWindow(self.lblTarget, 0, border=2, + flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.GROW) + parent.AddWindow(self.x_val, 1, border=2, flag=wx.ALL | wx.GROW) + parent.AddWindow(self.y_val, 1, border=2, flag=wx.ALL | wx.GROW) + + def _init_coll_sizer_Items(self, parent): + # generated method, don't edit + + parent.AddWindow(self.title, 0, border=0, flag=wx.GROW) + parent.AddSizer(self.fgsEpics, 0, border=4, flag=wx.ALL | wx.GROW) + parent.AddWindow(self.stop, 0, border=0, flag=wx.ALIGN_CENTER) + parent.AddWindow(self.table, 1, border=0, flag=wx.GROW) + + def _init_coll_fgsEpics_Growables(self, parent): + # generated method, don't edit + + parent.AddGrowableCol(1) + parent.AddGrowableCol(2) + + def _init_sizers(self): + # generated method, don't edit + self.sizer = wx.BoxSizer(orient=wx.VERTICAL) + + self.fgsEpics = wx.FlexGridSizer(cols=3, hgap=4, rows=3, vgap=4) + + self._init_coll_sizer_Items(self.sizer) + self._init_coll_fgsEpics_Items(self.fgsEpics) + self._init_coll_fgsEpics_Growables(self.fgsEpics) + + self.SetSizer(self.sizer) + + def _init_ctrls(self, prnt): + # generated method, don't edit + wx.Panel.__init__(self, id=wxID_XYPAIR, name='XYpair', parent=prnt, + pos=wx.Point(532, 345), size=wx.Size(408, 274), + style=wx.TRANSPARENT_WINDOW | wx.TAB_TRAVERSAL) + self.SetClientSize(wx.Size(400, 240)) + self.SetMinSize(wx.Size(240, 240)) + + self.title = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRTITLE, + label='Window Title', name='title', parent=self, pos=wx.Point(0, + 0), size=wx.Size(400, 23), style=wx.ALIGN_CENTRE) + self.title.SetFont(wx.Font(15, wx.SWISS, wx.NORMAL, wx.NORMAL, False, + u'Arial')) + self.title.Center(wx.BOTH) + self.title.SetToolTipString('description of this X,Y set') + + self.lblMotor = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRLBLMOTOR, + label='motor', name='lblMotor', parent=self, pos=wx.Point(6, 29), + size=wx.Size(80, 20), style=wx.ALIGN_CENTRE) + self.lblMotor.SetToolTipString(u'values obtained from EPICS') + self.lblMotor.Center(wx.BOTH) + self.lblMotor.SetBackgroundColour(wx.Colour(200, 191, 140)) + self.lblMotor.SetMinSize(wx.Size(80, 20)) + + self.lbl_x_title = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRLBL_X_TITLE, + label='title_x', name='lbl_x_title', parent=self, pos=wx.Point(94, + 29), size=wx.Size(146, 20), style=wx.ALIGN_CENTRE) + self.lbl_x_title.SetToolTipString('name and units of X axis') + self.lbl_x_title.Center(wx.BOTH) + self.lbl_x_title.SetBackgroundColour(wx.Colour(200, 191, 140)) + self.lbl_x_title.SetMinSize(wx.Size(80, 20)) + + self.lbl_y_title = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRLBL_Y_TITLE, + label='title_y', name='lbl_y_title', parent=self, + pos=wx.Point(248, 29), size=wx.Size(146, 20), + style=wx.ALIGN_CENTRE) + self.lbl_y_title.SetToolTipString(u'name and units of Y axis') + self.lbl_y_title.Center(wx.BOTH) + self.lbl_y_title.SetBackgroundColour(wx.Colour(200, 191, 140)) + self.lbl_y_title.SetMinSize(wx.Size(80, 20)) + + self.lblReadback = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRLBLREADBACK, + label='readback', name='lblReadback', parent=self, pos=wx.Point(6, + 57), size=wx.Size(80, 20), style=wx.ALIGN_CENTRE) + self.lblReadback.SetToolTipString(u'indicates current position') + self.lblReadback.Center(wx.BOTH) + self.lblReadback.SetBackgroundColour(wx.Colour(200, 191, 140)) + self.lblReadback.SetMinSize(wx.Size(80, 20)) + + self.x_rbv = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRX_RBV, + label='x_rbv', name='x_rbv', parent=self, pos=wx.Point(94, 57), + size=wx.Size(146, 20), style=wx.ALIGN_CENTRE) + self.x_rbv.SetToolTipString(u'X axis readback value') + self.x_rbv.Center(wx.BOTH) + self.x_rbv.SetMinSize(wx.Size(80, 20)) + + self.y_rbv = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRY_RBV, + label='y_rbv', name='y_rbv', parent=self, pos=wx.Point(248, 57), + size=wx.Size(146, 20), style=wx.ALIGN_CENTRE) + self.y_rbv.SetToolTipString(u'Y axis readback value') + self.y_rbv.Center(wx.BOTH) + self.y_rbv.SetMinSize(wx.Size(80, 20)) + + self.lblTarget = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRLBLTARGET, + label='target', name='lblTarget', parent=self, pos=wx.Point(6, + 85), size=wx.Size(80, 20), style=wx.ALIGN_CENTRE) + self.lblTarget.SetToolTipString(u'also known as "commanded value"') + self.lblTarget.Center(wx.BOTH) + self.lblTarget.SetBackgroundColour(wx.Colour(200, 191, 140)) + self.lblTarget.SetMinSize(wx.Size(80, 20)) + + self.x_val = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRX_VAL, + label='x_val', name='x_val', parent=self, pos=wx.Point(94, 85), + size=wx.Size(146, 20), style=wx.ALIGN_CENTRE) + self.x_val.SetToolTipString(u'X axis target value') + self.x_val.Center(wx.BOTH) + self.x_val.SetMinSize(wx.Size(80, 20)) + + self.y_val = wx.lib.stattext.GenStaticText(ID=wxID_XYPAIRY_VAL, + label='y_val', name='y_val', parent=self, pos=wx.Point(248, 85), + size=wx.Size(146, 20), style=wx.ALIGN_CENTRE) + self.y_val.SetToolTipString(u'Y axis target value') + self.y_val.Center(wx.BOTH) + self.y_val.SetMinSize(wx.Size(80, 20)) + + self.stop = wx.Button(id=wxID_XYPAIRSTOP, label='Stop', name='stop', + parent=self, pos=wx.Point(140, 111), size=wx.Size(120, 32), + style=0) + self.stop.SetBackgroundColour(wx.Colour(223, 0, 0)) + self.stop.SetForegroundColour(wx.Colour(255, 255, 255)) + self.stop.SetToolTipString(u'command EPICS to stop these two motors') + self.stop.SetHelpText(u'command EPICS to stop these two motors') + self.stop.SetFont(wx.Font(11, wx.SWISS, wx.NORMAL, wx.BOLD, False, + 'Arial')) + self.stop.Bind(wx.EVT_BUTTON, self.OnStopButton, id=wxID_XYPAIRSTOP) + + self.table = wx.Notebook(id=wxID_XYPAIRTABLE, name='table', parent=self, + pos=wx.Point(0, 143), size=wx.Size(400, 97), style=0) + self.table.SetMinSize(wx.Size(240, 50)) + self.table.SetToolTipString(u'table of various settings for X,Y motors"') + + self._init_sizers() + + def __init_names__(self): + '''cross-reference the widgets to a dictionary''' + self.widget = {"x": {}, "y": {}} + self.widget["x"]["VAL"] = self.x_val + self.widget["y"]["VAL"] = self.y_val + self.widget["x"]["RBV"] = self.x_rbv + self.widget["y"]["RBV"] = self.y_rbv + self.widget["x"]["title"] = self.lbl_x_title + self.widget["y"]["title"] = self.lbl_y_title + + def __init__(self, parent, name, root, rootCallback, newtab=False): + '''initialize an instance of this class + @param parent: object that owns this class + @param name: display test that describes this XYpair + @param root: root object + @param rootCallback: routine in the parent to handle Button events from the Tab + @param newtab: [Boolean] create a default Tab group?''' + self.tab_count = 0 + self.epics = {} + self.titles = {} + for axis in ['x', 'y']: + self.epics[axis] = wxmtxy_axis.Axis() + self.titles[axis] = {} + for field in ['DESC', 'EGU']: + self.titles[axis][field] = "" + self._init_ctrls(parent) + self.__init_names__() # build a cross-reference + self.parent = parent + self.SetName(name) + self.root = root + self.rootCallback = rootCallback + self.SetAxisTitles('X axis, egu', 'Y axis, egu') + if newtab == True: + self.NewTab() + self.Layout() + #self.SetMotorColor("x", True) + #self.SetMotorColor("y", False) + self.SetEpicsConfig({'x': {}, 'y': {}}) + +# ################################ +# ## added methods ### +# ################################ + + def NewTab(self, newrow=True): + '''make a new tab + @param newrow: [Boolean] option to create a first row''' + panel = wxmtxy_tab.Tab(parent=self.table, pair=self, + pairCallback=self.TabHandler, newrow=newrow) + self.tab_count += 1 + self.table.AddPage(imageId=-1, page=panel, select=True, + text='tab ' + repr(self.tab_count)) + return panel + + def DeleteTab(self): + '''Delete the given tab''' + tabnum = self.GetSelection() + if tabnum < 0: + return 'No tab to delete.' + else: + text = self.GetTabText(tabnum) + self.table.DeletePage(tabnum) + return 'Deleted tab named: ' + text + + def TabHandler(self, theTab, theRow, command): + '''Callback function to handle a command from a tab + @param theTab: wxmtxy_tab.Tab object + @param theRow: wxmtxy_row.Row object + @param command: [string] Row button action to pass upward for handling''' + self.rootCallback(self, theTab, theRow, command) + + def GetSelection(self): + '''@return index number of the selected tab object''' + return self.table.GetSelection() + + def GetTabSelection(self): + '''@return selected tab object''' + tabnum = self.GetSelection() + if tabnum < 0: + return None + return self.table.GetPage(tabnum) + + def GetPageTitle(self): + '''@return page title''' + return self.title.GetLabel() + + def SetPageTitle(self, title): + '''define the page title + @param title: [string] new page title''' + self.title.SetLabel(title) + self.Layout() + + def GetTabText(self, tabnum): + '''return the text of the tab numbered tabnum + @param tabnum: [int] index of selected tab''' + return self.table.GetPageText(tabnum) + + def SetTabText(self, tabnum, text): + '''set the text of the tab numbered tabnum + @param tabnum: [int] index of selected tab + @param text: [string] new text''' + self.table.SetPageText(tabnum, text) + + def GetAxisTitleX(self): + '''@return X axis title''' + return self.lbl_x_title.GetLabel() + + def GetAxisTitleY(self): + '''@return Y axis title''' + return self.lbl_y_title.GetLabel() + + def SetMotorColor(self, axis, state): + '''change the background color of the RBV and VAL widgets + + @param axis: [string] either "x" or "y" + @param state: [Boolean], color is green if state == False, neutral if True + ''' + colormap = {False: self.COLOR_MOVING, True: self.COLOR_NOT_MOVING} + rbv = {"x": self.x_rbv, "y": self.y_rbv} + val = {"x": self.x_val, "y": self.y_val} + rbv[axis].SetBackgroundColour(colormap[state]) + val[axis].SetBackgroundColour(colormap[state]) + self.Refresh() + self.Layout() + + def GetRbvXY(self): + '''@return readback values for X and Y as a tuple''' + x = self.x_rbv.GetLabel() + y = self.y_rbv.GetLabel() + return x, y + + def SetAxisTitles(self, x_title, y_title): + '''define the axis titles + @param x_title: [string] X axis title + @param y_title: [string] Y axis title''' + self.lbl_x_title.SetLabel(x_title) + self.lbl_y_title.SetLabel(y_title) + self.Layout() + + def GetEpicsConfig(self): + '''@return deep copy of EPICS PV configuration''' + config = {} + for axis in ['x', 'y']: + config[axis] = copy.deepcopy(self.epics[axis].GetConfigure()) + return config + + def SetEpicsConfig(self, config): + '''define the EPICS PVs from a configuration + @param config: Python dictionary with axes configurations''' + for axis in ['x', 'y']: + self.epics[axis].SetConfigure(copy.deepcopy(config[axis])) + + def CallbackPositions(self, epics_args, user_args): + '''receive a callback on the VAL and RBV fields''' + axis = user_args[0][0] + field = user_args[0][1] + value = epics_args['pv_value'] + if epics_args.has_key('pv_precision'): + # what about display precision? + fmt = '%.' + str(epics_args['pv_precision']) + abs_value = abs(value) + if abs_value >= 1e5 or (abs_value < 1e-5 and abs_value > 0): + fmt += 'E' + else: + fmt += 'f' + str_value = fmt % value + else: + str_value = str(value) + self.widget[axis][field] .SetLabel(str_value) + self.Layout() + + def CallbackTitle(self, epics_args, user_args): + '''receive a callback on the DESC and EGU fields''' + axis = user_args[0][0] + field = user_args[0][1] + value = epics_args['pv_value'] + self.titles[axis][field] = value + title = "%s, %s" % (self.titles[axis]['DESC'], self.titles[axis]['EGU']) + self.widget[axis]['title'] .SetLabel(title) + + def CallbackDMOV(self, epics_args, user_args): + '''receive a callback on the DMOV field''' + axis = user_args[0][0] + value = epics_args['pv_value'] + self.SetMotorColor(axis, value == 1) + + def ConnectEpics(self): + '''try to connect the XY_pair PV names with EPICS''' + #+++++++++++++++++++++++++++++++ + # need to replace this starting from the example in wxmtxy_axis.main() + #+++++++++++++++++++++++++++++++ + for axis in ['x', 'y']: + cfg = self.epics[axis].GetConfigure() + for field in ['VAL', 'RBV']: + item = self.epics[axis].db[field] + item.connection.SetUserCallback(self.CallbackPositions) + item.connection.SetUserArgs((axis, field)) + item.SetWidget(self.widget[axis][field] .SetLabel) + + # advanced handling + desc = self.epics[axis].db['DESC'] + desc.connection.SetUserCallback(self.CallbackTitle) + desc.connection.SetUserArgs((axis, 'DESC')) + + egu = self.epics[axis].db['EGU'] + egu.connection.SetUserCallback(self.CallbackTitle) + egu.connection.SetUserArgs((axis, 'EGU')) + + dmov = self.epics[axis].db['DMOV'] + dmov.connection.SetUserCallback(self.CallbackDMOV) + dmov.connection.SetUserArgs((axis, 'DMOV')) + + # do not need to setup the STOP button + + cfg['AXIS'] = axis + #pprint.pprint(cfg) + self.epics[axis].Connect() + + def ReleaseEpics(self): + '''release connections with the XY_pair EPICS PVs + @note: When will this be called?''' + for axis in ['x', 'y']: + self.epics[axis].Disconnect() + + def StopAxes(self): + '''Send a stop to both axes''' + for axis in ['x', 'y']: + #print __name__, 'Stop axis', axis + self.epics[axis].Stop() + + def MoveAxes(self, x, y): + '''Command both axes to move to new position + @param x: [float] new X position + @param y: [float] new Y position''' + #print __name__, 'MoveAxes:', x, y + self.epics['x'].Move(x) + self.epics['y'].Move(y) + +# ################################ +# ## event handling routines ### +# ################################ + + def OnStopButton(self, event): + '''user requested to stop the X and Y motors + @param event: wxPython event object''' + self.TabHandler(self, None, 'stop') diff --git a/wxmtxy_pvsetup.py b/wxmtxy_pvsetup.py new file mode 100755 index 0000000..5f1ba83 --- /dev/null +++ b/wxmtxy_pvsetup.py @@ -0,0 +1,519 @@ +#!/usr/bin/env python +#Boa:Dialog:PvDialog + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +''' +Provides Python Class: PvDialog + Dialog to configure the EPICS PVs for an X,Y pair + +@version: +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_pvsetup.py $ +# $Id: wxmtxy_pvsetup.py 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### +''' + + +import wx +import pvConnect +import pprint +import wxmtxy_axis +import inspect +import os + + +COLOR_PV_OK = wx.Colour(235, 254, 231) # pale green +COLOR_PV_NOT_OK = wx.Colour(254, 232, 255) # pale pink +COLOR_PV_AUTOFILL = wx.Colour(200, 200, 200) # pale grey + +[wxID_PVDIALOG, wxID_PVDIALOGBUTTON_CANCEL, wxID_PVDIALOGBUTTON_CLEAR_X, + wxID_PVDIALOGBUTTON_CLEAR_Y, wxID_PVDIALOGBUTTON_OK, + wxID_PVDIALOGBUTTON_REVERT, wxID_PVDIALOGCB_IS_MOTOR_X, + wxID_PVDIALOGCB_IS_MOTOR_Y, wxID_PVDIALOGEPICS_LOGO, wxID_PVDIALOGLBL_DESC, + wxID_PVDIALOGLBL_DONE, wxID_PVDIALOGLBL_EGU, wxID_PVDIALOGLBL_RBV, + wxID_PVDIALOGLBL_STOP, wxID_PVDIALOGLBL_VAL, wxID_PVDIALOGPV_X_DESC, + wxID_PVDIALOGPV_X_DMOV, wxID_PVDIALOGPV_X_EGU, wxID_PVDIALOGPV_X_RBV, + wxID_PVDIALOGPV_X_STOP, wxID_PVDIALOGPV_X_VAL, wxID_PVDIALOGPV_Y_DESC, + wxID_PVDIALOGPV_Y_DMOV, wxID_PVDIALOGPV_Y_EGU, wxID_PVDIALOGPV_Y_RBV, + wxID_PVDIALOGPV_Y_STOP, wxID_PVDIALOGPV_Y_VAL, wxID_PVDIALOGTITLE, +] = [wx.NewId() for _init_ctrls in range(28)] + + +class PvDialog(wx.Dialog): + '''Dialog to configure the EPICS PVs for an X,Y pair + + This code also checks to see if the PV names entered are valid. + User is expected to press the [enter] key to submit a PV name + for validation. Background of text entry box will turn green + to signify that the chosen PV name is valid (has been found). + The background will be pink for invalid PV strings. + The background will be grey for PV standard fields in motor records. + ''' + + def _init_ctrls(self, prnt): + # generated method, don't edit + wx.Dialog.__init__(self, id=wxID_PVDIALOG, name='EPICS configuration', parent=prnt, + pos=wx.Point(191, 166), size=wx.Size(638, 434), + style=wx.DIALOG_MODAL | wx.DEFAULT_DIALOG_STYLE, + title='PvDialog') + self.SetClientSize(wx.Size(630, 400)) + self.SetToolTipString('Configure EPICS PVs') + + self.cb_is_motor_x = wx.CheckBox(id=wxID_PVDIALOGCB_IS_MOTOR_X, + label='X axis is motor', name='cb_is_motor_x', parent=self, + pos=wx.Point(72, 80), size=wx.Size(256, 16), style=0) + self.cb_is_motor_x.SetValue(True) + self.cb_is_motor_x.SetToolTipString('Autofill the fields for a motor record for the X axis') + + self.pv_x_desc = wx.TextCtrl(id=wxID_PVDIALOGPV_X_DESC, + name='pv_x_desc', parent=self, pos=wx.Point(72, 108), + size=wx.Size(256, 21), style=wx.TE_PROCESS_ENTER, value='') + self.pv_x_desc.SetToolTipString('PV for X axis description') + self.pv_x_desc.Bind(wx.EVT_TEXT_ENTER, self.OnPv_x_descTextEnter, + id=wxID_PVDIALOGPV_X_DESC) + + self.pv_x_rbv = wx.TextCtrl(id=wxID_PVDIALOGPV_X_RBV, name='pv_x_rbv', + parent=self, pos=wx.Point(72, 148), size=wx.Size(256, 21), + style=wx.TE_PROCESS_ENTER, value='') + self.pv_x_rbv.SetToolTipString('PV for X axis readback value') + self.pv_x_rbv.Bind(wx.EVT_TEXT_ENTER, self.OnPv_x_rbvTextEnter, + id=wxID_PVDIALOGPV_X_RBV) + + self.pv_x_val = wx.TextCtrl(id=wxID_PVDIALOGPV_X_VAL, name='pv_x_val', + parent=self, pos=wx.Point(72, 188), size=wx.Size(256, 21), + style=wx.TE_PROCESS_ENTER, value='') + self.pv_x_val.SetToolTipString('PV for X axis target (commanded) value') + self.pv_x_val.Bind(wx.EVT_TEXT_ENTER, self.OnPv_x_valTextEnter, + id=wxID_PVDIALOGPV_X_VAL) + + self.pv_x_dmov = wx.TextCtrl(id=wxID_PVDIALOGPV_X_DMOV, + name='pv_x_dmov', parent=self, pos=wx.Point(72, 228), + size=wx.Size(256, 21), style=wx.TE_PROCESS_ENTER, value='') + self.pv_x_dmov.SetToolTipString('PV for X axis NOT MOVING bit (1=not moving)') + self.pv_x_dmov.Bind(wx.EVT_TEXT_ENTER, self.OnPv_x_dmovTextEnter, + id=wxID_PVDIALOGPV_X_DMOV) + + self.pv_x_egu = wx.TextCtrl(id=wxID_PVDIALOGPV_X_EGU, name='pv_x_egu', + parent=self, pos=wx.Point(72, 268), size=wx.Size(256, 21), + style=wx.TE_PROCESS_ENTER, value='') + self.pv_x_egu.SetToolTipString('PV for X axis engineering units)') + self.pv_x_egu.Bind(wx.EVT_TEXT_ENTER, self.OnPv_x_eguTextEnter, + id=wxID_PVDIALOGPV_X_EGU) + + self.pv_x_stop = wx.TextCtrl(id=wxID_PVDIALOGPV_X_STOP, + name='pv_x_stop', parent=self, pos=wx.Point(72, 308), + size=wx.Size(256, 21), style=wx.TE_PROCESS_ENTER, value='') + self.pv_x_stop.SetToolTipString('PV to STOP X axis') + self.pv_x_stop.Bind(wx.EVT_TEXT_ENTER, self.OnPv_x_stopTextEnter, + id=wxID_PVDIALOGPV_X_STOP) + + self.cb_is_motor_y = wx.CheckBox(id=wxID_PVDIALOGCB_IS_MOTOR_Y, + label='Y axis is motor', name='cb_is_motor_y', parent=self, + pos=wx.Point(352, 88), size=wx.Size(256, 16), style=0) + self.cb_is_motor_y.SetValue(True) + self.cb_is_motor_y.SetToolTipString('Autofill the fields for a motor record for the Y axis') + + self.pv_y_desc = wx.TextCtrl(id=wxID_PVDIALOGPV_Y_DESC, + name='pv_y_desc', parent=self, pos=wx.Point(352, 108), + size=wx.Size(256, 21), style=wx.TE_PROCESS_ENTER, value='') + self.pv_y_desc.SetToolTipString('PV for Y axis description') + self.pv_y_desc.SetBackgroundColour(wx.Colour(254, 232, 255)) + self.pv_y_desc.Bind(wx.EVT_TEXT_ENTER, self.OnPv_y_descTextEnter, + id=wxID_PVDIALOGPV_Y_DESC) + + self.pv_y_rbv = wx.TextCtrl(id=wxID_PVDIALOGPV_Y_RBV, name='pv_y_rbv', + parent=self, pos=wx.Point(352, 148), size=wx.Size(256, 21), + style=wx.TE_PROCESS_ENTER, value='') + self.pv_y_rbv.SetToolTipString('PV for Y axis readback value') + self.pv_y_rbv.Bind(wx.EVT_TEXT_ENTER, self.OnPv_y_rbvTextEnter, + id=wxID_PVDIALOGPV_Y_RBV) + + self.pv_y_val = wx.TextCtrl(id=wxID_PVDIALOGPV_Y_VAL, name='pv_y_val', + parent=self, pos=wx.Point(352, 188), size=wx.Size(256, 21), + style=wx.TE_PROCESS_ENTER, value='') + self.pv_y_val.SetToolTipString('PV for Y axis target (commanded) value') + self.pv_y_val.Bind(wx.EVT_TEXT_ENTER, self.OnPv_y_valTextEnter, + id=wxID_PVDIALOGPV_Y_VAL) + + self.pv_y_dmov = wx.TextCtrl(id=wxID_PVDIALOGPV_Y_DMOV, + name='pv_y_dmov', parent=self, pos=wx.Point(352, 228), + size=wx.Size(256, 21), style=wx.TE_PROCESS_ENTER, value='') + self.pv_y_dmov.SetToolTipString('PV for Y axis NOT MOVING bit (1=not moving)') + self.pv_y_dmov.Bind(wx.EVT_TEXT_ENTER, self.OnPv_y_dmovTextEnter, + id=wxID_PVDIALOGPV_Y_DMOV) + + self.pv_y_egu = wx.TextCtrl(id=wxID_PVDIALOGPV_Y_EGU, name='pv_y_egu', + parent=self, pos=wx.Point(352, 268), size=wx.Size(256, 21), + style=wx.TE_PROCESS_ENTER, value='') + self.pv_y_egu.SetToolTipString('PV for Y axis engineering units') + self.pv_y_egu.Bind(wx.EVT_TEXT_ENTER, self.OnPv_y_eguTextEnter, + id=wxID_PVDIALOGPV_Y_EGU) + + self.pv_y_stop = wx.TextCtrl(id=wxID_PVDIALOGPV_Y_STOP, + name='pv_y_stop', parent=self, pos=wx.Point(352, 308), + size=wx.Size(256, 21), style=wx.TE_PROCESS_ENTER, value='') + self.pv_y_stop.SetToolTipString('PV to STOP Y axis') + self.pv_y_stop.Bind(wx.EVT_TEXT_ENTER, self.OnPv_y_stopTextEnter, + id=wxID_PVDIALOGPV_Y_STOP) + + self.title = wx.StaticText(id=wxID_PVDIALOGTITLE, + label='Configure EPICS PVs', name='title', parent=self, + pos=wx.Point(136, 16), size=wx.Size(233, 27), + style=wx.ALIGN_CENTRE) + self.title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.NORMAL, False, + 'Arial')) + + self.lbl_done = wx.StaticText(id=wxID_PVDIALOGLBL_DONE, label='DMOV', + name='lbl_done', parent=self, pos=wx.Point(24, 232), + size=wx.Size(40, 13), style=0) + + self.lbl_val = wx.StaticText(id=wxID_PVDIALOGLBL_VAL, label='VAL', + name='lbl_val', parent=self, pos=wx.Point(24, 192), + size=wx.Size(40, 13), style=0) + + self.lbl_rbv = wx.StaticText(id=wxID_PVDIALOGLBL_RBV, label='RBV', + name='lbl_rbv', parent=self, pos=wx.Point(24, 152), + size=wx.Size(40, 13), style=0) + + self.lbl_desc = wx.StaticText(id=wxID_PVDIALOGLBL_DESC, label='DESC', + name='lbl_desc', parent=self, pos=wx.Point(24, 112), + size=wx.Size(40, 13), style=0) + + self.lbl_egu = wx.StaticText(id=wxID_PVDIALOGLBL_EGU, label='EGU', + name='lbl_egu', parent=self, pos=wx.Point(24, 272), + size=wx.Size(40, 13), style=0) + + self.lbl_stop = wx.StaticText(id=wxID_PVDIALOGLBL_STOP, label='STOP', + name='lbl_stop', parent=self, pos=wx.Point(24, 312), + size=wx.Size(40, 13), style=0) + + self.button_ok = wx.Button(id=wx.ID_OK, label='Ok', name='button_ok', + parent=self, pos=wx.Point(40, 352), size=wx.Size(100, 30), + style=0) + self.button_ok.SetToolTipString('accept all changes') + self.button_ok.Bind(wx.EVT_BUTTON, self.OnButton_okButton, + id=wxID_PVDIALOGBUTTON_OK) + + self.button_cancel = wx.Button(id=wx.ID_CANCEL, label='Cancel', + name='button_cancel', parent=self, pos=wx.Point(150, 352), + size=wx.Size(100, 30), style=0) + self.button_cancel.SetToolTipString('cancel all changes') + self.button_cancel.Bind(wx.EVT_BUTTON, self.OnButton_cancelButton, + id=wxID_PVDIALOGBUTTON_CANCEL) + + self.button_clear_x = wx.Button(id=wxID_PVDIALOGBUTTON_CLEAR_X, + label='Clear X', name='button_clear_x', parent=self, + pos=wx.Point(260, 352), size=wx.Size(100, 30), style=0) + self.button_clear_x.SetToolTipString('clear all fields for X axis') + self.button_clear_x.Bind(wx.EVT_BUTTON, self.OnButton_clear_x_Button, + id=wxID_PVDIALOGBUTTON_CLEAR_X) + + self.button_clear_y = wx.Button(id=wxID_PVDIALOGBUTTON_CLEAR_Y, + label='Clear Y', name='button_clear_y', parent=self, + pos=wx.Point(370, 352), size=wx.Size(100, 30), style=0) + self.button_clear_y.SetToolTipString('clear all fields for X axis') + self.button_clear_y.Bind(wx.EVT_BUTTON, self.OnButton_clear_y_Button, + id=wxID_PVDIALOGBUTTON_CLEAR_Y) + + self.button_revert = wx.Button(id=wxID_PVDIALOGBUTTON_REVERT, + label='Revert', name='button_revert', parent=self, + pos=wx.Point(480, 352), size=wx.Size(100, 30), style=0) + self.button_revert.SetToolTipString('Change all fields back to original values as dialog was started') + self.button_revert.Bind(wx.EVT_BUTTON, self.OnButton_revertButton, + id=wxID_PVDIALOGBUTTON_REVERT) + + self.epics_logo = wx.StaticBitmap( + id=wxID_PVDIALOGEPICS_LOGO, + name='epics_logo', parent=self, pos=wx.Point(16, 8), + size=wx.Size(50, 51), style=0) + self.epics_logo.SetToolTipString('EPICS logo') + self.epics_logo.SetLabel('EPICS logo') + self.epics_logo.SetHelpText('EPICS logo') + + def __init_names__(self): + '''conversion table of widget names + + Create a dictionary of names for the widgets by axis. + This should simplify addressing these widgets internally.''' + self.widget = {'x': {}, 'y': {}} + self.widget['x']['isMotorRec'] = self.cb_is_motor_x + self.widget['x']['DESC'] = self.pv_x_desc + self.widget['x']['RBV'] = self.pv_x_rbv + self.widget['x']['VAL'] = self.pv_x_val + self.widget['x']['DMOV'] = self.pv_x_dmov + self.widget['x']['STOP'] = self.pv_x_stop + self.widget['x']['EGU'] = self.pv_x_egu + self.widget['y']['isMotorRec'] = self.cb_is_motor_y + self.widget['y']['DESC'] = self.pv_y_desc + self.widget['y']['RBV'] = self.pv_y_rbv + self.widget['y']['VAL'] = self.pv_y_val + self.widget['y']['DMOV'] = self.pv_y_dmov + self.widget['y']['STOP'] = self.pv_y_stop + self.widget['y']['EGU'] = self.pv_y_egu + + def __init__(self, parent, original_config): + '''establish the dialog box + @param parent: widget that owns this class + @param original_config: Python dictionary with axes configurations''' + # first, find the directory where this code is installed + # so the bitmaps can be found + # Note that this breaks edit ability of BoaConstructor + root_dir = os.path.split(inspect.getsourcefile(PvDialog))[0] + self.bmp = {} + for item in ['epicslogo101']: + file = os.path.join(root_dir, 'graphics', item + '.bmp') + self.bmp[item] = wx.Bitmap(file, wx.BITMAP_TYPE_BMP) + self._init_ctrls(parent) # create the controls + self.epics_logo.SetBitmap(self.bmp['epicslogo101']) + self.__init_names__() # widget conversion table + self.SetConfiguration(original_config) # initial values + self.original_config = self.GetConfiguration() # for "Revert" + +# ################################ +# ## added methods ### +# ################################ + + def _applyConfiguration_(self, xref, config): + '''load/configure the widgets with the configuration of one axis + + @param xref: self.widget[axis] where axis is either "x" or "y" + @param config: dictionary of values for this axis + ''' + field = 'isMotorRec' + isMotorRec = False + if config.has_key(field): + xref[field].SetValue(config[field]) + isMotorRec = config[field] + for field in wxmtxy_axis.field_list: + if config.has_key(field): + #pprint.pprint(config) + #print field, repr(config[field]), str(config[field]) + xref[field].SetValue(config[field]) + state = False + pv = xref[field].GetValue() + if len(pv) > 0: + state = pvConnect.testConnect(pv) + #print pv, state + self._SetPvColor(xref[field], state, isMotorRec) + + def _SetPvColor(self, widget, state, ismotor): + '''Change the background color on the PV string widgets. + Also base color choice on whether the PV is part + of a motor record or not. + @param widget: used as widget.SetBackgroundColour(map[state]) + @param state: [Boolean] Moving = True + @param ismotor: [Boolean] Is it an EPICS "motor" record? + ''' + map = { + True: COLOR_PV_OK, + False: COLOR_PV_NOT_OK + } + if ismotor: # remap if maybe part of motor record + map["False"] = COLOR_PV_AUTOFILL + widget.SetBackgroundColour(map[state]) + + def SetColor(self, axis, field): + '''change the background color on the given widgets + @param axis: [string] "x" or "y" + @param field: [string] member of wxmtxy_axis.field_list''' + pv = self.widget[axis][field].GetValue() + isMotorRec = self.widget[axis]['isMotorRec'].GetValue() + state = False + if len(pv) > 0: + state = pvConnect.testConnect(pv) + self._SetPvColor(self.widget[axis][field], state, isMotorRec) + + def _pv_base_name(self, pv): + '''given an EPICS PV name, return the base name + @param pv: [string] EPICS Process Variable name + @return: base part of PV name + + @note: _pv_base_name("the:pv:name.VAL") = "the:pv:name" + @note: _pv_base_name("another:name") = "another:name" + ''' + return pv.split('.')[0] + + def GetConfiguration(self): + '''@return Python dictionary containing the PV info for X & Y axes''' + config = {'x': {}, 'y': {}} + for axis in ['x', 'y']: + field = 'isMotorRec' + config[axis][field]=self.widget[axis][field].GetValue() + for field in wxmtxy_axis.field_list: + config[axis][field]=self.widget[axis][field].GetValue() + return config + + def SetConfiguration(self, config): + '''Set the configuration of the widgets. + @param config: Python dictionary containing the PV info for X & Y axes''' + for axis in ['x', 'y']: + if config.has_key(axis): + self._applyConfiguration_(self.widget[axis], config[axis]) + + def _SetIsMotorCheckbox_(self, axis): + '''Set/clear the "isMotorRec" checkbox if the VAL PV is/not from a motor record. + @param axis: [string] "x" or "y" + ''' + base = self._pv_base_name(self.widget[axis]['VAL'].GetValue()) + isMotorRec = self._isMotorRec_(base) + self.widget[axis]['isMotorRec'].SetValue(isMotorRec) + + def _isMotorRec_(self, pv): + '''test if the given PV is a motor record + @param pv: [string] EPICS Process Variable name''' + return pvConnect.GetRTYP(pv) == 'motor' + + def _clear_axis(self, axis): + '''clear all the fields on the named axis + @param axis: [string] "x" or "y"''' + config = {'isMotorRec': False} + for field in wxmtxy_axis.field_list: + config[field] = '' + self._applyConfiguration_(self.widget[axis], config) + +# ################################ +# ## event handling routines ### +# ################################ + + def OnPv_x_dmovTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('x', 'DMOV') + + def OnPv_y_dmovTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('y', 'DMOV') + + def OnPv_x_valTextEnter(self, event): + '''set background color and 'isMotorRec' checkbox for X axis + @param event: wxPython event object''' + self.SetColor('x', 'VAL') + self._SetIsMotorCheckbox_('x') + + def OnPv_y_valTextEnter(self, event): + '''set background color and 'isMotorRec' checkbox for Y axis + @param event: wxPython event object''' + self.SetColor('y', 'VAL') + self._SetIsMotorCheckbox_('y') + + def OnPv_x_rbvTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('x', 'RBV') + + def OnPv_y_rbvTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('y', 'RBV') + + def OnPv_x_descTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('x', 'DESC') + + def OnPv_y_descTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('y', 'DESC') + + def OnPv_x_eguTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('x', 'EGU') + + def OnPv_y_eguTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('y', 'EGU') + + def OnPv_x_stopTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('x', 'STOP') + + def OnPv_y_stopTextEnter(self, event): + '''set background color + @param event: wxPython event object''' + self.SetColor('y', 'STOP') + + def OnButton_okButton(self, event): + '''Handler for the cancel button. + The default behavior will handle all that is needed here. + + @param event: wxPython event object + ''' + event.Skip() + + def OnButton_cancelButton(self, event): + '''Handler for the cancel button. + The default behavior will handle all that is needed here. + + There is no chance to restore the original + configuration before the dialog returns. The calling + routine must determine if the result was wx.ID_OK + before calling dlg.GetConfiguration(). + + @param event: wxPython event object + ''' + event.Skip() + + def OnButton_clear_x_Button(self, event): + '''clear all the fields on the X axis + @param event: wxPython event object''' + self._clear_axis('x') + + def OnButton_clear_y_Button(self, event): + '''clear all the fields on the Y axis + @param event: wxPython event object''' + self._clear_axis('y') + + def OnButton_revertButton(self, event): + '''reset all the fields on both axes to original values + @param event: wxPython event object''' + self.SetConfiguration(self.original_config) + + +if __name__ == '__main__': + '''example of how to set up the caller for this dialog''' + config = { + 'x': { + # USAXS a1y: 32idbLAX:m58:c1:m1 + 'isMotorRec': True, + 'VAL': '32idbLAX:m58:c1:m1.VAL' + }, + 'y': { + # USAXS a2y: 32idbLAX:m58:c1:m2 + 'isMotorRec': False, + 'VAL': '32idbLAX:m58:c1:m2.VAL', + 'RBV': '32idbLAX:m58:c1:m2.RBV', + 'EGU': '32idbLAX:m58:c1:m2.EGU', + 'DESC': '32idbLAX:m58:c1:m2.DESC', + 'DMOV': '32idbLAX:m58:c1:m2.DMOV', + 'STOP': '32idbLAX:m58:c1:m2.STOP' + } + } + app = wx.PySimpleApp() + dlg = PvDialog(None, config) + try: + result = dlg.ShowModal() + finally: + print "OK button pressed:", result == wx.ID_OK + if result == wx.ID_OK: + # get the new configuration + config = dlg.GetConfiguration() + pprint.pprint(config) + dlg.Destroy() + app.MainLoop() + pvConnect.on_exit() diff --git a/wxmtxy_root.py b/wxmtxy_root.py new file mode 100755 index 0000000..df659af --- /dev/null +++ b/wxmtxy_root.py @@ -0,0 +1,821 @@ +#!/usr/bin/env python +#Boa:Frame:root + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +'''wxmtxy_root: Define the GUI elements and interface (this is the main code) + +########### SVN repository information ################### +# $Date: 2010-12-06 15:13:14 -0600 (Mon, 06 Dec 2010) $ +# $Author: jemian $ +# $Revision: 216 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_root.py $ +# $Id: wxmtxy_root.py 216 2010-12-06 21:13:14Z jemian $ +########### SVN repository information ################### + +@note: for an undo example, see: http://wiki.wxpython.org/AnotherTutorial +''' + + +import os, datetime, copy, inspect, wx +from wx.lib.wordwrap import wordwrap +import wxmtxy_pair +import wxmtxy_tab +import wxmtxy_row +import wxmtxy_xml +import wxmtxy_pvsetup +import wxmtxy_version +import wxmtxy_htmlview + + +def create(parent): + '''created by Boa-constructor''' + return root(parent) + +################################# +### added methods ### +################################# + + +[wxID_ROOT, wxID_ROOTPAGEBOOK, wxID_ROOTSTATUSBAR1, +] = [wx.NewId() for _init_ctrls in range(3)] + +[wxID_ROOTMENUFILECLOSE, wxID_ROOTMENUFILEEXIT, wxID_ROOTMENUFILEEXPORT, + wxID_ROOTMENUFILEIMPORT, wxID_ROOTMENUFILENEW, wxID_ROOTMENUFILEOPEN, + wxID_ROOTMENUFILEPREFERENCES, wxID_ROOTMENUFILESAVE, wxID_ROOTMENUFILESAVEAS, +] = [wx.NewId() for _init_coll_menuFile_Items in range(9)] + +[wxID_ROOTMENUABOUTABOUT, wxID_ROOTMENUABOUTHELP, +] = [wx.NewId() for _init_coll_menuAbout_Items in range(2)] + +[wxID_ROOTMENUPAGECHOICECHANGEPAIRTITLE, + wxID_ROOTMENUPAGECHOICECHANGETABTITLE, wxID_ROOTMENUPAGECHOICEDELETEPAIR, + wxID_ROOTMENUPAGECHOICEDELETETAB, wxID_ROOTMENUPAGECHOICEEPICSCONFIG, + wxID_ROOTMENUPAGECHOICENEWPAIR, wxID_ROOTMENUPAGECHOICENEWROW, + wxID_ROOTMENUPAGECHOICENEWTAB, +] = [wx.NewId() for _init_coll_menuPage_Items in range(8)] + + +class root(wx.Frame): + '''wxmtxy: Define the GUI elements and interface''' + + # see: http://wiki.wxpython.org/BoaFAQ + _custom_classes = {'wx.Panel': ['XYpair']} + + def _init_coll_menuBar1_Menus(self, parent): + # generated method, don't edit + + parent.Append(menu=self.menuFile, title=u'File') + parent.Append(menu=self.menuEdit, title=u'Edit') + parent.Append(menu=self.menuPage, title=u'Page') + parent.Append(menu=self.menuAbout, title=u'About') + + def _init_coll_menuPage_Items(self, parent): + # generated method, don't edit + + parent.Append(help='Create settings for a new X,Y pair of EPICS motors', + id=wxID_ROOTMENUPAGECHOICENEWPAIR, kind=wx.ITEM_NORMAL, + text='Create New X,Y pair\tCtrl+p') + parent.Append(help=u'Delete settings for a new X,Y pair of EPICS motors', + id=wxID_ROOTMENUPAGECHOICEDELETEPAIR, kind=wx.ITEM_NORMAL, + text='Delete this X,Y pair\tCtrl+Shift+p') + parent.Append(help=u'Change the title for this X,Y pair', + id=wxID_ROOTMENUPAGECHOICECHANGEPAIRTITLE, kind=wx.ITEM_NORMAL, + text='Change X,Y pair title\tCtrl+Shift+m') + parent.AppendSeparator() + parent.Append(help='Create a new tab of settings for this X,Y pair of EPICS motors', + id=wxID_ROOTMENUPAGECHOICENEWTAB, kind=wx.ITEM_NORMAL, + text='Create new tab\tCtrl+t') + parent.Append(help='Delete this tab of settings for this X,Y pair of EPICS motors', + id=wxID_ROOTMENUPAGECHOICEDELETETAB, kind=wx.ITEM_NORMAL, + text='Delete tab\tCtrl+Shift+t') + parent.Append(help='', id=wxID_ROOTMENUPAGECHOICECHANGETABTITLE, + kind=wx.ITEM_NORMAL, text='Change tab title\tCtrl+m') + parent.AppendSeparator() + parent.Append(help='Create a new row for settings for this X,Y pair of EPICS motors', + id=wxID_ROOTMENUPAGECHOICENEWROW, kind=wx.ITEM_NORMAL, + text='Create new row\tCtrl+r') + parent.AppendSeparator() + parent.Append(help='Configure the EPICS PVs for this X,Y pair', + id=wxID_ROOTMENUPAGECHOICEEPICSCONFIG, kind=wx.ITEM_NORMAL, + text=u'EPICS configuration\tCtrl+Shift+e') + self.Bind(wx.EVT_MENU, self.OnMenuPageChoicenewpairMenu, + id=wxID_ROOTMENUPAGECHOICENEWPAIR) + self.Bind(wx.EVT_MENU, self.OnMenuPageChoicedeletepairMenu, + id=wxID_ROOTMENUPAGECHOICEDELETEPAIR) + self.Bind(wx.EVT_MENU, self.OnMenuPageChoicechangetitleMenu, + id=wxID_ROOTMENUPAGECHOICECHANGEPAIRTITLE) + self.Bind(wx.EVT_MENU, self.OnMenuPageChoicenewrowMenu, + id=wxID_ROOTMENUPAGECHOICENEWROW) + self.Bind(wx.EVT_MENU, self.OnMenuPageChoicenewtabMenu, + id=wxID_ROOTMENUPAGECHOICENEWTAB) + self.Bind(wx.EVT_MENU, self.OnMenuPageChoicedeletetabMenu, + id=wxID_ROOTMENUPAGECHOICEDELETETAB) + self.Bind(wx.EVT_MENU, self.OnMenuPageChoicechangetabtitleMenu, + id=wxID_ROOTMENUPAGECHOICECHANGETABTITLE) + self.Bind(wx.EVT_MENU, self.OnMenuPageChoiceepicsconfigMenu, + id=wxID_ROOTMENUPAGECHOICEEPICSCONFIG) + + def _init_coll_menuFile_Items(self, parent): + # generated method, don't edit + + parent.Append(help=u'Create a new set', id=wxID_ROOTMENUFILENEW, + kind=wx.ITEM_NORMAL, text=u'New\tCtrl+n') + parent.Append(help=u'Open a configuration file', + id=wxID_ROOTMENUFILEOPEN, kind=wx.ITEM_NORMAL, + text=u'Open ...\tCtrl+o') + parent.Append(help=u'Close the current file', id=wxID_ROOTMENUFILECLOSE, + kind=wx.ITEM_NORMAL, text=u'Close\tCtrl+w') + parent.AppendSeparator() + parent.Append(help=u'Record the settings to the current file', + id=wxID_ROOTMENUFILESAVE, kind=wx.ITEM_NORMAL, + text=u'Save\tCtrl+s') + parent.Append(help=u'Choose a file to record the settings', + id=wxID_ROOTMENUFILESAVEAS, kind=wx.ITEM_NORMAL, + text=u'Save As ...\tCtrl+Shift+s') + parent.AppendSeparator() + parent.Append(help=u'Import Row data (label, x, y) from a tab-separated file', + id=wxID_ROOTMENUFILEIMPORT, kind=wx.ITEM_NORMAL, + text=u'Import Rows ...\tCtrl+i') + parent.Append(help=u'Export Row data (label, x, y) to a tab-separated file', + id=wxID_ROOTMENUFILEEXPORT, kind=wx.ITEM_NORMAL, + text=u'Export Rows ...\tCtrl+e') + parent.Append(help='Manage the program defaults', + id=wxID_ROOTMENUFILEPREFERENCES, kind=wx.ITEM_NORMAL, + text='Preferences ...\tAlt+p') + parent.AppendSeparator() + parent.Append(help=u'Quit the wxmtxy application', + id=wxID_ROOTMENUFILEEXIT, kind=wx.ITEM_NORMAL, text=u'Exit') + self.Bind(wx.EVT_MENU, self.OnMenuFileExitMenu, + id=wxID_ROOTMENUFILEEXIT) + # 2018-04-21,prj: remove ^W due to user mistake + # self.Bind(wx.EVT_MENU, self.OnMenuFileCloseMenu, + # id=wxID_ROOTMENUFILECLOSE) + self.Bind(wx.EVT_MENU, self.OnMenuFileImportMenu, + id=wxID_ROOTMENUFILEIMPORT) + self.Bind(wx.EVT_MENU, self.OnMenuFileNewMenu, id=wxID_ROOTMENUFILENEW) + self.Bind(wx.EVT_MENU, self.OnMenuFileOpenMenu, + id=wxID_ROOTMENUFILEOPEN) + self.Bind(wx.EVT_MENU, self.OnMenuFileSaveMenu, + id=wxID_ROOTMENUFILESAVE) + self.Bind(wx.EVT_MENU, self.OnMenuFileSaveasMenu, + id=wxID_ROOTMENUFILESAVEAS) + self.Bind(wx.EVT_MENU, self.OnMenuFilePreferencesMenu, + id=wxID_ROOTMENUFILEPREFERENCES) + self.Bind(wx.EVT_MENU, self.OnMenuFileExportMenu, + id=wxID_ROOTMENUFILEEXPORT) + + def _init_coll_menuAbout_Items(self, parent): + # generated method, don't edit + + parent.Append(help=u'Not ready yet', id=wxID_ROOTMENUABOUTHELP, + kind=wx.ITEM_NORMAL, text=u'Help') + parent.Append(help=u'General information about wxmtxy', + id=wxID_ROOTMENUABOUTABOUT, kind=wx.ITEM_NORMAL, + text=u'About ...') + self.Bind(wx.EVT_MENU, self.ShowAbout, id=wxID_ROOTMENUABOUTABOUT) + self.Bind(wx.EVT_MENU, self.OnMenuAboutHelpMenu, + id=wxID_ROOTMENUABOUTHELP) + + def _init_coll_statusBar1_Fields(self, parent): + # generated method, don't edit + parent.SetFieldsCount(1) + + parent.SetStatusText(number=0, text=u'status') + + parent.SetStatusWidths([-1]) + + def _init_utils(self): + # generated method, don't edit + self.menuFile = wx.Menu(title='') + + self.menuEdit = wx.Menu(title='') + + self.menuPage = wx.Menu(title='') + + self.menuAbout = wx.Menu(title='') + + self.menuBar1 = wx.MenuBar() + + self._init_coll_menuFile_Items(self.menuFile) + self._init_coll_menuPage_Items(self.menuPage) + self._init_coll_menuAbout_Items(self.menuAbout) + self._init_coll_menuBar1_Menus(self.menuBar1) + + def _init_ctrls(self, prnt): + # generated method, don't edit + wx.Frame.__init__(self, id=wxID_ROOT, name=u'root', parent=prnt, + pos=wx.Point(312, 25), size=wx.Size(416, 504), + style=wx.DEFAULT_FRAME_STYLE, title=u'wxmtxy') + self._init_utils() + self.SetClientSize(wx.Size(408, 470)) + self.SetMinSize(wx.Size(408, 420)) + self.SetMenuBar(self.menuBar1) + + self.statusBar1 = wx.StatusBar(id=wxID_ROOTSTATUSBAR1, + name='statusBar1', parent=self, style=0) + self._init_coll_statusBar1_Fields(self.statusBar1) + self.SetStatusBar(self.statusBar1) + + self.pagebook = wx.Notebook(id=wxID_ROOTPAGEBOOK, name=u'pagebook', + parent=self, pos=wx.Point(0, 0), size=wx.Size(408, 427), style=0) + self.pagebook.SetToolTipString(u'Each "page" describes a different X,Y pair of EPICS motors') + + def __init__(self, parent, settingsFile = None): + '''This is the main application window and class. + @param parent: object that owns this window + @param settingsFile: [string] name of the XML file''' + self.paircounter = 0 # incrementing index to create page names + self._init_ctrls(parent) + self.title = self.GetTitle() + self._dirty(False) # settings need to be saved to a file if True + self.pwd = os.getcwd() + self.settingsFile = settingsFile + if self.settingsFile == None: + self.NewPair() # by default, make a starting space + else: + self.SetStatusText('opening: %s' % self.settingsFile) + self.OpenSettingsFile(self.settingsFile) + # disable these menu items until they are implemented + #self.menuAbout.FindItemById(wxID_ROOTMENUABOUTHELP).Enable(False) + self.menuFile.FindItemById(wxID_ROOTMENUFILEEXPORT).Enable(False) + self.menuFile.FindItemById(wxID_ROOTMENUFILEPREFERENCES).Enable(False) + + +# ################################ +# ## added methods ### +# ################################ + + def PairHandler(self, thePair, theTab, theRow, command): + '''Callback function to handle a command from a pair + @param thePair: wxmtxy_pair.XYpair object + @param theTab: wxmtxy_tab.Tab object + @param theRow: wxmtxy_row.Row object + @param command: [string] action from Row button''' + commandSet = ['delete', 'set', 'go', 'stop'] + if command not in commandSet: + self.SetStatusText('Unknown command: %s' % command) + return + if command == 'delete': + self.DeleteRow(thePair, theTab, theRow) + if command == 'set': + self.SetRow(thePair, theTab, theRow) + if command == 'go': + self.GoRow(thePair, theTab, theRow) + if command == 'stop': + self.StopPair(thePair) + + def _dirty(self, state=True): + '''Declare the settings dirty (means that changes are unsaved) + @param state: [Boolean] True means there are unsaved changes''' + self.dirty = state + title = self.title + if state == True: + title = '* ' + title + ' *' + self.SetTitle(title) + + def NewPair(self, newtab=True): + '''Create a page for a new X,Y pair + @param newtab: [Boolean] option to create a first tab''' + self.paircounter += 1 # unique for each new page + name = 'panel' + repr(self.paircounter) + text = 'pair ' + repr(self.paircounter) + panel = wxmtxy_pair.XYpair(name=name, parent=self.pagebook, + root=self, rootCallback=self.PairHandler, newtab=newtab) + self.pagebook.AddPage(imageId=-1, page=panel, select=True, text=text) + panel.SetPageTitle(text) + self.SetStatusText('Created page titled: %s' % text) + self.Layout() + self._dirty() + return panel + + def GetPairText(self, pairnum): + '''@param pairnum: [int] index number of the XY_pair + @return: text of the pair numbered pairnum''' + return self.pagebook.GetPageText(pairnum) + + def SetPairText(self, pairnum, text): + '''set the text of the pair numbered pairnum + @param pairnum: [int] index number of the XY_pair + @param text: [string] name of the XYpair''' + self.pagebook.SetPageText(pairnum, text) + panel = self.pagebook.GetPage(pairnum) + panel.SetPageTitle(text) + + def DeletePairnum(self, pairnum): + '''Delete the selected X,Y pair and settings + @param pairnum: [int] index number of the XY_pair''' + try: + self.pagebook.DeletePage(pairnum) + except: + self.SetStatusText('Could not delete that pair') + + def GetEpicsConfig(self, pairnum): + '''Return the EPICS PV configuration for the indexed X,Y pair + @param pairnum: [int] index number of the XY_pair''' + panel = self.pagebook.GetPage(pairnum) + config = panel.GetEpicsConfig() + return config + + def SetEpicsConfig(self, pairnum, config): + '''Define the EPICS PVs for the indexed X,Y pair + @param pairnum: [int] index number of the XY_pair + @param config: Python dictionary of EPICS PV configuration''' + panel = self.pagebook.GetPage(pairnum) + panel.SetEpicsConfig(config) + panel.ConnectEpics() + + def RequestConfirmation(self, command, text): + '''Present a dialog asking user to confirm step + @param command: [string] action to be confirmed + @param text: [string] message to user''' + # confirm this step + self.SetStatusText('Request Confirmation') + dlg = wx.MessageDialog(self, text, + 'Confirm %s' % command, + wx.YES|wx.NO) + result = dlg.ShowModal() + dlg.Destroy() # destroy first + if result == wx.ID_YES: + self.SetStatusText('accepted request: %s' % command) + else: + self.SetStatusText('canceled request: %s' % command) + return result + + def DeleteRow(self, thePair, theTab, theRow): + '''Process a 'delete' command from a row button + @param thePair: wxmtxy_pair.XYpair object + @param theTab: wxmtxy_tab.Tab object + @param theRow: wxmtxy_row.Row object''' + text = 'Delete row labeled: %s' % theRow.GetLabel() + # confirm this step + result = self.RequestConfirmation('Delete Row', text + '?') + if result != wx.ID_YES: + return + self.SetStatusText(text) + theTab.DeleteRow(theRow) + self._dirty() + + def SetRow(self, thePair, theTab, theRow): + '''Process a 'set' command from a row button + @param thePair: wxmtxy_pair.XYpair object + @param theTab: wxmtxy_tab.Tab object + @param theRow: wxmtxy_row.Row object''' + text = theRow.GetLabel() + self.SetStatusText('Set X, Y on row labeled: %s' % text) + x, y = thePair.GetRbvXY() + theRow.SetXY(x, y) + if len(theRow.GetLabel().strip()) == 0: + t = datetime.datetime.now() + yyyymmdd = t.strftime("%Y-%m-%d") + hhmmss = t.strftime("%H:%M:%S") + theRow.SetLabel(yyyymmdd + ',' + hhmmss) + self._dirty() + + def GoRow(self, thePair, theTab, theRow): + '''Process a 'go' command from a row button + @param thePair: wxmtxy_pair.XYpair object + @param theTab: wxmtxy_tab.Tab object + @param theRow: wxmtxy_row.Row object''' + text = theRow.GetLabel() + self.SetStatusText('Move EPICS motors on row labeled: %s' % text) + x_txt, y_txt = theRow.GetXY() + try: + x = float(x_txt) + y = float(y_txt) + except: + self.SetStatusText('X or Y not a number, will not move') + return + # identify EPICS motors and send them the move commands + thePair.MoveAxes(x, y) + title = thePair.GetPageTitle() + self.SetStatusText('Move %s to (%s, %s)' % (title, x_txt, y_txt)) + + def StopPair(self, thePair): + '''Process a 'stop' command from a stop button. + Need to stop the two associated positioners. + @param thePair: wxmtxy_pair.XYpair object''' + thePair.StopAxes() + title = thePair.GetPageTitle() + self.SetStatusText('Stop ' + title) + + def ImportRows(self, rowfile): + '''Import a row file into the current tab (make a tab if none exists) + @param rowfile: [string] name of the 3-column tab-separated file''' + self.SetStatusText('file: %s' % rowfile) + try: + fp = open(rowfile, 'r') + buf = fp.read() + fp.close() + except: + self.SetStatusText('Could not read file: %s' % rowfile) + return + # + if self.pagebook.GetSelection() < 0: + self.NewPair(newtab=False) # need to make a new page + pagenum = self.pagebook.GetSelection() + pair = self.pagebook.GetPage(pagenum) + if pair.GetSelection() < 0: + pair.NewTab(newrow=False) + tabnum = pair.GetSelection() + tab = pair.table.GetPage(tabnum) + linenum = 0 + for line in buf.strip().split('\n'): + linenum += 1 + try: + label, x, y = line.strip().split('\t') + row = tab.NewRow() + row.SetLabel(label) + row.SetXY(x, y) + except: + self.SetStatusText('Problem with row: %d' % linenum) + tab.Remap() # adjust for changes + + def OpenSettingsFile(self, settingsFile): + '''Open the named settings file and replace all the current settings + @param settingsFile: [string] name of the XML file''' + try: + rc = wxmtxy_xml.Settings(settingsFile) + result = rc.ReadXmlFile() + if result != None: + return result + except: + self.SetStatusText('Could not open: %s' % settingsFile) + return + # safe to proceed now + self.SetStatusText('Opened: %s' % settingsFile) + self.pagebook.DeleteAllPages() + self.settingsFile = settingsFile + selectedpairnum = rc.GetSelectedPair() + for pairnum in range(rc.CountPairs()): + pairnode = self.NewPair(newtab=False) + self.SetPairText(pairnum, rc.GetPairTitle(pairnum)) + self.SetEpicsConfig(pairnum, rc.GetEpicsConfig(pairnum)) + selectedtabnum = rc.GetSelectedTab(pairnum) + for tabnum in range(rc.CountTabs(pairnum)): + tabnode = pairnode.NewTab(newrow=False) + pairnode.SetTabText(tabnum, rc.GetTabTitle(pairnum, tabnum)) + selectedrownum = rc.GetSelectedRow(pairnum, tabnum) + for rownum in range(rc.CountRows(pairnum, tabnum)): + label = rc.GetRowTitle(pairnum, tabnum, rownum) + x, y = rc.GetRowXY(pairnum, tabnum, rownum) + rownode = tabnode.NewRow() + rownode.SetLabel(label) + rownode.SetXY(x, y) + tabnode.Remap() + if selectedrownum >= 0: + # none of these work correctly in ScrolledPanel + #tabnode.ChangeSelection(selectedrownum) + #tabnode.Scroll(1, 1+selectedrownum*25) + #row = tabnode.sizer.GetItem(rownum).GetWindow() + #tabnode.ScrollChildIntoView(row) + pass + if selectedtabnum >= 0: + pairnode.table.ChangeSelection(selectedtabnum) + if selectedpairnum >= 0: + self.pagebook.ChangeSelection(selectedpairnum) + self._dirty(False) + + def SaveSettingsFile(self, settingsFile): + '''Save the current settings to the named settings file + @param settingsFile: [string] name of the XML file''' + rc = wxmtxy_xml.Settings(settingsFile) + selectedpair = self.pagebook.GetSelection() + for pairnum in range(self.pagebook.GetPageCount()): + rc.NewPair(self.GetPairText(pairnum)) + if selectedpair == pairnum: + rc.SelectPair(pairnum) + pair = self.pagebook.GetPage(pairnum) + config = self.GetEpicsConfig(pairnum) + rc.SetEpicsConfig(pairnum, config) + selectedtab = pair.GetSelection() + for tabnum in range(pair.table.GetPageCount()): + rc.NewTab(pairnum, pair.GetTabText(tabnum)) + if selectedtab == tabnum: + rc.SelectTab(pairnum, tabnum) + tab = pair.table.GetPage(tabnum) + #selectedrow = tab.GetSelection() + for rownum in range(len(tab.GetChildren())): + rc.NewRow(pairnum, tabnum, tab.GetRowLabel(rownum)) + x, y = tab.GetRowXY(rownum) + rc.SetRowXY(pairnum, tabnum, rownum, x, y) + rc.SetSettingsFile(settingsFile) + rc.SaveXmlFile() + self.settingsFile = settingsFile + self._dirty(False) + + def PostNotice(self, title, message, flags): + '''post a message dialog box + @param title: [string] window title bar + @param message: [string] message message text + @param flags: dialog box flags (such as wx.OK | wx.ICON_INFORMATION)''' + dlg = wx.MessageDialog(None, message, title, flags) + dlg.ShowModal() + dlg.Destroy() + +# ################################ +# ## event handling routines ### +# ################################ + + def ShowAbout(self, event): + '''describe this application + @param event: wxPython event object''' + # derived from http://wiki.wxpython.org/Using%20wxPython%20Demo%20Code + # First we create and fill the info object + info = wx.AboutDialogInfo() + info.Name = wxmtxy_version.__summary__ + info.Version = wxmtxy_version.__version__ + info.Copyright = wxmtxy_version.__copyright__ + description = '' + for line in wxmtxy_version.__documentation__.strip().splitlines(): + item = line.strip() + if len(item) > 0: + description += ' ' + line.strip() + else: + description += '\n\n' + info.Description = wordwrap(description, 400, wx.ClientDC(self)) + URL = wxmtxy_version.__url__ + info.WebSite = (URL, wxmtxy_version.__svndesc__) + author = wxmtxy_version.__author__ + author += ", " + wxmtxy_version.__author_email__ + others = [ "author: ", author ] + others.extend(wxmtxy_version.__contributor_credits__) + info.Developers = others + info.License = wxmtxy_version.__license__ + # Then we call wx.AboutBox giving it the info object + wx.AboutBox(info) + + def OnMenuFileNewMenu(self, event): + '''Requested new settings + @param event: wxPython event object''' + self.SetStatusText('Requested new settings') + if self.dirty: + # confirm this step + result = self.RequestConfirmation('New', + 'There are unsaved changes. Create new settings anyway?') + if result != wx.ID_YES: + return + self.pagebook.DeleteAllPages() + self.NewPair() + self._dirty(False) + self.settingsFile = None + + def OnMenuFileOpenMenu(self, event): + '''Requested to open XML settings file + @param event: wxPython event object''' + if self.dirty: + # confirm this step + result = self.RequestConfirmation('Open ...', + 'There are unsaved changes. Open anyway?') + if result != wx.ID_YES: + return + #--- + self.SetStatusText('Requested to open XML settings file') + wildcard = "XML files (*.xml)|*.xml|" \ + "All files (*)|*" + instruction = "Choose an XML file with full settings." \ + " (The selected file will be verified before it is loaded.)" + dlg = wx.FileDialog(None, instruction, + self.pwd, "", wildcard, wx.OPEN) + if dlg.ShowModal() == wx.ID_OK: + self.pwd = os.path.dirname(dlg.GetPath()) + self.OpenSettingsFile(dlg.GetPath()) + dlg.Destroy() + + def OnMenuFileSaveMenu(self, event): + '''Requested to save settings to XML file + @param event: wxPython event object''' + if self.settingsFile == None: + self.OnMenuFileSaveasMenu(event) + else: + self.SaveSettingsFile(self.settingsFile) + + def OnMenuFileSaveasMenu(self, event): + '''Requested to save settings to new XML file + @param event: wxPython event object''' + self.SetStatusText('Save current settings to XML file') + wildcard = "XML files (*.xml)|*.xml|" \ + "All files (*)|*" + instruction = "Save current settings to XML file" \ + " (either existing or new)" + dlg = wx.FileDialog(None, instruction, + self.pwd, "", wildcard, wx.SAVE|wx.OVERWRITE_PROMPT) + if dlg.ShowModal() == wx.ID_OK: + filename = dlg.GetPath() + self.pwd = os.path.dirname(filename) + self.SaveSettingsFile(filename) + dlg.Destroy() + self._dirty(False) + + def OnMenuFileCloseMenu(self, event): + '''User requested to close the settings file + @param event: wxPython event object''' + if self.pagebook.GetPageCount() > 0: + if self.dirty: + # confirm this step + result = self.RequestConfirmation('Close All', + 'There are unsaved changes. Close All anyway?') + if result != wx.ID_YES: + return + self.SetStatusText('Close All requested') + self.pagebook.DeleteAllPages() + else: + self.SetStatusText('Nothing to close') + self._dirty(False) + + def OnMenuFileImportMenu(self, event): + '''user requested to import a table of settings from a file + @param event: wxPython event object''' + wildcard = "text files (*.txt)|*.txt|" \ + "All files (*)|*" + instruction = "Choose a file with row settings" + dlg = wx.FileDialog(None, instruction, + self.pwd, "", wildcard, wx.OPEN) + # what about changing self.pwd here? + if dlg.ShowModal() == wx.ID_OK: + self.pwd = os.path.dirname(dlg.GetPath()) + self.ImportRows(dlg.GetPath()) + dlg.Destroy() + + def OnMenuFileExportMenu(self, event): + '''user requested to export a Tab + @param event: wxPython event object + @note: Not implemented yet''' + event.Skip() + + def OnMenuFilePreferencesMenu(self, event): + '''user requested to view/edit preferences + @param event: wxPython event object + @note: Not implemented yet''' + self.SetStatusText('Requested to edit Preferences') + self.PostNotice("Construction Zone!", + "'Preferences ...' menu item not implemented yet.", + wx.OK | wx.ICON_INFORMATION) + + def OnMenuFileExitMenu(self, event): + '''User requested to quit the application + @param event: wxPython event object''' + if self.dirty: + # confirm this step + result = self.RequestConfirmation('Exit (Quit)', + 'There are unsaved changes. Exit (Quit) anyway?') + if result != wx.ID_YES: + return + self.Close() + + def OnMenuPageChoicenewpairMenu(self, event): + '''User requested a new X,Y pair + @param event: wxPython event object''' + self.NewPair() + self._dirty() + + def OnMenuPageChoicedeletepairMenu(self, event): + '''User requested to delete the X,Y pair + @param event: wxPython event object''' + pagenum = self.pagebook.GetSelection() + if pagenum < 0: + self.SetStatusText('no page to delete') + return + text = self.pagebook.GetPageText(pagenum) + # confirm this step + requestText = 'Delete X,Y page [%s]?' % text + result = self.RequestConfirmation('Delete X,Y page?', + requestText) + if result == wx.ID_YES: + self.DeletePairnum(pagenum) + self.SetStatusText('page was deleted') + self._dirty() + + def OnMenuPageChoicechangetitleMenu(self, event): + '''User requested to change the page title + @param event: wxPython event object''' + pagenum = self.pagebook.GetSelection() + if pagenum >= 0: + self.SetStatusText('requested X,Y page name change') + response = wx.GetTextFromUser(parent=self, + message='Rename this page of settings:', + caption='Rename this page', + default_value=self.pagebook.GetPageText(pagenum)) + if len(response) > 0: + self.SetStatusText('New page title: %s' % response) + self.SetPairText(pagenum, response) + self._dirty() + else: + self.SetStatusText('Rename was canceled') + else: + self.SetStatusText('no page to rename') + + def OnMenuPageChoicenewtabMenu(self, event): + '''user requested a new tab + @param event: wxPython event object''' + pagenum = self.pagebook.GetSelection() + if pagenum < 0: + self.SetStatusText('No pages now! Cannot create a tab.') + return # early + pair = self.pagebook.GetPage(pagenum) + pair.NewTab() + self.SetStatusText('Created new tab.') + self._dirty() + + def OnMenuPageChoicedeletetabMenu(self, event): + '''user requested to delete a tab + @param event: wxPython event object''' + pagenum = self.pagebook.GetSelection() + if pagenum < 0: + self.SetStatusText('No pages now! Cannot delete a tab.') + return # early + pair = self.pagebook.GetPage(pagenum) + tabnum = pair.GetSelection() + if tabnum < 0: + self.SetStatusText('No tab to delete.') + return + text = pair.GetTabText(tabnum) + # confirm this step + requestText = 'Delete tab [%s]?' % text + result = self.RequestConfirmation('Delete tab?', + requestText) + if result == wx.ID_YES: + self.SetStatusText(pair.DeleteTab()) + self._dirty() + + def OnMenuPageChoicechangetabtitleMenu(self, event): + '''user requested to rename tab + @param event: wxPython event object''' + pagenum = self.pagebook.GetSelection() + if pagenum < 0: + self.SetStatusText('No pages now! Cannot rename a tab.') + return # early + pair = self.pagebook.GetPage(pagenum) + tabnum = pair.GetSelection() + if tabnum < 0: + self.SetStatusText('No tab to rename.') + return + text = pair.GetTabText(tabnum) + self.SetStatusText('requested tab name change') + response = wx.GetTextFromUser(parent=self, + message='Rename this tab:', + caption='Rename this tab', + default_value=text) + if len(response) > 0: + self.SetStatusText('New tab name: %s' % response) + pair.SetTabText(tabnum, response) + self._dirty() + else: + self.SetStatusText('Rename tab was canceled') + + def OnMenuPageChoicenewrowMenu(self, event): + '''user requested to create a new row of settings in the current table + @param event: wxPython event object''' + pagenum = self.pagebook.GetSelection() + if pagenum < 0: + self.SetStatusText('No pages now! Cannot create a row.') + return # early + pair = self.pagebook.GetPage(pagenum) + tabnum = pair.GetSelection() + if tabnum < 0: + self.SetStatusText('No tabs now! Cannot create a row.') + return + tab = pair.table.GetPage(tabnum) + tab.NewRow() + tab.Remap() + self.SetStatusText('Created new row.') + self._dirty() + + def OnMenuAboutHelpMenu(self, event): + '''user requested help + @param event: wxPython event object + @note: Not implemented yet''' + self.SetStatusText('starting HTML Help Viewer ...') + page = 'index.html' + root_dir = os.path.split(inspect.getsourcefile(root))[0] + fullname = os.path.join(root_dir, page) + wxmtxy_htmlview.HtmlView(parent=None, + homepage=fullname, id=-1, + title='HtmlView: '+page).Show() + + def OnMenuPageChoiceepicsconfigMenu(self, event): + '''user requested to view/change EPICS PV configuration + @param event: wxPython event object''' + self.SetStatusText('Modifying EPICS PV configuration details') + pagenum = self.pagebook.GetSelection() + if pagenum < 0: + self.SetStatusText('No pages now! Cannot modify EPICS PV configuration.') + return # early + orig_cfg = copy.deepcopy(self.GetEpicsConfig(pagenum)) + dlg = wxmtxy_pvsetup.PvDialog(None, orig_cfg) + try: + result = dlg.ShowModal() + finally: + if result == wx.ID_OK: + new_cfg = copy.deepcopy(dlg.GetConfiguration()) + # smarter way is to compare orig_cfg and new_fg + self._dirty() + self.SetEpicsConfig(pagenum, new_cfg) + dlg.Destroy() diff --git a/wxmtxy_row.py b/wxmtxy_row.py new file mode 100755 index 0000000..e5062d6 --- /dev/null +++ b/wxmtxy_row.py @@ -0,0 +1,189 @@ +#Boa:FramePanel:Row + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +''' +Define the GUI elements and interface for one row of the table + +@version: +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_row.py $ +# $Id: wxmtxy_row.py 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### +''' + +import wx +import inspect +import os + +[wxID_ROW, wxID_ROWDELETE, wxID_ROWGO, wxID_ROWLABEL, wxID_ROWSET, wxID_ROWX, + wxID_ROWY, +] = [wx.NewId() for _init_ctrls in range(7)] + +class Row(wx.Panel): + '''One row of settings in a wxmtxy table''' + + def _init_coll_sizer_Items(self, parent): + # generated method, don't edit + + parent.AddWindow(self.delete, 0, border=0, flag=0) + parent.AddWindow(self.label, 0, border=0, flag=0) + parent.AddWindow(self.set, 0, border=0, flag=0) + parent.AddWindow(self.x, 0, border=0, flag=0) + parent.AddWindow(self.y, 0, border=0, flag=0) + parent.AddWindow(self.go, 0, border=0, flag=0) + + def _init_sizers(self): + # generated method, don't edit + self.sizer = wx.BoxSizer(orient=wx.HORIZONTAL) + + self._init_coll_sizer_Items(self.sizer) + + self.SetSizer(self.sizer) + + def _init_ctrls(self, prnt): + # generated method, don't edit + wx.Panel.__init__(self, id=wxID_ROW, name='Row', parent=prnt, + pos=wx.Point(51, 84), size=wx.Size(312, 25), + style=wx.TAB_TRAVERSAL) + self.SetClientSize(wx.Size(312, 25)) + self.SetMinSize(wx.Size(312, 25)) + + self.delete = wx.BitmapButton( + id=wxID_ROWDELETE, name='delete', + parent=self, pos=wx.Point(0, 0), size=wx.Size(24, 24), + style=wx.BU_AUTODRAW) + self.delete.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=wxID_ROWDELETE) + self.delete.SetToolTipString(u'Delete this row') + + self.label = wx.TextCtrl(id=wxID_ROWLABEL, name='label', parent=self, + pos=wx.Point(24, 0), size=wx.Size(80, 25), style=0, value='') + self.label.SetMinSize(wx.Size(80, 25)) + self.label.SetToolTipString(u'Description of this row') + + self.set = wx.BitmapButton( + id=wxID_ROWSET, name='set', parent=self, + pos=wx.Point(104, 0), size=wx.Size(24, 24), style=wx.BU_AUTODRAW) + self.set.Bind(wx.EVT_BUTTON, self.OnSetButton, id=wxID_ROWSET) + self.set.SetToolTipString(u'Copy current X,Y readback values to this row') + + self.x = wx.TextCtrl(id=wxID_ROWX, name='x', parent=self, + pos=wx.Point(128, 0), size=wx.Size(80, 25), style=0, value='') + self.x.SetMinSize(wx.Size(80, 25)) + self.x.SetToolTipString(u'X axis target position') + + self.y = wx.TextCtrl(id=wxID_ROWY, name='y', parent=self, + pos=wx.Point(208, 0), size=wx.Size(80, 25), style=0, value='') + self.y.SetMinSize(wx.Size(80, 25)) + self.y.SetToolTipString(u'Y axis target position') + + self.go = wx.BitmapButton( + id=wxID_ROWGO, name='go', parent=self, + pos=wx.Point(288, 0), size=wx.Size(24, 24), style=wx.BU_AUTODRAW) + self.go.Bind(wx.EVT_BUTTON, self.OnGoButton, id=wxID_ROWGO) + self.go.SetToolTipString(u'Command EPICS to move motors to this X,Y position') + + self._init_sizers() + + def __init__(self, tab, tabCallback): + '''initialize the row + @param tab: parent object (Tab object that owns this Row object) + @param tabCallback: callback function that takes two arguments + ''' + # first, find the directory where this code is installed + # so the bitmaps can be found + # Note that this breaks edit ability of BoaConstructor + root_dir = os.path.split(inspect.getsourcefile(Row))[0] + self.bmp = {} + for item in ['delete', 'set', 'go']: + file = os.path.join(root_dir, 'graphics', item + '.bmp') + self.bmp[item] = wx.Bitmap(file, wx.BITMAP_TYPE_BMP) + self._init_ctrls(tab) + self.delete.SetBitmapLabel(self.bmp['delete']) + self.set.SetBitmapLabel(self.bmp['set']) + self.go.SetBitmapLabel(self.bmp['go']) + self.tab = tab + self.tabCallback = tabCallback + # sizes keep getting botched in Boa, fix them here + self._fix_sizer(self.label, wx.GROW, 2) + self._fix_sizer(self.x, wx.GROW, 1) + self._fix_sizer(self.y, wx.GROW, 1) + +# ################################ +# ## added methods ### +# ################################ + + def _fix_sizer(self, widget, flag, proportion): + '''sizes keep getting botched in Boa, fix them here + @param widget: GUI object to be adjusted + @param flag: usually wx.GROW + @param proportion: [int]''' + item = self.sizer.GetItem(widget) + item.SetFlag(flag) + item.SetProportion(proportion) + + def GetLabel(self): + '''@return row label''' + return self.label.GetValue() + + def SetLabel(self, text): + '''Define the label + @param text: [string] user description of this row''' + self.label.SetValue(text) + + def GetXY(self): + '''@return X, Y values as a tuple''' + x = self.x.GetValue() + y = self.y.GetValue() + return x, y + + def SetXY(self, x, y): + '''Define the values + @param x: [float] X axis position to remember + @param y: [float] Y axis position to remember''' + self.x.SetValue(x) + self.y.SetValue(y) + + def DeleteRow(self, parent): + '''Tell parent to delete this row (may be tricky) + @param parent: object of Tab that owns this Row''' + self.tabCallback(self, 'delete') + + def SetPositions(self, parent): + '''Tell parent to set positions on this row + @param parent: object of Tab that owns this Row''' + self.tabCallback(self, 'set') + + def Go(self, parent): + '''Tell parent to move motors to this X,Y + @param parent: object of Tab that owns this Row''' + self.tabCallback(self, 'go') + +# ################################ +# ## event handling routines ### +# ################################ + + def OnDeleteButton(self, event): + '''Delete button pressed + @param event: wxPython event object''' + self.DeleteRow(self.tab) + + def OnSetButton(self, event): + '''Set button pressed + @param event: wxPython event object''' + self.SetPositions(self.tab) + + def OnGoButton(self, event): + '''Go button pressed + @param event: wxPython event object''' + self.Go(self.tab) diff --git a/wxmtxy_tab.py b/wxmtxy_tab.py new file mode 100755 index 0000000..0da6f5f --- /dev/null +++ b/wxmtxy_tab.py @@ -0,0 +1,120 @@ +#Boa:FramePanel:Tab + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +''' +Define the GUI elements and interface for one tab (table) of the X,Y pair + +@version: +########### SVN repository information ################### +# $Date: 2010-06-03 16:04:15 -0500 (Thu, 03 Jun 2010) $ +# $Author: jemian $ +# $Revision: 184 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_tab.py $ +# $Id: wxmtxy_tab.py 184 2010-06-03 21:04:15Z jemian $ +########### SVN repository information ################### +''' + +import wx +import wxmtxy_row +import wx.lib.scrolledpanel + + # Alternative is to use a wx.lib.scrolledpanel.ScrolledPanel + # and call this method after subpanels have been created: + # wx.lib.scrolledpanel.SetupScrolling(self, + # scroll_x=False, scroll_y=True, + # rate_x=20, rate_y=[get this from the subpanel height]) + # Turns out the ScrolledPanel was developed for situations just like this! + +[wxID_TAB] = [wx.NewId() for _init_ctrls in range(1)] + +class Tab(wx.lib.scrolledpanel.ScrolledPanel): + '''Create a panel to display rows of settings''' + + # see: http://wiki.wxpython.org/BoaFAQ + _custom_classes = {'wx.Panel': ['Row']} + + def _init_sizers(self): + # generated method, don't edit + self.sizer = wx.BoxSizer(orient=wx.VERTICAL) + + self.SetSizer(self.sizer) + + def _init_ctrls(self, prnt): + # generated method, don't edit + wx.lib.scrolledpanel.ScrolledPanel.__init__(self, + id=wxID_TAB, name='Tab', parent=prnt, + pos=wx.Point(50, 39), size=wx.Size(408, 100), + style=wx.TAB_TRAVERSAL) + self.SetClientSize(wx.Size(400, 100)) + self.SetMinSize(wx.Size(240, 75)) + + self._init_sizers() + + def __init__(self, parent, pair, pairCallback, newrow=False): + '''create the panel''' + self._init_ctrls(parent) + self.pair = pair + self.pairCallback = pairCallback + if newrow == True: + self.NewRow() # make the first row if requested + +# ################################ +# ## added methods ### +# ################################ + + def NewRow(self, remap = False): + '''Make a new row and append it to the current tab + @param remap: [Boolean] option to call self.Remap()''' + panel = wxmtxy_row.Row(self, self.RowHandler) + self.sizer.AddWindow(panel, 0, border=2, flag=wx.GROW) + if remap: + self.Remap() + return panel + + def DeleteRow(self, theRow): + '''Delete a row object + @param theRow: ''' + self.sizer.Detach(theRow) + theRow.Destroy() + self.Remap() + + def Remap(self): + '''adjust the layout for any changes''' + self.SetupScrolling(scroll_x=False, scroll_y=True, rate_x=1, rate_y=25) + self.sizer.Layout() + self.Layout() + + def RowHandler(self, theRow, command): + '''Handle a command from a row''' + #print 'RowHandler', command, theRow.GetLabel(), theRow.GetXY() + (self.pairCallback)(self, theRow, command) + + def GetRowLabel(self, rownum): + '''return the text in the label slot for the given row''' + return self.sizer.GetItem(rownum).GetWindow().GetLabel() + + def SetRowLabel(self, rownum, label): + '''set the text in the label slot for the given row''' + self.sizer.GetItem(rownum).GetWindow().SetLabel(label) + + def GetRowXY(self, rownum): + '''return the X,Y values in the label slot for the given row''' + return self.sizer.GetItem(rownum).GetWindow().GetXY() + + def SetRowXY(self, rownum, x, y): + '''set the text in the label slot for the given row''' + self.sizer.GetItem(rownum).GetWindow().SetXY(x, y) + +# ################################ +# ## event handling routines ### +# ################################ + + # none diff --git a/wxmtxy_version.py b/wxmtxy_version.py new file mode 100755 index 0000000..c3c242c --- /dev/null +++ b/wxmtxy_version.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +# full contents of __file_license__ appear at the top of each file +__file_license__ = ''' +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* +''' + +''' +version information for wxmtxy + +########### SVN repository information ################### +# $Date: 2010-12-06 15:28:19 -0600 (Mon, 06 Dec 2010) $ +# $Author: jemian $ +# $Revision: 217 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_version.py $ +# $Id: wxmtxy_version.py 217 2010-12-06 21:28:19Z jemian $ +########### SVN repository information ################### +''' + + +__author__ = "Pete R. Jemian" +__author_email__ = "jemian@anl.gov" +__contributor_credits__ = [ + "", + "other contributors:", + "Geoff Savage/FNAL and John Hammonds/APS for CaChannel", + "Tim Mooney/APS for ca_util"] +__company_name__ = "Advanced Photon Source" +__version__ = "0.5" +__copyright__ = "(c) 2009, 2010" +#fp = open('LICENSE', 'r') +#__license__ = fp.read() +#fp.close() +__license__ = "APS extensions license. See LICENSE file for details" +__long_description__ = '''wxmtxy is an EPICS GUI tool to assist users in routine operation of positioning devices''' +__main_script__ = "wxmtxy.py" +__summary__ = "wxmtxy: a GUI tool for EPICS" +__target_name__ = "wxmtxy" +__url__ = "https://subversion.xor.aps.anl.gov/trac/bcdaext/wiki/wxmtxy" +__urlsvn__ = "https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy" +__svndesc__ = 'wxmtxy SVN repo page' +__documentation__ = ''' + *wxmtxy* (an EPICS GUI tool) provides support for an X,Y positioner + (motor) pair by allowing users to define a table of known positions + and providing a one-button click to drive a chosen X,Y pair to a specific + table setting. Also can record current position into a setting. + + Several sets of X,Y positioners can be configured. (Each set is + separate.) In fact, the positioners do not have to be motors, + but can be any type of EPICS PV that will accept a numeric value. +''' + diff --git a/wxmtxy_xml.py b/wxmtxy_xml.py new file mode 100755 index 0000000..c69f1a3 --- /dev/null +++ b/wxmtxy_xml.py @@ -0,0 +1,555 @@ +#!/usr/bin/env python + +#************************************************************************* +# Copyright (c) 2009-2010 The University of Chicago, as Operator of Argonne +# National Laboratory. +# Copyright (c) 2009-2010 The Regents of the University of California, as +# Operator of Los Alamos National Laboratory. +# This file is distributed subject to a Software License Agreement found +# in the file LICENSE that is included with this distribution. +#************************************************************************* + +'''@note: support the XML settings file for the wxmtxy application + +This Python file provides routines to read and write XML settings +files for the wxmtxy application. An example of the XML file is +shown below. The routines manage the settings internally with a +Python dictionary. Interface routines are used to read and write +the various components of the file. *HOWEVER*, the EPICS configuration +is communicated in a Python dictionary. An example of the Python +dictionary with the EPICS configuration is shown below. + +@version: +########### SVN repository information ################### +# $Date: 2010-12-06 15:13:14 -0600 (Mon, 06 Dec 2010) $ +# $Author: jemian $ +# $Revision: 216 $ +# $URL: https://subversion.xor.aps.anl.gov/bcdaext/wxmtxy/trunk/wxmtxy_xml.py $ +# $Id: wxmtxy_xml.py 216 2010-12-06 21:13:14Z jemian $ +########### SVN repository information ################### + +@note: for help with xml.dom, see http://docs.python.org/library/xml.dom.html + +@note: Here is an example XML file: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@note: Here is an example Python dictionary of the EPICS configuration above: + example_dictionary = { + 'x': { + 'isMotorRec': False, + 'VAL': '32idbLAX:float1', + 'RBV': '32idbLAX:float2', + 'DESC': '32idbLAX:string1', + 'EGU': '32idbLAX:string2', + 'DMOV': '32idbLAX:bit1', + 'STOP': '32idbLAX:bit2' + }, + 'y': { + 'isMotorRec': True, + 'VAL': '32idbLAX:m58:c1:m1.VAL' + } + } +''' + + +from xml.dom import minidom +import datetime +import copy +import wxmtxy_axis + + +class Settings: + '''handle the XML settings file''' + + def __init__(self, settingsFile=None): + '''prepare the settings file + @param settingsFile: [string] name of XML file with settings''' + self.rootElement = 'wxmtxy' + self.Clear() + self.SetSettingsFile(settingsFile) + + def GetDb(self): + '''@return: database''' + return self.db + + def GetSettingsFile(self): + '''@return: name of XML settings file''' + return self.settingsFile + + def SetSettingsFile(self, thefile): + '''set the name of XML settings file + @param thefile: [string] name of XML file with settings''' + self.settingsFile = thefile + + def Clear(self): + '''reset the internal data representation (db) to empty''' + self.db = {} + + def NewPair(self, title=''): + ''' create space in the database (db) for a new pair + and sets defaults for fields + + @param title: [string] the title of the XY_pair set (default="") + @return: the index number''' + if self.CountPairs() == -1: + self.db[u"pairs"] = [] + pairdb = {} + pairdb[u"@name"] = title + pairdb[u"@selected"] = False + self.db[u'pairs'].append(pairdb) + return len(self.db[u'pairs'])-1 + + def GetPairTitle(self, pairnum): + '''return the name of the XY_pair + @param pairnum: [int] index number of the XY_pair''' + return self.db[u"pairs"][pairnum][u"@name"] + + def SetPairTitle(self, pairnum, title): + '''set the name of the XY_pair + @param pairnum: [int] index number of the XY_pair' + @param title: [string] name of the XY_pair''' + self.db[u"pairs"][pairnum][u"@name"] = title + + def SelectPair(self, pairnum): + '''set the "selected" attribute of the pair + @param pairnum: [int] index number of the XY_pair''' + for pair in self.db[u"pairs"]: # first, deselect all pairs + pair[u"@selected"] = False + self.db[u"pairs"][pairnum][u"@selected"] = True + + def GetSelectedPair(self): + '''@return: index number of the "selected" pair (-1 if none selected)''' + selected = -1 + try: + pairs = self.db[u"pairs"] + for pairnum in range(len(pairs)): + if pairs[pairnum][u"@selected"]: + selected = pairnum + break + except: + pass + return selected + + def CountPairs(self): + '''@return: number of pairs''' + try: + return len(self.db[u"pairs"]) + except: + return -1 + + def NewEpicsConfig(self, pairnum): + '''Create internal space for a new EPICS configuration + @param pairnum: [int] index number of the XY_pair''' + pairdb = self.db[u"pairs"][pairnum] + pairdb[u"epics"] = {} + epicsdb = pairdb[u"epics"] + for axis in ['x', 'y']: + epicsdb[axis] = {} + axisdb = epicsdb[axis] + for field in wxmtxy_axis.field_list: + axisdb[field] = "" + axisdb[u"isMotorRec"] = False + + def GetEpicsConfig(self, pairnum): + '''Get a deep copy Python dictionary of the current EPICS PV config. + @param pairnum: [int] index number of the XY_pair + @return: the current EPICS configuration''' + return copy.deepcopy(self.db[u"pairs"][pairnum][u"epics"]) + + def SetEpicsConfig(self, pairnum, config): + '''set the current EPICS configuration + @param pairnum: [int] index number of the XY_pair + @param config: Python dictionary of EPICS PV configuration''' + pairdb = self.db[u"pairs"][pairnum] + deep = copy.deepcopy(config) + pairdb[u"epics"] = deep + + def SetEpicsField(self, pairnum, axis, field, value): + '''Define the EPICS config for a specific field + @param pairnum: [int] index number of the XY_pair' + @param axis: [string] "x" or "y"' + @param field: [string] member of wxmtxy_axis.field_list' + @param value: [string] value of this field''' + try: + axisdb = self.db[u"pairs"][pairnum][u"epics"][axis] + axisdb[field] = value + except: + print "Could not assign EPICS field", pairnum, axis, field, value + + + def NewTab(self, pairnum, title=''): + ''' create space in the database (db) pair for a new tab + and sets defaults for fields + + @param pairnum: [int] index number of the XY_pair + @param title: the title of the pair set (default="") + @return the index number''' + pairdb = self.db[u"pairs"][pairnum] + if not pairdb.has_key(u"tabs"): + pairdb[u"tabs"] = [] + tabdb = {} + tabdb[u"@name"] = title + tabdb[u"@selected"] = False + pairdb[u"tabs"].append(tabdb) + return len(pairdb[u"tabs"])-1 + + def GetTabTitle(self, pairnum, tabnum): + '''return the name of the tab + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object''' + return self.db[u"pairs"][pairnum][u"tabs"][tabnum][u"@name"] + + def SetTabTitle(self, pairnum, tabnum, title): + '''set the name attribute of the tab + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object + @param title: [string] title the Tab object''' + self.db[u"pairs"][pairnum][u"tabs"][tabnum]["@name"] = title + + def SelectTab(self, pairnum, tabnum): + '''set the selected attribute of the pair + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object''' + pairdb = self.db[u"pairs"][pairnum] + for tab in pairdb[u"tabs"]: # first, deselect all tabs + tab[u"@selected"] = False + pairdb[u"tabs"][tabnum][u"@selected"] = True + + def GetSelectedTab(self, pairnum): + '''return the index number of the selected tab + @param pairnum: [int] index number of the XY_pair''' + selected = -1 + try: + tabs = self.db[u"pairs"][pairnum][u"tabs"] + for tabnum in range(len(tabs)): + if tabs[tabnum][u"@selected"]: + selected = tabnum + break + except: + pass + return selected + + def CountTabs(self, pairnum): + '''return the number of tabs + @param pairnum: [int] index number of the XY_pair''' + try: + return len(self.db[u"pairs"][pairnum][u"tabs"]) + except: + return -1 + + def NewRow(self, pairnum, tabnum, title=''): + ''' create space in the database (db) pair for a new tab + and sets defaults for fields + + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object + @param title: the title of the Tab object (default="") + @return the index number''' + tabdb = self.db[u"pairs"][pairnum][u"tabs"][tabnum] + if not tabdb.has_key(u"rows"): + tabdb[u"rows"] = [] + rowdb = {} + rowdb[u"@name"] = title + rowdb[u"@selected"] = False + rowdb[u"@x"] = "" + rowdb[u"@y"] = "" + tabdb[u"rows"].append(rowdb) + return len(tabdb[u"rows"])-1 + + def GetRowTitle(self, pairnum, tabnum, rownum): + '''return the name of the row + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object + @param rownum: [int] index number of the Row object''' + tabdb = self.db[u"pairs"][pairnum][u"tabs"][tabnum] + return tabdb[u"rows"][rownum][u"@name"] + + def SetRowTitle(self, pairnum, tabnum, rownum, title): + '''set the name attribute of the row + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object + @param rownum: [int] index number of the Row object + @param title: [string] title the Tab object''' + tabdb = self.db[u"pairs"][pairnum][u"tabs"][tabnum] + tabdb[u"rows"][rownum][u"@name"] = title + + def GetRowXY(self, pairnum, tabnum, rownum): + '''return the name of the row + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object + @param rownum: [int] index number of the Row object''' + tabdb = self.db[u"pairs"][pairnum][u"tabs"][tabnum] + x = tabdb[u"rows"][rownum][u"@x"] + y = tabdb[u"rows"][rownum][u"@y"] + return x, y + + def SetRowXY(self, pairnum, tabnum, rownum, x, y): + '''set the name attribute of the row + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object + @param x: [float] X axis position + @param y: [float] Y axis position''' + tabdb = self.db[u"pairs"][pairnum][u"tabs"][tabnum] + tabdb[u"rows"][rownum][u"@x"] = x + tabdb[u"rows"][rownum][u"@y"] = y + + def CountRows(self, pairnum, tabnum): + '''return the number of rows + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object''' + try: + return len(self.db[u"pairs"][pairnum][u"tabs"][tabnum][u"rows"]) + except: + return -1 + + def GetSelectedRow(self, pairnum, tabnum): + '''return the index number of the selected row + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object''' + selected = -1 + try: + rows = self.db[u"pairs"][pairnum][u"tabs"][tabnum][u"rows"] + for rownum in range(len(rows)): + if rows[rownum][u"@selected"]: + selected = rownum + break + except: + pass + return selected + + def SelectRow(self, pairnum, tabnum, rownum): + '''set the selected attribute of the pair + @param pairnum: [int] index number of the XY_pair + @param tabnum: [int] index number of the Tab object + @param rownum: [int] index number of the Row object''' + tabdb = self.db[u"pairs"][pairnum][u"tabs"][tabnum] + for row in tabdb[u"rows"]: # first, deselect all rows + row[u"@selected"] = False + tabdb[u"rows"][rownum][u"@selected"] = True + + def ReadXmlFile(self): + '''read the settings from a file into an internal dictionary (self.db) + + @note: this method uses xml.dom.minidom (built into all Pythons) + @see: http://docs.python.org/library/xml.dom.minidom.html + ''' + try: + doc = minidom.parse(self.settingsFile) # parse an XML file by name + assert doc.documentElement.tagName == self.rootElement + except IOError: + return 'Could not read the XML file: ' + self.settingsFile + except AssertionError: + return 'XML root element is not ' + self.rootElement + #... read all attributes from the root element + docElem = doc.documentElement + self.Clear() + version = self._get_attribute(docElem, "version", "not-specified") + try: + # only handle v1.0 resource configuration files + assert version == u'1.0' + except AssertionError: + doc.unlink() + return 'Cannot handle file version:', version + # file verified now + for pairNode in docElem.getElementsByTagName("XYpair"): + title = self._get_attribute(pairNode, "name", "") + selected = self._get_attribute(pairNode, "selected", "") + pairnum = self.NewPair(title) + if selected.lower() == "true": + self.SelectPair(pairnum) + self.NewEpicsConfig(pairnum) + for EpicsNode in pairNode.getElementsByTagName("EPICS_configuration"): + for axisNode in EpicsNode.getElementsByTagName("axis"): + axis = self._get_attribute(axisNode, "name", "") + #isMotorRec + for flagNode in axisNode.getElementsByTagName("flag"): + text = self._get_attribute(flagNode, "isMotorRec", "False") + self.SetEpicsField(pairnum, axis, "isMotorRec", (text == "True")) + for fieldNode in axisNode.getElementsByTagName("field"): + name = self._get_attribute(fieldNode, "name", "") + pv = self._get_attribute(fieldNode, "pv", "") + if (len(name)>0) and (len(pv)>0): + #print pairnum, axis, name, pv + self.SetEpicsField(pairnum, axis, name, pv) + for tabNode in pairNode.getElementsByTagName("tab"): + title = self._get_attribute(tabNode, "name", "") + selected = self._get_attribute(tabNode, "selected", "") + tabnum = self.NewTab(pairnum, title) + if selected.lower() == "true": + self.SelectTab(pairnum, tabnum) + # EPICS settings here + for rowNode in tabNode.getElementsByTagName("row"): + title = self._get_attribute(rowNode, "name", "") + selected = self._get_attribute(rowNode, "selected", "") + x = self._get_attribute(rowNode, "x", "") + y = self._get_attribute(rowNode, "y", "") + rownum = self.NewRow(pairnum, tabnum, title) + self.SetRowXY(pairnum, tabnum, rownum, x, y) + doc.unlink() # ensures XML document is disposed cleanly + return None + + def _get_attribute(self, node, key, default): + '''get a specific attribute or return the default + @param node: XML Node object + @param key: [string] name of attribute to find + @param default: [string] default value to return''' + value = default + if node.attributes.has_key(key): + value = node.attributes[key].value + return value + + def SaveXmlFile(self): + '''save the internal dictionary (self.db) to an XML file + @note: What about using/saving a default stylesheet? + @see: http://www.boddie.org.uk/python/XML_intro.html + ''' + out = open(self.settingsFile, 'w') + out.write(repr(self)) + out.close() + # + # What about a default stylesheet? + # + + return 'Saved settings to ' + self.settingsFile + + def _SetAttr(self, node, attribute, value): + '''add attributes that are not empty (but do not strip the whitespace) + @param node: XML Node object + @param attribute: [string] name of attribute + @param value: [string] value of attribute''' + if len(value) > 0: + node.setAttribute(attribute, value) + + def _makeTextNode(self, doc, tag, value): + '''create a text node for the XML file + @param doc: [xml.dom.minidom documentElement object] + @param tag: [string] element name + @param value: [string] element text''' + node = doc.createElement(tag) + text = doc.createTextNode(value) + node.appendChild(text) + return node + + def __repr__(self): + '''default representation of this structure is XML + @return: XML representation of internal database (db) + @note: What about a default stylesheet? + ''' + t = datetime.datetime.now() + yyyymmdd = t.strftime("%Y-%m-%d") + hhmmss = t.strftime("%H:%M:%S") + + # Create the minidom document + doc = minidom.Document() + + # Create the root element + root = doc.createElement(self.rootElement) + self._SetAttr(root, "version", "1.0") + self._SetAttr(root, "date", yyyymmdd) + self._SetAttr(root, "time", hhmmss) + doc.appendChild(root) + selectedpairnum = self.GetSelectedPair() + for pairnum in range(self.CountPairs()): + pairnode = doc.createElement("XYpair") + self._SetAttr(pairnode, "name", + self.GetPairTitle(pairnum)) + if selectedpairnum == pairnum: + self._SetAttr(pairnode, "selected", "True") + if self.db[u"pairs"][pairnum].has_key(u"epics"): + epicsnode = doc.createElement("EPICS_configuration") + epicsdb = self.db[u"pairs"][pairnum][u"epics"] + for axis in epicsdb: + axisnode = doc.createElement("axis") + self._SetAttr(axisnode, "name", axis) + field = "isMotorRec" + if field in epicsdb[axis]: + node = doc.createElement("flag") + self._SetAttr(node, field, str(epicsdb[axis][field])) + axisnode.appendChild(node) + for field in wxmtxy_axis.field_list: + if field in epicsdb[axis]: + if len(epicsdb[axis][field])>0: + node = doc.createElement("field") + self._SetAttr(node, "name", field) + self._SetAttr(node, "pv", str(epicsdb[axis][field])) + axisnode.appendChild(node) + epicsnode.appendChild(axisnode) + pairnode.appendChild(epicsnode) + selectedtabnum = self.GetSelectedTab(pairnum) + for tabnum in range(self.CountTabs(pairnum)): + tabnode = doc.createElement("tab") + self._SetAttr(tabnode, "name", self.GetTabTitle(pairnum, tabnum)) + if selectedtabnum == tabnum: + self._SetAttr(tabnode, "selected", "True") + selectedrownum = self.GetSelectedRow(pairnum, tabnum) + for rownum in range(self.CountRows(pairnum, tabnum)): + rownode = doc.createElement("row") + label = self.GetRowTitle(pairnum, tabnum, rownum) + x, y = self.GetRowXY(pairnum, tabnum, rownum) + self._SetAttr(rownode, "name", label) + self._SetAttr(rownode, "x", x) + self._SetAttr(rownode, "y", y) + if selectedrownum == rownum: + self._SetAttr(rownode, "selected", "True") + tabnode.appendChild(rownode) + pairnode.appendChild(tabnode) + root.appendChild(pairnode) + return doc.toprettyxml(indent=" ") + + +if __name__ == '__main__': + rc = Settings("examples/test-settings.xml") + rc.ReadXmlFile() + rc.SetSettingsFile('output-test.xml') + rc.SaveXmlFile() + + pj = Settings() + pairnum = pj.NewPair("my test pair") + tabnum = pj.NewTab(pairnum, title='my test tab') + tabnum = pj.NewTab(pairnum, title='another') + pj.SelectTab(pairnum, tabnum) + tabnum = pj.NewTab(pairnum, title='another') + tabnum = pj.NewTab(pairnum, title='another') + pairnum = pj.NewPair("another") + pj.SelectPair(pairnum) + tabnum = pj.NewTab(pairnum, title='another') + rownum = pj.NewRow(pairnum, tabnum, "beam center") + pj.SelectRow(pairnum, tabnum, rownum) + tabnum = pj.NewTab(pairnum, title='another') + pairnum = pj.NewPair("another") + print str(pj)