Closing 2nd window in wxpython
Question: I am using the below full script to process quicktime files. While the file is
processing I am opening a 2nd window, which stays on top of all other windows,
which informs the user "Processing files. Please wait" (Settings Class at the
bottom of code), until the processing is finished, it should then close the
second window and return to the main window. At the moment it runs, but when
the file finishes processing, instead of closing the always on top window it
gives me the error:

    
    
      File "/Users/user1/Desktop/Python/File_Prrep.py", line 501, in __init__
        self.Close()
      File "/usr/local/lib/wxPython-3.0.0.0/lib/python2.7/site-packages/wx-3.0-osx_cocoa/wx/_core.py", line 9169, in Close
        return _core_.Window_Close(*args, **kwargs)
    TypeError: in method 'Window_Close', expected argument 1 of type 'wxWindow *'
    

I am not sure how to fix it. Here's my full code:

    
    
    import wx
    import os
    import os.path
    import inspect
    import csv
    import subprocess
    import sys
    import shutil
    import re
    import urllib2
    import threading
    import wx.lib.agw.pybusyinfo as PBI
    from subprocess import Popen, PIPE
    
    class ScrolledWindow(wx.Frame):
        def __init__(self, parent, id, title):
            wx.Frame.__init__(self, parent, id, title, size=(510, 370), style=wx.DEFAULT_FRAME_STYLE & ~ (wx.RESIZE_BORDER | 
                                                    wx.RESIZE_BOX | 
                                                    wx.MAXIMIZE_BOX))
    
            self.tabbed = wx.Notebook(self, -1, style=(wx.NB_TOP))
    
            run_params = {}
            run_params["dropList1"] = ['HD 1920x1080', 'PAL 4x3', 'PAL 16x9', 'NTSC 4x3', 'NTSC 16x9']
            run_params["dropList2"] = ['Progressive', 'Interlaced']
            run_params["running"] = False
            run_params["1stRun"] = True
    
            self.CreateStatusBar()
            menuBar = wx.MenuBar()
            menu = wx.Menu()
            self.SetMenuBar(menuBar)
            panel = wx.Panel(self, -1)
    
            self.Centre()
            self.Show()
    
            self.filePrep = PrepFile(self.tabbed, run_params)
            self.settings = Settings('settings', run_params)
    
            self.tabbed.AddPage(self.filePrep, "File Prep")
    
    class PrepFile(wx.Panel):
        def __init__(self, parent, run_params):
            wx.Panel.__init__(self, parent)
    
            self.run_params = run_params
            self.fieldChoice = 'Progressive'
            self.formatOption = 'HD 1920x1080'
    
            outputOption = '''Format'''
            wx.StaticText(self, -1, outputOption, (33, 22), style=wx.ALIGN_CENTRE)
    
    
            self.choice1 = wx.Choice(self, pos=(35, 40), choices=self.run_params["dropList1"])
            self.choice1.SetSelection(0)
            self.choice1.SetFocus()
            self.choice1.Bind(wx.EVT_CHOICE, self.selectOption)
    
            fieldSetText = '''Fields'''
            wx.StaticText(self, -1, fieldSetText, (33, 82), style=wx.ALIGN_CENTRE)
    
            self.choice2 = wx.Choice(self, pos=(35, 100), choices=self.run_params["dropList2"])
            self.choice2.SetSelection(0)
            self.choice2.SetFocus()
            self.choice2.Bind(wx.EVT_CHOICE, self.fieldSet)
    
            self.buttonClose = wx.Button(self, -1, "Quit", pos=(195, 250))
            self.buttonClose.Bind(wx.EVT_BUTTON, self.OnClose)
    
            greyBox = wx.StaticBox(self, -1, '', pos=(20, 15), size=(235, 130))
    
            outputtxt3 = '''Drag and Drop Quicktimes'''
            wx.StaticText(self, -1, outputtxt3, pos=(35, 170), style=wx.ALIGN_CENTRE)
    
            self.drop_target = MyFileDropTarget(self)
            self.SetDropTarget(self.drop_target)
            self.tc_files = wx.TextCtrl(self, wx.ID_ANY, pos=(38, 190), size=(200, 25))
            self.buttonSubmit = wx.Button(self, -1, "Submit", pos=(250,190))
            self.buttonSubmit.Bind(wx.EVT_BUTTON, self.submit)
    
    
        def EvtRadioBox(self, event):
            self.mode = (event.GetString())
    
        def selectOption(self, e):
            self.formatOption = self.choice1.GetStringSelection()
    
        def fieldSet(self, e):
            self.fieldChoice = self.choice2.GetStringSelection()
    
        def setSubmissionDrop(self, dropFiles):
            """Called by the FileDropTarget when files are dropped"""
            self.tc_files.SetValue(','.join(dropFiles))
            self.selectedFiles = dropFiles
            print self.selectedFiles
    
        def submit(self, edit):
            self.run_params["running"] = True
            self.run_params["1stRun"] = False
            Settings(None, self.run_params)
            for item in self.selectedFiles:
                if os.path.isdir(item):
                    for root, dirs, files in os.walk(item):
                        for file1 in files:
                            if file1.endswith(".mov"):
                                currentFile = os.path.join(root, file1)
                                self.jesFile(currentFile)
                else:
                    if item.endswith(".mov"):
                        self.jesFile(item)
            self.run_params["running"] = False
            Settings(None, self.run_params)
    
        def OnClose(self, e):
            CloseApp()
    
        def jesFile(self, currentFile):
            if self.fieldChoice == "Interlaced":
                if self.formatOption == 'HD 1920x1080':
                    self.preset = 'HD 1080i'
                elif self.formatOption == 'PAL 4x3':
                    self.preset = 'PAL 4x3i'
                elif self.formatOption == 'PAL 16x9':
                    self.preset = 'PAL 16x9i'
                elif self.formatOption == 'NTSC 4x3':
                    self.preset = 'NTSC 4x3i'
                elif self.formatOption == 'NTSC 16x9':
                    self.preset = 'NTSC 16x9i'
            else:
                if self.formatOption == 'HD 1920x1080':
                    self.preset = 'HD 1080p'
                elif self.formatOption == 'PAL 4x3':
                    self.preset = 'PAL 4x3p'
                elif self.formatOption == 'PAL 16x9':
                    self.preset = 'PAL 16x9p'
                elif self.formatOption == 'NTSC 4x3':
                    self.preset = 'NTSC 4x3p'
                elif self.formatOption == 'NTSC 16x9':
                    self.preset = 'NTSC 16x9p'
    
            print self.preset
            jesCommand = './JES/JES\ Extensifier.app/Contents/MacOS/JES\ Extensifier   -p   ' + '"' + self.preset + '"' + '   ' + '"' + currentFile + '"'
            print jesCommand
            self.process1 = Popen(jesCommand, shell=True, stdin=PIPE)
            self.assignAudio(currentFile)
    
        def assignAudio(self, currentFile):
            changeScript = '''
                on run argv
                    repeat with a in argv
                        set a's contents to a as POSIX file as alias
                    end repeat
                    open argv
                end run
    
                on open aa
                    set channel_layouts_map1 to {¬
                        {"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
                        {"Sound Track 2", "Sound Track 2", {"Right"}}, ¬
                        {"Sound Track 3", "Sound Track 3", {"Center"}}, ¬
                        {"Sound Track 4", "Sound Track 4", {"LFE Screen"}}, ¬
                        {"Sound Track 5", "Sound Track 5", {"Left Surround"}}, ¬
                        {"Sound Track 6", "Sound Track 6", {"Right Surround"}}, ¬
                        {"Sound Track 7", "Sound Track 7", {"Left Total"}}, ¬
                        {"Sound Track 8", "Sound Track 8", {"Right Total"}} ¬
                            }
                    set channel_layouts_map2 to {¬
                        {"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
                        {"Sound Track 2", "Sound Track 2", {"Right"}}, ¬
                        {"Sound Track 3", "Sound Track 3", {"Center"}}, ¬
                        {"Sound Track 4", "Sound Track 4", {"LFE Screen"}}, ¬
                        {"Sound Track 5", "Sound Track 5", {"Left Surround"}}, ¬
                        {"Sound Track 6", "Sound Track 6", {"Right Surround"}}, ¬
                        {"Sound Track 7", "Sound Track 7", {"Left Total", "Right Total"}} ¬
                            }
                    set channel_layouts_map3 to {¬
                        {"Sound Track", "Sound Track", {"Left", "Right"}} ¬
                            }
                    set channel_layouts_map4 to {¬
                        {"Sound Track 1", "Sound Track 1", {"Left"}}, ¬
                        {"Sound Track 2", "Sound Track 2", {"Right"}} ¬
                            }
    
                    repeat with a in aa
                        set f to a's POSIX path
                        set k to count_sound_tracks(f, {_close:false})
                        if k = 8 then
                            remap_audio_channels(f, channel_layouts_map1)
                        else if k = 7 then
                            remap_audio_channels(f, channel_layouts_map2)
                        else if k = 1 then
                            remap_audio_channels(f, channel_layouts_map3)
                        else if k = 2 then
                            remap_audio_channels(f, channel_layouts_map4)
                        else
                            -- ignore it (just close it)
                            close_document(f, {_save:false})
                        end if
                    end repeat
                end open
    
                on count_sound_tracks(f, {_close:_close})
                    tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
                        open (f as POSIX file)
                        tell (document 1 whose path = f)
                            repeat until exists
                                delay 0.2
                            end repeat
                            set k to count (tracks whose audio channel count > 0)
                            if _close then close
                        end tell
                    end tell
                    return k
                end count_sound_tracks
    
                on close_document(f, {_save:_save})
                    tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
                        tell (document 1 whose path = f)
                            if exists then
                                if _save and modified then save
                                close
                            end if
                        end tell
                    end tell
                end close_document
    
                on remap_audio_channels(f, channel_layouts_map)
                    script o
                        property map : channel_layouts_map
                        property pp : {}
                        property qq : {}
    
                        -- get name and id of sound tracks
                        tell application id "com.apple.quicktimeplayer" -- QuickTime Player 7 Pro
                            activate
                            open (f as POSIX file)
                            tell (document 1 whose path = f)
                                repeat until exists
                                    delay 0.2
                                end repeat
                                tell (tracks whose audio channel count > 0)
                                    set {pp, qq} to {name, id} -- name and id of sound tracks
                                end tell
                            end tell
                        end tell
    
                        -- remap audio channel layouts as specified
                        tell application "System Events"
                            tell (process 1 whose bundle identifier = "com.apple.quicktimeplayer")
                                -- open movie properties window
                                keystroke "j" using {command down}
    
                                tell (window 1 whose subrole = "AXDialog") -- properties for movie
                                    repeat until exists
                                        delay 0.2
                                    end repeat
                                    repeat with m in my map
                                        set {trk, undef, layouts} to m
                                        -- [TRK:
                                        repeat 1 times
                                            if trk's class = integer then
                                                if trk < 1 or trk > (count my pp) then exit repeat -- TRK:
                                                set trk to my pp's item trk
                                            end if
                                            tell scroll area 1
                                                tell table 1
                                                    tell (row 1 whose text field 1's value = trk) -- target sound track whose name = trk
                                                        if not (exists) then exit repeat -- TRK:
                                                        select
                                                    end tell
                                                end tell
                                            end tell
                                            tell tab group 1
                                                click radio button 3 -- audio settings
                                                tell scroll area 1
                                                    tell table 1 -- channel assignment table
                                                        set ix to count layouts
                                                        repeat with i from 1 to count rows
                                                            if i > ix then exit repeat
                                                            tell row i -- channel i
                                                                tell pop up button 1
                                                                    click
                                                                    tell menu 1 -- channel assignment menu
                                                                        tell (menu item 1 whose title = layouts's item i)
                                                                            if exists then click
                                                                        end tell
                                                                    end tell
                                                                end tell
                                                            end tell
                                                        end repeat
                                                    end tell
                                                end tell
                                            end tell
                                        end repeat
                                        -- /TRK:]
                                    end repeat
    
                                    -- close movie properties window
                                    click (button 1 whose subrole = "AXCloseButton")
                                end tell
                            end tell
                        end tell
    
                        -- rename sound tracks as specified
                        tell application id "com.apple.quicktimeplayer"
                            set scale of document 1 to normal
                            tell document 1
                                repeat with m in my map
                                end repeat
                                if modified then save
                                close
                            end tell
                        end tell
    
                    end script
    #                tell o to run
                    run script o
                end remap_audio_channels
    
                on _index_of(xx, x) -- renamed _bsearch() v0.1
                    script o
                        property aa : xx
                        local i, j, k
                        if {x} is not in my aa then return 0
                        set i to 1
                        set j to count my aa
                        repeat while j > i
                            set k to (i + j) div 2
                            if {x} is in my aa's items i thru k then
                                set j to k
                            else
                                set i to k + 1
                            end if
                        end repeat
                        return i
                    end script
                    tell o to run
                end _index_of'''
    
            p = Popen(['osascript', '-'] + [currentFile], stdin=PIPE, stdout=PIPE, stderr=PIPE)
            stdout, stderr = p.communicate(changeScript)
            print (p.returncode, stdout, stderr)
            print "Done"
    
    class MyFileDropTarget(wx.FileDropTarget):
        """"""
        def __init__(self, window):
            wx.FileDropTarget.__init__(self)
            self.window = window
    
        def OnDropFiles(self, x, y, filenames):
            self.window.setSubmissionDrop(filenames)
    
    class CloseApp(wx.Frame):
        def __init__(e):
            sys.exit(0)
    
    class Settings(wx.Frame):
        def __init__(self, parent, run_params):
            self.run_params = run_params
            if self.run_params["running"] == True:
                wx.Frame.__init__(self, parent, -1, 'Please Wait', size=(350,150), pos=(35, 100), style=wx.STAY_ON_TOP | wx.DEFAULT_FRAME_STYLE)
                wx.StaticText(self, -1, "Processing files. Please wait", style=wx.ALIGN_CENTRE)
                self.Centre()
                self.Show()
            else:
                if self.run_params["1stRun"] != True:
                    self.Close()
    
    app = wx.App()
    ScrolledWindow(None, -1, 'iTunes Quicktime File Prep')
    app.MainLoop()
    


Answer: You are trying to close the settings window in the constructor. You can't do
that as the window does not even exist at that point.

Modify your settings class to _not_ do this:

    
    
    class Settings(wx.Frame):
        def __init__(self, parent, run_params):
            self.run_params = run_params
            if self.run_params["running"] == True:
                wx.Frame.__init__(self, parent, -1, 'Please Wait', size=(350,150), pos=(35, 100), style=wx.STAY_ON_TOP | wx.DEFAULT_FRAME_STYLE)
                wx.StaticText(self, -1, "Processing files. Please wait", style=wx.ALIGN_CENTRE)
                self.Centre()
                self.Show()
    
        def OnClose(self):
            if self.run_params["running"] == False:
                self.Close()
    

