Reputation: 3205
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()
Upvotes: 0
Views: 653
Reputation: 2334
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()
Upvotes: 1