动态单词转数字工具首元音输入报错问题求助
问题分析
报错的核心原因是空字符串的索引访问:当输入单词全由元音组成时(比如输入'a'),result1会被过滤为空字符串,后续result2也会是空的。此时执行result2[0]就会触发IndexError,因为空字符串没有索引0的元素。
解决方案
需要在访问字符串索引前先判断字符串是否为空,同时修复代码里的其他小问题:
1. 避免空字符串索引越界
修改处理result3的两行代码,增加空值判断:
filter_out = {'d','t'} # 先判断result2是否非空,再访问索引0 result3 = result2[1:] if result2 and result2[0].lower() in filter_out else result2 # 先判断result3是否非空,再访问索引-1 result3 = result3[:-1] if result3 and result3[-1].lower() in filter_out else result3
2. 兼容大小写输入
原代码中alphabet的键都是小写,若输入大写字母会直接保留原字符,导致NUMBER字段不符合预期。修改string2的生成逻辑,统一转小写查询:
string2 = '-'.join([alphabet[char.lower()] if char.lower() in alphabet else char for char in string1])
3. 修复窗口提前关闭的问题
原代码中window.close()写在event == 'WORD'的分支里,导致输入一次单词后窗口就关闭了。将其移到while循环结束后:
while True: event, values = window.read() print(event, values) if event == sg.WIN_CLOSED or event == 'Exit': break elif event == 'WORD': # 原有的处理逻辑... window['RESULT'].update(value=result3.upper()) # 循环结束后再关闭窗口 window.close()
完整修正后的代码
import PySimpleGUI as sg alphabet = {'a':'1','b':'2','c':'3','d':'4','e':'5','f':'6','g':'7','h':'8','i':'9','j':'10', 'k':'11','l':'12','m':'13','n':'14','o':'15','p':'16','q':'17','r':'18','s':'19','t':'20', 'u':'21','v':'22','w':'23','x':'24','y':'25','z':'26'} vowels = {'a','e','i','o','u'} layout = [ [sg.Text('Word:', size=(15,1)), sg.Input(enable_events=True, key='WORD', size=(25,1))], [sg.Text('Number:', size=(15,1)), sg.Input(key='NUMBER', size=(25,1))], [sg.Text('Result:', size=(15,1)), sg.Input(key='RESULT', size=(25,1))], ] window = sg.Window('MAIN', layout, finalize=True,element_justification='c') while True: event, values = window.read() print(event, values) if event == sg.WIN_CLOSED or event == 'Exit': break elif event == 'WORD': string1 = values['WORD'] # 兼容大小写输入 string2 = '-'.join([alphabet[char.lower()] if char.lower() in alphabet else char for char in string1]) window['NUMBER'].update(string2) result1 = ''.join([letter for letter in string1 if letter.lower() not in vowels]) result2 = "" for i in result1: if i.lower() not in result2 and i.upper() not in result2: result2 += i filter_out = {'d','t'} # 增加空字符串判断,避免索引越界 result3 = result2[1:] if result2 and result2[0].lower() in filter_out else result2 result3 = result3[:-1] if result3 and result3[-1].lower() in filter_out else result3 window['RESULT'].update(value=result3.upper()) # 循环结束后关闭窗口 window.close()
内容的提问来源于stack exchange,提问作者PyiPath2022
相关产品推荐
相关产品推荐

