Hi Again,
    I noticed I had not set the engines and how they are created. So before the 
Ini procedures I placed the creation of the engines in Python. I could add the 
Command Line Switches but will just focus on the INI files.
I am sure you had noticed but will mention it, the Try statement is the Python 
error trap and will catch the error and you can write in the Exception if there 
is an error.
Also the : is used for all statements to end the line of the statement.
The print statement just places text on the screen and produces a new line as 
well after the text.

Original:
Below is the Sea Battle game ini construction.
I have included in this how voices are stored and selected.
In Python arrays and dictionairies have [Val] {Key:Val} as constructs 
respectively. Both can be empty to place them into the memory table.
Comments always start with the # sign.
Functions and Procedures start with the key word def and that header lline ends 
always with a :.
Remember that Python divides statements based in indent level and you can do 
your own margin amount as long as you are consistent.
Globals are first as in most languages and like Visual Basic you have to import 
definitions and they are called modules in Python and you use the name import 
to get them or part of them and the module file name can be removed by just 
asking for what inside that module as long as you know the names inside the 
module of each function/procedure/variable...
You do this by using the key word From.
Also you can get a complete list of a type by using * to get them all.

#Global Section:
# Load Modules
import pygame
from pygame.locals import *
from pygame.event import Event
import random, sys, os
import time
from math import *
#import pyTTS
from win32com.client import constants
import win32com.client
import BattleSapi5
import ConfigParser
IniConfig = ConfigParser
from win32api import GetProfileSection
GetIniSection = GetProfileSection
#Below Reduces Name Size In Program and Generates Needed 3'rd Applications For 
Compiling .exe Files.
from comtypes.client import CreateObject
# Fetch Generated Speech:
try:
    from comtypes.gen import WindowEyes
except:
    print " Windoweyes Not Generated Yet "
try:
    from comtypes.gen import SpeechLib
except:
    print " Speech Lib Not Generated Yet "
#Fix for no video device on XP machines placed in as Pygame 1.9.1 bug fix.
os.environ['SDL_VIDEODRIVER']='windib'

#Set up video display:
pygame.init()
screenMode = pygame.display.set_mode((640,480))

#Variables and dictionairies
#Note: Dictionairy pairs are {key:value} or {another dictionary...}}

SapiPlayerVoice = {"v": 0, "rl": 1, "pl": 2, "vl": 75}
SapiComputerVoice = {"v": 1, "rl": 2, "pl": 4, "vl": 75}
SapiPlayer2Voice = {"v": 0, "rl": 2, "pl": 2, "vl": 75}
WePlayerVoice = {"v": "L", "rl": 62, "pl": 4, "vl": 6}
WeComputerVoice = {"v": "K", "rl": 62, "pl": 4, "vl": 6}
WePlayer2Voice = {"v": "S", "rl": 62, "pl": 4, "vl": 6}
WeScreenVoice = {"v": "L", "rl": 62, "pl": 4, "vl": 6}
myIniFile = "SeaBattle.ini" #"SeaBattle2015.ini"
PlayerDict = {"s": "Player", "c": "Computer", "p": "Player2"}

WeTtsDict = {"INI": myIniFile, NAME4GAME_PLAYLIST: {}, NAME4JUKEBOX_PLAYLIST: 
{}, "Org": WeScreenVoice, 
    "Player": {"SAPI": SapiPlayerVoice, "WE": WePlayerVoice}, 
    "Computer": {"SAPI": SapiComputerVoice, "WE": WeComputerVoice}, 
    "Player2": {"SAPI": SapiPlayer2Voice, "WE": WePlayer2Voice}, 
    "IniSection":{}}

#Now Create The voices:
#Dictionary to store all parms for the Ini File:
WeTtsDict[ "IniSection"] = {"Hotkeys": {}, "Configuration": {}, 
NAME4GAME_PLAYLIST: {}, NAME4JUKEBOX_PLAYLIST: {}, "Player": {}, "Computer": 
{}, "Player2": {}}
#Voice Parms:
WeTts = 0
tts = 0
_PITCH = 0 #SAPI has no pitch.
_PUNC = 0 #SAPI punctuation is 64 for on.
WeVoices = False
INIFile = 0
#Set Windoweyes voice parameter defaults:
# Below is the Windoweyes application model under the object model list:
try:
    WeTts = CreateObject( "windoweyes.application")
    #Below does not generate a Windoweyes module:
#    WeTts = win32com.client.Dispatch("WindowEyes.Application")
    WeScreenVoice = {"v": WeTts.ActiveSettings.Screen.Tone, "rl": 
WeTts.ActiveSettings.Screen.Rate, "pl": WeTts.ActiveSettings.Screen.Pitch, 
"vl": WeTts.ActiveSettings.Screen.Volume}
    WeTtsDict[ "Org"] = WeScreenVoice
    WeVoices = True
    weVersion = WeTts.Version
#    WeTts.Speech.Speak (" The version of we is: %s For BattleShip Game" % 
weVersion)
    INIFile = WeTts.INIFile( myIniFile)
except:
    print
    print "Error!"
    print " No Windoweyes Voice Engine!"
    print
#    Time2Wait(3)

#Below does not compile, it is a Python version of speech.
#tts = pyTTS.Create()
# Below works but using my sapi module because
#Below does not genreate SAPI Python module:
try:
#    tts = win32com.client.Dispatch("SAPI.SpVoice") #, constants.SVSFlagsAsync)
    pass
except:
    print "SAPI Engine Dispatch Error!"
# Use my BattleSapi 5 module instead:
SapiVoices = False
try:
    tts = BattleSapi5.SynthDriver()
    tts.init()
    SYNC = tts._sync
    ASYNC = tts._async
    PURGE = tts._purge
    ISAFILE = tts._is_filename
    XML = tts._xml
    NOT_XML = tts._not_xml
    PERSIST = tts._persist_xml
    PUNC = tts._punc
    WAIT = tts._wait
    tts.setVolume( 100)
    tts.setRate( 1)
    SapiVoices = True
except:
    print
    print "Error!"
    print " No SAPI Voice Engine!"
    print
    SYNC = 0
    ASYNC = 1
    PURGE = 2
    PUNC = 64
#    Time2Wait(3)

#Save engine flags:
WeTtsDict[ "weVoices"] = WeVoices
WeTtsDict[ "sapiVoices"] = SapiVoices
WeTtsDict[ "TTS4WE"] = WeTts
WeTtsDict[ "iniFile"] = INIFile
WeTtsDict[ "TTS4SAPI"] = tts

def SetIniData( section, key, val, gameDict):
   "Set Section, Key, Value In Ini File."
   try:
       gameDict[ "IniOutput"].set( section, key, val)
   except:
       gameDict[ "IniOutput"].add_section( section)
       gameDict[ "IniOutput"].set( section, key, val)
   #Save In Configuration File:
   with open( gameDict[ "INI"], 'w') as configfile:
       gameDict[ "IniOutput"].write( configfile)

def GetIniData( gameDict):
    "Get All Ini Data!"
    iniFileName = gameDict[ "INI"]
    iniConfig = gameDict[ "IniConfig"]
    iniInput = iniConfig.RawConfigParser()
    gameDict[ "IniInput"] = iniInput
    iniOutput = iniConfig.RawConfigParser()
    gameDict[ "IniOutput"] = iniOutput
    sArray = []
    #Note: Ini File must have exact path.
    #theIniFile = os.path.join( myDir, myFileName)
    try:
        iniInput.read( iniFileName)
        sArray = iniInput.sections()
    except:
        print " No INI Sections! "
        COLS4BOARD = DEFAULT4COLS
        SetIniData( "Configuration", "oceancolumns", COLS4BOARD, WeTtsDict)
        ROWS4BOARD = DEFAULT4ROWS
        SetIniData( "Configuration", "oceanrows", ROWS4BOARD, WeTtsDict)

#    gameDict[ "IniSection"] = {}
    for section in sArray:
        #Get All Section Names and Data:
        s2Array = GetIniSection( section, iniFileName)
        iniOutput.add_section( section)
        #Now Init Section Data:
        gameDict[ "IniSection"][ section] = {}
        for key in s2Array:
            #Now Save and Assign All Section Data Value Pairs:
            #print key
            s3Array = key.split( '=')
            iniOutput.set( section, s3Array[ 0], s3Array[ 1])
            try: #Save Key As Integer:
                gameDict[ "IniSection"][ section][ int( s3Array[ 0])] = 
s3Array[ 1]
            except: #Save Key As String:
                gameDict[ "IniSection"][ section][ s3Array[ 0]] = s3Array[ 1]
    #Finally Now Writing Our New Configuration File:
    with open( iniFileName, 'w') as configfile:
        iniOutput.write( configfile)

def SaveVoice( engine, name, gameDict):
    "SAVE THE VOICE SETTINGS IN THE INI FILE!"
    ve = "SAPI"; vc = "s"
    # We engine must exist to use ini file.
    #if gameDict[ "weVoices"]:
    if engine == "WE":
        ve = "WE"; vc = "w"
        SetIniData( name, "vw", gameDict[ name][ ve][ "v"], gameDict)
    else:
        SetIniData( name, "vs", gameDict[ name][ ve][ "v"], gameDict)
    SetIniData( name, "rl"+vc, gameDict[ name][ ve][ "rl"], gameDict)
    SetIniData( name, "pl"+vc, gameDict[ name][ ve][ "pl"], gameDict)
    SetIniData( name, "vl"+vc, gameDict[ name][ ve][ "vl"], gameDict)

def changePlayerVoice( engineType, player, gameDict):
    "CHANGE THE PLAYERS VOICE, PITCH, RATE, AND VOLUME!"
    global _PITCH
    engine = gameDict[ "TTS4" + engineType]
    v = gameDict[ player][ engineType][ "v"]
    r = gameDict[ player][ engineType][ "rl"]
    p = gameDict[ player][ engineType][ "pl"]
    vl = gameDict[ player][ engineType][ "vl"]
    try:
        if engineType == "WE":
            engine.ActiveSettings.Screen.Volume = vl
            engine.ActiveSettings.Screen.Tone = v
            engine.ActiveSettings.Screen.Rate = r
            engine.ActiveSettings.Screen.Pitch = p
        else:
            if engineType == "SAPI":
                _PITCH = p
                engine.setVoiceByNum( v)
                engine.setRate( r)
                engine.setVolume( vl)
    except: #pass
        print " \n Change Player Voice Error! \n "

def RestoreWeVoice( gameDict):
    "Restore Original Windoweyes Screen Voice."
    if gameDict[ "weVoices"]:
        gameDict[ "TTS4WE"].ActiveSettings.Screen.Tone = gameDict[ "Org"][ "v"]
        gameDict[ "TTS4WE"].ActiveSettings.Screen.Rate = gameDict[ "Org"][ "rl"]
        gameDict[ "TTS4WE"].ActiveSettings.Screen.Pitch = gameDict[ "Org"][ 
"pl"]
        gameDict[ "TTS4WE"].ActiveSettings.Screen.Volume = gameDict[ "Org"][ 
"vl"]
        gameDict[ "TTS4WE"].Speech.Speak( " Voice back to original voice ")
        #Created procedure using windoweyes TickCount
        Sleep( 1.0)
#        t = gameDict[ "TTS4WE"].TickCount

def VoiceAdjustment( gameDict, playerKey="s"):
    "Adjust All Voices."
    global WE_VOICE
    alphabetCaps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    voiceType = {1: "v", 2: "vl", 3: "rl", 4: "pl"}
    voiceDescription = {1: "Voice", 2: "Volume", 3: "Rate", 4: "Pitch"}
    voiceBoundaries = {"WE": {"v": {"h":25, "l":0}, 
        "vl": {"h":9, "l":0}, "rl": {"h":100, "l":0}, "pl": {"h":9, "l":0}}, 
        "SAPI": {"v": {"h":0, "l":0}, 
        "vl": {"h":100, "l":0}, "rl": {"h":9, "l":-9}, "pl": {"h":9, "l":-9}}}
    try:
        voiceBoundaries[ "SAPI"][ "v"][ "h"] = WeTtsDict[ 
"TTS4SAPI"].getVoiceCount() -1
    except: pass
    playerNum = {"s":1, "p":2, "c":3}
    playerType = {1: "s", 2: "p", 3: "c"}
    playerName = {1:" Player 1", 2:" Player 2", 3:" Computer "}
    engineName = {1: "Window Eyes", 2: "Windows SAPI"}
    engineType = {1: "WE", 2: "SAPI"}
    gamePlayerKey = playerKey
    player = playerNum[ playerKey]
    gameVoice = WE_VOICE
    engine = 2
    if WE_VOICE: engine = 1
    voiceEngine = engineType[ engine]
    voice = 1
    voiceKey = voiceType[ voice]
    Speak( " Adjust: %s, %s Voice " % (playerName[ player], engineName[ 
engine]))
    while True:
        event = pygame.event.poll()
        if event.type == pygame.QUIT:
            RestoreWeVoice( WeTtsDict)
            sys.exit()
            break
        elif event.type == pygame.KEYDOWN:
            key = event.key
            keymod = event.mod
            if key == K_ESCAPE:
                playerKey = gamePlayerKey
                WE_VOICE = gameVoice 
                SpeakNext( " Now Leaving Voice Settings ")
                break
            elif key in [K_LEFT, K_RIGHT, K_UP, K_DOWN]:
                if key == K_LEFT:
                    if WeVoices: engine = 1
                    else: SpeakNext(" No Window Eyes Voices ")
                elif key == K_RIGHT:
                    if SapiVoices: engine = 2
                    else: SpeakNext(" No Windows SAPI Voices ")
                elif key == K_UP:
                    player += 1
                else:
                    player -= 1
                if engine > 1:
                    engine = 2
                    WE_VOICE = False
                if engine < 2:
                    engine = 1
                    WE_VOICE = True
                voiceEngine = engineType[ engine]
                if player > 3: player = 3
                if player < 1: player = 1
                playerKey = playerType[ player]
                changePlayerVoice( voiceEngine, playerKey, gameDict)
                SpeakNext( " Adjust: %s, %s Voice " % (playerName[ player], 
engineName[ engine]))
            elif key == K_RETURN:
                changePlayerVoice( voiceEngine, playerKey, gameDict)
                SpeakNext( " Now Adjusting: %s Voice In: %s " % (playerName[ 
player], engineName[ engine]))
                while True:
                    event = pygame.event.poll()
                    if event.type == pygame.QUIT:
                        RestoreWeVoice( WeTtsDict)
                        sys.exit()
                        break
                    elif event.type == pygame.KEYDOWN:
                        key = event.key
                        keymod = event.mod
                        inc = 1
                        if voiceEngine == "SAPI" and voiceKey == "vl": inc = 5
                        if True: #try:
                            changePlayerVoice( voiceEngine, playerKey, gameDict)
                            val = gameDict[ playerKey][ voiceEngine][ voiceKey]
                            if voiceEngine == "WE" and voiceKey == "v": val = 
alphabetCaps.find( val)
                            else: val = int( val)
                            if key == K_ESCAPE or key == K_RETURN:
                                SpeakNext( " Adjust: %s Voice In: %s " % 
(playerName[ player], engineName[ engine]))
                                break
                            elif key in [K_LEFT, K_RIGHT, K_UP, K_DOWN]:
                                if key == K_LEFT:
                                    voice -= 1
                                elif key == K_RIGHT:
                                    voice += 1
                                elif key == K_UP:
                                    val += inc
                                else:
                                    val -= inc
                                if voice < 2: voice = 1
                                if voice > 3: voice = 4
                                voiceKey = voiceType[ voice]
                                if key == K_LEFT or key == K_RIGHT:
                                    val = gameDict[ playerKey][ voiceEngine][ 
voiceKey]
                                    if voiceEngine == "WE" and voiceKey == "v": 
val = alphabetCaps.find( val)
                                    else: val = int( val)
                                else:
                                    if val > voiceBoundaries[ voiceEngine][ 
voiceKey][ "h"]:
                                        val = voiceBoundaries[ voiceEngine][ 
voiceKey][ "h"]
                                    if val < voiceBoundaries[ voiceEngine][ 
voiceKey][ "l"]:
                                        val = voiceBoundaries[ voiceEngine][ 
voiceKey][ "l"]
                                    if voiceEngine == "WE" and voiceKey == "v":
                                        val = alphabetCaps[ val]
                                    gameDict[ playerKey][ voiceEngine][ 
voiceKey] = val
#                                     Speak( " Adjust: %s, %s Voice Val: %s " % 
(playerName[ player], engineName[ engine], str(val)))
                                    if voiceEngine == "SAPI":
                                        if val == voiceBoundaries[ 
voiceEngine][ voiceKey][ "l"] and voiceKey == "vl":
                                            WeTtsDict[ "TTS4SAPI"].setVolume( 
100)
                                            SpeakNext( ' Volume %d, Minimum!' % 
val)
                                    gameDict[ playerKey][ voiceEngine][ 
voiceKey] = val
                                changePlayerVoice( voiceEngine, playerKey, 
gameDict)
                                SpeakNext(' %s %s' % (voiceDescription[ voice], 
gameDict[ playerKey][ voiceEngine][ voiceKey]))
#                        except: SpeakNext( " %s Error! " % voiceKey); pass

def SavePlayList( spk, playListName, gameDict, playList):
    "Save IniFile Specified Play List."
    SpeakNext( " Now Saving: %s Ini File Play List " % spk)
#    print " Now Saving: %s Play List " % spk
    total = playList[ "t"] 
    pos = playList[ "p"] 
    vol = str( playList[ "v"]) #Note: Below IniFile Numbers Are Integer Only.
    SetIniData( playListName, "t", total, gameDict)
    gameDict[ "IniSection"][ playListName][ "t"] = total
    SetIniData( playListName, "p", pos, gameDict)
    gameDict[ "IniSection"][ playListName][ "p"] = pos
    #Note: Below is not an integer so it has to be saved as text.
    SetIniData( playListName, "v", vol, gameDict)
    gameDict[ "IniSection"][ playListName][ "v"] = vol
    for sKey in range(1, total+1):
        print " Tot: %d Key: %d \n List: %s \n Name: %s FilePath: \n%s \n 
Repeats: %s " % (total, sKey, playListName, playList[ sKey][ "n"], playList[ 
sKey][ "f"], str( 

playList[ sKey][ "r"]))
        sData = playList[ sKey][ "n"] + '~' + playList[ sKey][ "f"] + '~' + 
str( playList[ sKey][ "r"])
        #Note: Keys in Config must be text:
        SetIniData( playListName, str( sKey), sData, gameDict)
        gameDict[ "IniSection"][ playListName][ sKey] = sData

def GetPlayList( playListName, gameDict):
    "Get IniFile Specified Play List."
    playError = False
    playList = {}
    try:
        total = int( gameDict[ "IniSection"][ playListName][ "t"])
#        print " Name: %s Total: %d" % (playListName, total)
    except: total = 0
    try:
        if total < 1:
#            print " total2: %d " % total
            if playListName == NAME4JUKEBOX_PLAYLIST:
                total = gameDict[ NAME4JUKEBOXDEFAULTS][ "t"]
            else:
                total = gameDict[ NAME4BACKGROUNDDEFAULTS][ "t"]
            if total > 0:
                if playListName == NAME4JUKEBOX_PLAYLIST:
                    SavePlayList( playListName, playListName, gameDict, 
DEFAULTLIST4JUKEBOX)
                else:
                    SavePlayList( playListName, playListName, gameDict, 
DEFAULTLIST4BACKGROUND)
#            print " total2E: %d " % total
#        print " Name2: %s Total: %d" % (playListName, total)
        if total < 1: playError = True
    except: print " Play List Error! " #playError = True
    if playError:
        total = 1
        playList[ "t"] = total
        playList[ 1] = {"n":"", "f":"", "r":"0"}
        playList[1][ "n"] = "SummerDay"
        playList[1][ "f"] = os.path.join( FOLDER4BACKGROUND_PLAYLIST, 
"SummerDay.ogg")
        playList[1][ "r"] = "0"
        SavePlayList( playListName, playListName, gameDict, playList)
#    print " Play Total: %d Error: %s " % (total, playError)
    playList[ "t"] = int( gameDict[ "IniSection"][ playListName][ "t"])
    playList[ "p"] = int( gameDict[ "IniSection"][ playListName][ "p"])
    playList[ "v"] = float( gameDict[ "IniSection"][ playListName][ "v"])
#    print " t: %d p: %d v: %1.1f \n" % (playList[ "t"], playList[ "p"], 
playList[ "v"])
    for sKey in range(1, total+1):
        sData = "No Name~No Path~0"
        #Note: All Config Ini Keys Are Text: Change To Integer.
        sData = gameDict[ "IniSection"][ playListName][ sKey]
        sArray = sData.split( '~')
        playList[ sKey] = {"m": 0, "n": sArray[ 0], "f": sArray[ 1], "r": 
sArray[ 2]}
    gameDict[ playListName] = playList

def getIniVoices( name, gameDict):
    "GET THE VOICE SETTINGS FROM THE INI FILE."
    # We engine must exist to use ini file.
#    if talkDict[ "weVoices"]:
    #Using Windows .ini Instead:
    try:
        if name in gameDict[ "IniSection"]:
            gameDict[ name][ "WE"][ "v"] = gameDict[ "IniSection"][ name][ "vw"]
            gameDict[ name][ "WE"][ "rl"] = int( gameDict[ "IniSection"][ 
name][ "rlw"])
            gameDict[ name][ "WE"][ "pl"] = int( gameDict[ "IniSection"][ 
name][ "plw"])
            gameDict[ name][ "WE"][ "vl"] = int( gameDict[ "IniSection"][ 
name][ "vlw"])
            gameDict[ name][ "SAPI"][ "v"] = int( gameDict[ "IniSection"][ 
name][ "vs"])
            gameDict[ name][ "SAPI"][ "rl"] = int( gameDict[ "IniSection"][ 
name][ "rls"])
            gameDict[ name][ "SAPI"][ "pl"] = int( gameDict[ "IniSection"][ 
name][ "pls"])
            gameDict[ name][ "SAPI"][ "vl"] = int( gameDict[ "IniSection"][ 
name][ "vls"])
    except:
        print "\n %s Ini Voices Error! Possibly Not Set Yet. \n Just Use 
Control S To Save Your Voice Settings During Game. \n" % name

def SaveAllSettings2IniFile( gameDict):
    "Save Voices and Play Lists."
    #Save Voice Settings.
    SaveVoice( "WE", "Player", gameDict)
    SaveVoice( "WE", "Computer", gameDict)
    SaveVoice( "WE", "Player2", gameDict)
    SaveVoice( "SAPI", "Player", gameDict)
    SaveVoice( "SAPI", "Computer", gameDict)
    SaveVoice( "SAPI", "Player2", gameDict)
    SpeakNext( " Voices Saved ")
    SavePlayList( "Game Music Background", NAME4GAME_PLAYLIST, gameDict,     
gameDict[ NAME4GAME_PLAYLIST])
    SavePlayList( "Juke Box Music", NAME4JUKEBOX_PLAYLIST, gameDict, gameDict[ 
NAME4JUKEBOX_PLAYLIST])


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

_______________________________________________
Any views or opinions presented in this email are solely those of the author 
and do not necessarily represent those of Ai Squared.

For membership options, visit 
http://lists.window-eyes.com/options.cgi/scripting-window-eyes.com/archive%40mail-archive.com.
For subscription options, visit 
http://lists.window-eyes.com/listinfo.cgi/scripting-window-eyes.com
List archives can be found at 
http://lists.window-eyes.com/private.cgi/scripting-window-eyes.com

Reply via email to