You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态单词转数字工具首元音输入报错问题求助

问题分析

报错的核心原因是空字符串的索引访问:当输入单词全由元音组成时(比如输入'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:41:29