当用户输入其他未提示的内容时,如何防止出错?

2024-05-11 03:33:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个过滤器/像素操作程序。基本上我已经完成了这一切,唯一的错误是当用户输入一些没有提示的东西时,比如“x”而不是“a”,等等。我尝试了“try:”和“except ValueError:”语句,但我猜这是错误的。 这是重要的代码:

    # 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')))

很抱歉这个非常大的代码段,它只是从顶部的一个输入链接到底部的代码。如果有人能帮助我,我将非常感激。我不知道要包括哪些具体部分,所以我包括了最重要的部分


1条回答
网友
1楼 · 发布于 2024-05-11 03:33:27

您可以使用退出选项使其成为无限while循环。您可以采取几种方法。但这一条对代码的更改最少

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

相关问题 更多 >