如何获取sg.InputText输入并传入keyboard.press()?运行触发ValueError
问题解决:点击Run自动输入按键时的ValueError修复
错误原因
- pynput按键格式不匹配:
keyboard.press()只接受单个字符(如'a'、'5')或Key类的特殊键实例(如Key.enter)。如果输入框填的是'enter'这类特殊键的字符串,直接传入会触发ValueError,因为pynput无法识别字符串形式的特殊键。 - 窗口提前关闭:原代码把
window.close()放在循环内部,第一次点击按钮后窗口就会关闭,后续操作直接报错。 - 空输入判断逻辑错误:判断位置在
press之后,而且错误判断values==None,应该先检查输入框内容是否为空。
修复后的代码
from pynput.keyboard import Key, Controller import PySimpleGUI as sg # 特殊键映射:把输入的字符串对应到pynput的Key实例 SPECIAL_KEYS = { 'enter': Key.enter, 'backspace': Key.backspace, 'tab': Key.tab, 'space': Key.space, 'shift': Key.shift, 'ctrl': Key.ctrl, 'alt': Key.alt, 'caps_lock': Key.caps_lock, 'esc': Key.esc, 'up': Key.up, 'down': Key.down, 'left': Key.left, 'right': Key.right } sg.theme('Black') layout = [ [sg.Text('Key To Click'), sg.InputText()], [sg.Button('Run'), sg.Button('Close Application')] ] window = sg.Window('Macro', layout) keyboard = Controller() while True: event, values = window.read() if event == sg.WIN_CLOSED or event == 'Close Application': break input_key = values[0].strip() # 获取输入并去除首尾空格 print('You entered ', input_key) if event == 'Run': if not input_key: # 检查输入是否为空 print('Please Type A Letter or Special Key!') continue # 处理按键:先找特殊键,找不到就按普通字符处理 try: key = SPECIAL_KEYS.get(input_key.lower(), input_key) keyboard.press(key) keyboard.release(key) # 记得释放按键,避免一直按住 except ValueError as e: print(f'Invalid key: {input_key}, error: {e}') # 循环结束后再关闭窗口 window.close()
关键改动说明
- 新增特殊键映射字典:把常用特殊键的字符串和
Key实例对应,输入'enter'时自动转换成Key.enter。 - 调整窗口关闭位置:
window.close()移到循环外,确保窗口在程序结束时才关闭。 - 修正空输入判断:先检查输入是否为空,为空直接提示不执行press操作。
- 添加按键释放:调用
keyboard.release(),避免按键被一直按住。 - 异常捕获:用try-except捕获无效输入的错误,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

