How do I prevent error when user enters something else not prompted?

61 Views Asked by At

I'm making a filter/pixel manipulation program. Basically I've finished it all, only bug is that when the user enters something else that is not prompted like 'x' instead of 'a', etc. I've tried a "try:" and "except ValueError:" statement but im guessing that's wrong. This is the important code code:

    # Variables for image selection *for assigning string color only*
print("What image would you like to utilize? City Image: 'A', Dog Image: 'B', or Statue of Liberty: 'C'")

# Image selection input
img_input = input('Choose Image: ').casefold()
  
# Assign image choice char
img_choices = ['a', 'b', 'c']

# If Statements for opening image of choice
if img_input == img_choices[0]:
  img = Image.open('subjectIMG.jpg')
elif img_input == img_choices[1]:
  img = Image.open('subjectIMG0.jpg')
elif img_input == img_choices[2]:
  img = Image.open('subjectIMG2.jpg')


# For visuals only
time.sleep(0.8), print('\nChoosing your image....\n')
time.sleep(0.8), print('Image choosen!\n'), time.sleep(0.8)

# Rescales image to preferred size
width, height = img.width, img.height
xwidth, yheight = width // 1000, height // 1000
if xwidth > yheight:
  scale = xwidth
else:
  scale = yheight
if scale != 0:
  img = img.resize( (width // scale, height // scale) )

# Filter One
def invert_distort(display_algorithm, image_filter_inverted):
  # Get pixel data (every pixel) and make new list
  pixels_get = img.getdata() 
  pixel_list = [] 

  # Go through every pixel in image and append every pixel to list
  for p in pixels_get: 
    pixel_list.append(p) 

  # Pixel location and row 
  pixel_location = 0
  pixel_row = 0

  # Begin while loop at index 0 in order to loop through every pixel
  while pixel_location < len(pixel_list): 
    p = pixel_list[pixel_location] 

    # Prints current row and pixel color values
    if display_algorithm == 'y':
      print(f'Current row: {pixel_row}: {p}')
      pixel_row += 1

    if display_algorithm == 'n': 
      pass

    # Pixel Manipulation
    # If user enters accordingly, Colors Red, Green, Blue set into variables
    xr, xg, xb = 0, 0, 0

    if image_filter_inverted in image_filter_inverted_choices[0]:
      xr, xg, xb = 0, 1, 2

    elif image_filter_inverted in image_filter_inverted_choices[1]:
      xr, xg, xb = 2, 2, 2
   
    # Red, Green, Blue sorted into pixel list
    r, g, b = p[xr], p[xg], p[xb]

    # RGB values assigned to r, g, b
    absr, absg, absb = 255, 255, 255

    # Absolute value of pixels from red, green blue taken.
    # RBG values assigned, stored into variables below.
    update_r, update_g, update_b = abs(r-absr), abs(g-absg), abs(b-absb)

    # New values assigned at specific pixel location
    pixel_list[pixel_location] = (update_r, update_g, update_b)
    pixel_location = pixel_location + 1
    
  # New image created using same size and RGB format
  final_image = Image.new("RGB", img.size)
  final_image.putdata(pixel_list)
  
  # Filter from PIL applied to new image
  filter_applied = final_image.filter(ImageFilter.SHARPEN)
  return filter_applied
  
# Filter Two
def drawing_filter(display_algorithm, image_filter_drawing):

  # Get pixel data (every pixel) and make new list
  pixels_get = img.getdata() 
  pixel_list = [] 

  # Go through every pixel in image and append every pixel to list
  for p in pixels_get: 
    pixel_list.append(p) 

  # Pixel location and row 
  pixel_location = 0
  pixel_row = 0

  # Begin while loop at index 0 in order to loop through every pixel
  while pixel_location < len(pixel_list): 
    p = pixel_list[pixel_location] 

    # Prints current row and pixel color values
    if display_algorithm == 'y':
      print(f'Current row: {pixel_row}: {p}')
      pixel_row += 1

    if display_algorithm == 'n': 
      pass

    # Pixel Manipulation
    # Colors Red, Green, Blue set into variables
    xr, xg, xb = 2, 2, 2

    # Red, Green, Blue sorted into pixel list
    r, g, b = p[xr], p[xg], p[xb]

    # RGB values assigned to r, g, b
    absr, absg, absb = 255, 255, 255

    # Absolute value of pixels from red, green blue taken.
    # RBG values assigned, stored into variables below.
    update_r, update_g, update_b = abs(r-absr), abs(g-absg), abs(b-absb)

    # New values assigned at specific pixel location
    pixel_list[pixel_location] = (update_r, update_g, update_b)
    pixel_location = pixel_location + 1

  # New image created using same size and RGB format
  final_image = Image.new("RGB", img.size)
  final_image.putdata(pixel_list)

  # If statement applies, filter added to new image
  # Filter from PIL applied to new image
  if image_filter_drawing in image_filter_drawing_choices[0]:
    filter_applied = final_image.filter(ImageFilter.CONTOUR)
    return filter_applied

  elif image_filter_drawing in image_filter_drawing_choices[1]:
    filter_applied = final_image.filter(ImageFilter.EMBOSS)
    return filter_applied

# Filter Three
def constant_filter(display_algorithm): 

  # Get pixel data (every pixel) and make new list
  pixels_get = img.getdata() 
  pixel_list = [] 

  # Go through every pixel in image and append every pixel to list
  for p in pixels_get: 
    pixel_list.append(p) 

  # Pixel location and row 
  pixel_location = 0 
  pixel_row = 0 

  # Begin while loop at index 0 in order to loop through every pixel
  while pixel_location < len(pixel_list): 
    p = pixel_list[pixel_location] 

    # Prints current row and pixel color values
    if display_algorithm == 'y':
      print(f'Current row: {pixel_row}: {p}')
      pixel_row += 1
      
    if display_algorithm == 'n': 
      pass

    # Pixel Manipulation
    # Colors Red, Green, Blue set into variables
    xr, xg, xb = 0, 1, 2

    # Red, Green, Blue sorted into pixel list
    r, g, b = p[xr], p[xg], p[xb]

    # RBG values assigned, stored into variables below.
    update_r, update_g, update_b = r, g, b

    # New values assigned at specific pixel location
    pixel_list[pixel_location] = (update_r, update_g, update_b)
    pixel_location = pixel_location + 1

  # New image created using same size and RGB format
  final_image = Image.new("RGB", img.size)
  final_image.putdata(pixel_list)  

  # First Enhance Applied
  applyOne = ImageEnhance.Contrast(final_image)
  # Second Enhance Applied
  applyTwo = applyOne.enhance(0.5)
  # Final form stored into new variable
  filter_applied = applyTwo
  return filter_applied
  
# Permit user to choose to see algorithm visuals
display_algorithm = input("Would you like to see the back-end (algorithm) process? Enter 'Y' or 'N': ").casefold()

# Takes user input on main filter decision
image_filter_main = input("\nChoose a filter: Inverted: 'A', Drawing: 'B', or Contrast: 'C': ").casefold()
# Main Filter choices
image_filter_main_choices = ['a', 'b', 'c']

# If statments based off user input 
# Functions called: invert_distort(), drawing_filter(), constant_filter()

# Function invert_distort() if statment
if image_filter_main in image_filter_main_choices[0]:
  # Choose type of filter based off invert filter
  image_filter_inverted = input("\nChoose: Negative: 'A' or Monochrome: 'B': ").casefold()
  image_filter_inverted_choices = ['a', 'b']
  # Begin code duration time
  initiate = datetime.now()
  # Call function
  invert_distort(display_algorithm, image_filter_inverted)
  # Store function in a new variable
  imageInvert = invert_distort(display_algorithm, image_filter_inverted)
  print("\nFinishing your image...") 
  # Save Image (create new image)
  imageInvert.save("InvertIMG.jpg")

# Function drawing_filter() if statement
if image_filter_main in image_filter_main_choices[1]:
  # Choose type of filter based off drawing filter
  image_filter_drawing = input("\nChoose: Sketch: 'A' or Engraving: 'B': ").casefold()
  image_filter_drawing_choices = ['a', 'b']
  # Begin code duration time
  initiate = datetime.now()
  # Call function
  drawing_filter(display_algorithm, image_filter_drawing)
  # Store function in a new variable
  imageDrawing = drawing_filter(display_algorithm, image_filter_drawing)
  print("\nFinishing your image...")
  # Save Image (create new image)
  imageDrawing.save("DrawingIMG.jpg")

# Function constant_filter() if statement
if image_filter_main in image_filter_main_choices[2]:
  # Begin code duration time
  initiate = datetime.now()
  # Call function
  constant_filter(display_algorithm)
  # Store function in a new variable
  imageFirm = constant_filter(display_algorithm)
  print("\nFinishing your image...")
  # Save Image (create new image)
  imageFirm.save("ConstantIMG.jpg")

# End code duration time
# Print total duration of code
terminate = datetime.now()
print('\nDuration to execute code: {}'.format(colored((terminate - initiate), 'blue')))

Sorry for the extremely large snippet, it's just that one input from the top links all the way to the code at the bottom. If anybody can help me I'd gladly appreciate it. Don't know what specific part to include so I included the most important part.

1

There are 1 best solutions below

0
On

You can make it an infinite while loop with an exit option. There are several approaches you can take. But this one changes your code the least.

EXIT_TOKEN = "Q"
img_choices = ['a', 'b', 'c']

# If Statements for opening image of choice
while (img_input:= input('Choose Image: ').casefold()):
  if img_input == img_choices[0]:
    img = Image.open('subjectIMG.jpg')
  elif img_input == img_choices[1]:
    img = Image.open('subjectIMG0.jpg')
  elif img_input == img_choices[2]:
    img = Image.open('subjectIMG2.jpg')
  elif img_input == EXIT_TOKEN:
    sys.exit()
  else:
    print(f"Unexpected input: {img_input}")
    continue