def populate_words(words, oxford_api, words_api=None, allow_messages=True):
    """
    Iterates the words dictionary, populating the data of each object using the OxfordAPI and with the optional
    WordsAPI to be used in the case the word is not found in the Oxford dictionary.
    :param words: The dictionary containing the words to be populated.
    :param oxford_api: The OxfordAPI object.
    :param words_api: The WordsAPI object.
    :param allow_messages: Boolean value to indicate if messages should be displayed in the console.
    :return: A list of those words that have not been found.
    """
    incomplete_words = []
    i = 0
    for word in words.values():
        if allow_messages:
            print(i, ': ', word.text)
            i = i + 1
        success = oxford_api.get_word(word)
        if not success and words_api:
            definitions = words_api.definitions(word.text)
            if definitions and definitions.get('definitions', False):
                for definition in definitions.get('definitions', list()):
                    word.definitions.append(definition.get('definition', None))
    for item in words.items():
        key = item[0]
        word = item[1]
        if len(word.definitions) == 0:
            incomplete_words.append(key)
    return incomplete_words