Gimme some random passwords
Looking at the following:

terminal_width = 80
terminal_height = 25

default_length = 12

alphabet_default = string.ascii_letters + string.digits
alphabet_complex = alphabet_default + '`~!@#$%^&amp;*()_+-={}[];:&lt;&gt;?,./'
alphabet_easy = re.sub(r'[l1ioO0Z2I]', '', alphabet_default)

double_letter = re.compile(r'(.)\1')


you never change them, so they are constants. Constants are written ALL CAPS in Python as a convention.



elif len(alphabet) &lt; length:
    length = len(alphabet)


Are you sure the user really wants what you are doing here? Maybe he wants a 20 character password using only the 10 digits, with this you are silently not doing what he expects.