Re: a wxPython script that behaves like a CE application

"Matt S." <[email protected]>
Newsgroups gmane.comp.python.windows-ce
Message-ID <[email protected]>
Hi,

So I now thankfully have a simple wxPython script that creates a frame,
etc...  Now I want it to act like a well-behaved CE application.
Ultimately, I'd like to post it to the wiki (at least as a hack).   Hope the
formatting in this email comes through alright!  Any help is greatly
appreciated.

>From what I've learned recently, I want the script to:

   1. start up the program without a shell, [see "\nopcceshell" registry
   arg]
   2. and a simple tap on a unique icon for the program from the Start >
   Programs menu, Task bar, or File Explorer, etc. [make a shortcut in
   "\Windows\Start Menu\Programs"]
   3. be minimized by the Smart Close button [no problem here]
   4. then be uniquely iconized to the Start/Task Menu [sort of
   accomplished by #2]
   5. and finally be brought forward again (maximized) when either the
   user again clicks on the Task menu (or any other shortcut to the script)
   [use win32gui.SetForegroundWindow(hwnd)]
   6. (for now, trying to keep it simple, I'm not going to worry about
   the hibernation, memory events that could cause spurious problems)
   [wxEVT_ACTIVATE, etc.]

I'm attaching the following script which almost accomplishes (5).  How to
accomplish (1-4) can be pieced together elsewhere.  The main problem the
script now has are:

   - if "\nopcceshell" is used, the busy clock persists [previous post
   but in example] but the running script is brought forward as expected.
   - if the pcceshell is used, and one calls
   [_pcceshell_support.Busy(0)], then the call on line 31, [frame_class =
   win32gui.GetClassName(frame.GetHandle())], returns the PythonCE shell
   and not the frame of the script.

Best regards,
Matt

PS: In case the attachment gets scrubbed, simple_ce.py:

import sys #, os, os.path, time
> import win32gui
>
> window_handle_file = 'window_handle.txt'
>
> def buildUI(window_handle_file):
>     # Write a file to save the window handle info
>     f = open(window_handle_file, 'wb')
>
>     # Start building the interface...
>     import wx
>
>     class SingleAppFrame(wx.Frame):
>         def __init__(self,parent,id,title):
>             wx.Frame.__init__(self,parent,-1, title, size = ( 300, 300))
>             self.Centre()
>
>     class SingleApp(wx.App):
>         def OnInit(self):
>     ##       Not implemented for PPC?
>     #        name = "SingleApp-%s" % (wx.GetUserId())
>     ##        self.name = "SingleApp-%s" % (wx.GetUserId())
>     #        self.instance = wx.SingleInstanceChecker(name)
>     #        if self.instance.IsAnotherRunning():
>     #            wx.MessageBox("Another instance is running", "ERROR")
>     #            return False
>             frame = SingleAppFrame(None, -1, "SingleApp")
>
>             frame.Show()
>             # Now get the window handle of the frame.
>             frame_class = win32gui.GetClassName(frame.GetHandle())
>             print frame_class
>             active_window = frame.GetHandle()
>             f.write(str(active_window))
>             f.close()
>             return True
>
>     app = SingleApp(redirect=False)
>     app.MainLoop()
>
>
> if sys.platform == 'win32':
>     pass
> elif sys.platform == 'Pocket PC':
>     # This gets rid of annoying pin/progress wheel. ala Luke.
>     try:
>         import _pcceshell_support
>     except ImportError:
>         pass
>     else:
>         _pcceshell_support.Busy(0)
> else:
>     print 'This operating system (%s) is not recognized.'%(sys.platform)
>
> try:
>     f = open(window_handle_file, 'rb')
>     #f.write('win32gui\n')
>     #SW_MAXIMIZE
>     #win32gui.GetClassName(frame.GetHandle())
>     if sys.platform == 'win32':
>         # If Window is minimized, this will maximize it.
>         window = win32gui.FindWindow('wxWindowClassNR', 'SingleApp')
>         window = win32gui.SetForegroundWindow(window)#'SW_MAXIMIZE')
> #        window = win32gui.ShowWindow(window, 1)#'SW_MAXIMIZE')# This
> doesn't set the window to the foreground.
>         print window
>     else:
>         ##########################################
>         # Unfortunately, when I use the following to bring the
>         # frame forward, I instead get the pcceshell (labeled PythonCE)
> shell.
>         # If I don't use the pcceshell, by altering the registry with,
>         # \nopcceshell,
>         # Then I get the busy clock and the frame window that I want!
>         ##########################################
>         hwnd = int(f.readline())
>         print hwnd
>         window = win32gui.SetForegroundWindow(hwnd)#'SW_MAXIMIZE')
>
>         ## Just other options but not exactly what I wanted.
>         #window = win32gui.SetForegroundWindow(window)#'SW_MAXIMIZE')
>
>         #window = win32gui.FindWindow('PythonClassNameNR', 'SingleApp')
>         #window = win32gui.ShowWindow(hwnd, 1)#window, 1)#'SW_MAXIMIZE')
>         #win32gui.SetActiveWindow(hwnd)#window, 1)#'SW_MAXIMIZE')
>
>     # Now, if the window was successfully shown, we'll be done here.
>     # Otherwise, fire up the app...
>     if window == 0: # Will be zero if window not brought to foreground.
>         'No window available, re-starting app'
>     else:
>         print 'The app should be visible!'
> except:
>
>     buildUI(window_handle_file)
>

On 2/26/07, Matt S. <[email protected]> wrote:
>
>
> Regarding new info I have about solving this problem,
>
> I'm thinking I either need to implement a WindowProc function that
> processes messages sent to the window,
>
>
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windowprocedures/windowprocedurereference/windowprocedurefunctions/windowproc.asp
>
> or, hope that the WS_NONAVDONEBUTTON gets supported by wx and then ported
> to the PPC (or learn to compile, etc. myself),
>
> http://msdn2.microsoft.com/en-us/library/aa458799.aspx
>
>
>
> On 2/23/07, Luke Dunstan <[email protected]> wrote:
> >
> >  As with any Pocket PC application (written in Python or otherwise), the
> > X "close" button merely hides a window and does not destroy it. The Pocket
> > PC platform is intended so that users don't need to "close" applications as
> > such, and if you open enough other applications that the memory starts to
> > become full, the OS will actually close (WM_CLOSE) some of the applications
> > that were hidden in the background. If you try clicking the X button on
> > any of the Microsoft's Pocket PC applications, e.g. Pocket Word, and
> > then look in the task manager you will notice that it is still running.
> >
> > You may be able to capture the event as WM_SHOWWINDOW.
> >
> > As with any Python program on the PC, your script is not a process but
> > is just a text file that is interpreted by the python.exe process.
> >
> > Luke
> >
> >
> > ----- Original Message -----
> >  *From:* Matt S. <[email protected]>
> > *To:* [email protected]
> > *Sent:* Thursday, February 22, 2007 2:12 PM
> > *Subject:* [PythonCE] wxPython, handling close events
> >
> >

_______________________________________________
PythonCE mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pythonce
simple_ce.py (text/x-python, 3.4 KB)
import sys #, os, os.path, time
import win32gui

window_handle_file = 'window_handle.txt'

def buildUI(window_handle_file):
    # Write a file to save the window handle info
    f = open(window_handle_file, 'wb')
    
    # Start building the interface...
    import wx
    
    class SingleAppFrame(wx.Frame):
        def __init__(self,parent,id,title):
            wx.Frame.__init__(self,parent,-1, title, size = ( 300, 300))
            self.Centre()    
    
    class SingleApp(wx.App):
        def OnInit(self):
    ##       Not implemented for PPC?
    #        name = "SingleApp-%s" % (wx.GetUserId())
    ##        self.name = "SingleApp-%s" % (wx.GetUserId())
    #        self.instance = wx.SingleInstanceChecker(name)
    #        if self.instance.IsAnotherRunning():
    #            wx.MessageBox("Another instance is running", "ERROR")
    #            return False
            frame = SingleAppFrame(None, -1, "SingleApp")
            
            frame.Show()
            # Now get the window handle of the frame.  
            frame_class = win32gui.GetClassName(frame.GetHandle())
            print frame_class
            active_window = frame.GetHandle()
            f.write(str(active_window))
            f.close()
            return True
    
    app = SingleApp(redirect=False)
    app.MainLoop()
    

if sys.platform == 'win32':
    pass
elif sys.platform == 'Pocket PC':
    # This gets rid of annoying pin/progress wheel. ala Luke.
    try:
        import _pcceshell_support
    except ImportError:
        pass
    else:
        _pcceshell_support.Busy(0)
else:
    print 'This operating system (%s) is not recognized.'%(sys.platform)

try:
    f = open(window_handle_file, 'rb')
    #f.write('win32gui\n')
    #SW_MAXIMIZE
    #win32gui.GetClassName(frame.GetHandle())
    if sys.platform == 'win32':
        # If Window is minimized, this will maximize it.
        window = win32gui.FindWindow('wxWindowClassNR', 'SingleApp')
        window = win32gui.SetForegroundWindow(window)#'SW_MAXIMIZE')
#        window = win32gui.ShowWindow(window, 1)#'SW_MAXIMIZE')# This doesn't set the window to the foreground.
        print window
    else:
        ##########################################
        # Unfortunately, when I use the following to bring the 
        # frame forward, I instead get the pcceshell (labeled PythonCE) shell.
        # If I don't use the pcceshell, by altering the registry with,
        # \nopcceshell,
        # Then I get the busy clock and the frame window that I want!
        ##########################################
        hwnd = int(f.readline())
        print hwnd
        window = win32gui.SetForegroundWindow(hwnd)#'SW_MAXIMIZE')

        ## Just other options but not exactly what I wanted.
        #window = win32gui.SetForegroundWindow(window)#'SW_MAXIMIZE')        
        #window = win32gui.FindWindow('PythonClassNameNR', 'SingleApp')
        #window = win32gui.ShowWindow(hwnd, 1)#window, 1)#'SW_MAXIMIZE')
        #win32gui.SetActiveWindow(hwnd)#window, 1)#'SW_MAXIMIZE')

    # Now, if the window was successfully shown, we'll be done here.
    # Otherwise, fire up the app...
    if window == 0: # Will be zero if window not brought to foreground.
        'No window available, re-starting app'
    else:
        print 'The app should be visible!'  
except:

    buildUI(window_handle_file)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.