]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/samples/embedded/embedded.cpp
typo
[wxWidgets.git] / wxPython / samples / embedded / embedded.cpp
index 73a79512c9d1e65d9ac66dc61a2dae89faf876df..44ec3670596dac2829144a26ee2efe62188c98b5 100644 (file)
@@ -1,6 +1,6 @@
 //----------------------------------------------------------------------
 // Name:        embedded.cpp
 //----------------------------------------------------------------------
 // Name:        embedded.cpp
-// Purpose:     To server as an example of how to use wxPython from
+// Purpose:     To serve as an example of how to use wxPython from
 //              within a C++ wxWindows program.
 //
 // Author:      Robin Dunn
 //              within a C++ wxWindows program.
 //
 // Author:      Robin Dunn
@@ -41,8 +41,6 @@ public:
     virtual bool OnInit();
     virtual ~MyApp();
     void Init_wxPython();
     virtual bool OnInit();
     virtual ~MyApp();
     void Init_wxPython();
-private:
-    PyThreadState* main_tstate;
 };
 
 
 };
 
 
@@ -83,16 +81,22 @@ void MyApp::Init_wxPython()
     // module and sets a pointer to a function table located there.
     wxPyCoreAPI_IMPORT();
 
     // module and sets a pointer to a function table located there.
     wxPyCoreAPI_IMPORT();
 
+    // Ensure that the new classes defined in the wxPython wrappers are
+    // recognised by the wx RTTI system.  (If you don't use wxWindows in
+    // your C++ app you won't need to do this.)
+    wxClassInfo::CleanUpClasses();
+    wxClassInfo::InitializeClasses();
+
     // Save the current Python thread state and release the
     // Global Interpreter Lock.
     // Save the current Python thread state and release the
     // Global Interpreter Lock.
-    main_tstate = wxPyBeginAllowThreads();
+    wxPyBeginAllowThreads();
 }
 
 
 MyApp::~MyApp()
 {
     // Restore the thread state and tell Python to cleanup after itself.
 }
 
 
 MyApp::~MyApp()
 {
     // Restore the thread state and tell Python to cleanup after itself.
-    wxPyEndAllowThreads(main_tstate);
+    wxPyEndAllowThreads(true);
     Py_Finalize();
 }
 
     Py_Finalize();
 }
 
@@ -108,8 +112,8 @@ enum
 
 
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
 
 
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
-    EVT_MENU(ID_EXIT,      OnExit)
-    EVT_MENU(ID_PYFRAME,   OnPyFrame)
+    EVT_MENU(ID_EXIT,      MyFrame::OnExit)
+    EVT_MENU(ID_PYFRAME,   MyFrame::OnPyFrame)
 END_EVENT_TABLE()
 
 
 END_EVENT_TABLE()
 
 
@@ -170,13 +174,13 @@ void MyFrame::OnPyFrame(wxCommandEvent& event)
     // First, whenever you do anyting with Python objects or code, you
     // *MUST* aquire the Global Interpreter Lock and block other
     // Python threads from running.
     // First, whenever you do anyting with Python objects or code, you
     // *MUST* aquire the Global Interpreter Lock and block other
     // Python threads from running.
-    wxPyBeginBlockThreads();
+    bool blocked = wxPyBeginBlockThreads();
 
     // Execute the code in the __main__ module
     PyRun_SimpleString(python_code1);
 
     // Finally, release the GIL and let other Python threads run.
 
     // Execute the code in the __main__ module
     PyRun_SimpleString(python_code1);
 
     // Finally, release the GIL and let other Python threads run.
-    wxPyEndBlockThreads();
+    wxPyEndBlockThreads(blocked);
 }
 
 
 }
 
 
@@ -191,9 +195,9 @@ from wxPython.wx import wxPyOnDemandOutputWindow\n\
 output = wxPyOnDemandOutputWindow()\n\
 sys.stdin = sys.stderr = output\n\
 ";
 output = wxPyOnDemandOutputWindow()\n\
 sys.stdin = sys.stderr = output\n\
 ";
-    wxPyBeginBlockThreads();
+    bool blocked = wxPyBeginBlockThreads();
     PyRun_SimpleString(python_redirect);
     PyRun_SimpleString(python_redirect);
-    wxPyEndBlockThreads();
+    wxPyEndBlockThreads(blocked);
 }
 
 
 }
 
 
@@ -212,7 +216,7 @@ wxWindow* MyFrame::DoPythonStuff(wxWindow* parent)
     // More complex embedded situations will require passing C++ objects to
     // Python and/or returning objects from Python to be used in C++.  This
     // sample shows one way to do it.  NOTE: The above code could just have
     // More complex embedded situations will require passing C++ objects to
     // Python and/or returning objects from Python to be used in C++.  This
     // sample shows one way to do it.  NOTE: The above code could just have
-    // easily come from a file, or the whole thing coupld be in the Python
+    // easily come from a file, or the whole thing could be in the Python
     // module that is imported and manipulated directly in this C++ code.  See
     // the Python API for more details.
 
     // module that is imported and manipulated directly in this C++ code.  See
     // the Python API for more details.
 
@@ -220,7 +224,7 @@ wxWindow* MyFrame::DoPythonStuff(wxWindow* parent)
     PyObject* result;
 
     // As always, first grab the GIL
     PyObject* result;
 
     // As always, first grab the GIL
-    wxPyBeginBlockThreads();
+    bool blocked = wxPyBeginBlockThreads();
 
     // Now make a dictionary to serve as the global namespace when the code is
     // executed.  Put a reference to the builtins module in it.  (Yes, the
 
     // Now make a dictionary to serve as the global namespace when the code is
     // executed.  Put a reference to the builtins module in it.  (Yes, the
@@ -271,7 +275,7 @@ wxWindow* MyFrame::DoPythonStuff(wxWindow* parent)
     Py_DECREF(tuple);
 
     // Finally, after all Python stuff is done, release the GIL
     Py_DECREF(tuple);
 
     // Finally, after all Python stuff is done, release the GIL
-    wxPyEndBlockThreads();
+    wxPyEndBlockThreads(blocked);
 
     return window;
 }
 
     return window;
 }
@@ -284,95 +288,3 @@ wxWindow* MyFrame::DoPythonStuff(wxWindow* parent)
 
 
 
 
 
 
-
-
-
-// void MyFrame::OnButton(wxCommandEvent& WXUNUSED(event))
-// {
-//     //Py_Initialize();
-//     //PySys_SetArgv(argc, argv)
-//     //  // initialize thread support
-//     //  PyEval_InitThreads();
-//     wxPyBeginBlockThreads();
-//     PyRun_SimpleString(
-//         "from wxPython.wx import *\n"
-//         "f = wxFrame(None, -1, 'Hello from wxPython', size=(250,150))\n"
-//         "f.Show()"
-//         );
-//     wxPyEndBlockThreads();
-// }
-
-
-
-
-
-
-// ////////////////////////////////////////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// /// this, RedirectIOToConsole(),  help came from
-// /// http://www.halcyon.com/ast/dload/guicon.htm
-
-// //  #include <windows.h>
-// //  #include <stdio.h>
-// #include <fcntl.h>
-// #include <io.h>
-// //  #include <iostream>
-// //  #include <fstream>
-// //  //#ifndef _USE_OLD_IOSTREAMS
-// //  using namespace std;
-// //  //#endif
-
-// // maximum mumber of lines the output console should have
-// static const WORD MAX_CONSOLE_LINES = 500;
-
-// void RedirectIOToConsole()
-// {
-//   int hConHandle;
-//   long lStdHandle;
-//   CONSOLE_SCREEN_BUFFER_INFO coninfo;
-//   FILE *fp;
-
-//   // allocate a console for this app
-//   AllocConsole();
-
-//   // set the screen buffer to be big enough to let us scroll text
-//   GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
-
-//   coninfo.dwSize.Y = MAX_CONSOLE_LINES;
-//   SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
-
-//   // redirect unbuffered STDOUT to the console
-//   lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
-//   hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
-
-//   fp = _fdopen( hConHandle, "w" );
-//   *stdout = *fp;
-
-//   setvbuf( stdout, NULL, _IONBF, 0 );
-
-//   // redirect unbuffered STDIN to the console
-//   lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
-//   hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
-
-//   fp = _fdopen( hConHandle, "r" );
-//   *stdin = *fp;
-
-//   setvbuf( stdin, NULL, _IONBF, 0 );
-
-//   // redirect unbuffered STDERR to the console
-//   lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
-//   hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
-
-//   fp = _fdopen( hConHandle, "w" );
-//   *stderr = *fp;
-//   setvbuf( stderr, NULL, _IONBF, 0 );
-
-//   // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
-//   // point to console as well
-//   //std::ios::sync_with_stdio();
-// }
-
-// ////////////////////////////////////////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////
-// ////////////////////////////////////////////////////////////////////////