PySimpleGUI按下非ASCII字符时键盘事件返回问号问题求助
解决PySimpleGUI接收非ASCII字符(如希伯来语)返回问号的问题
我之前也碰到过类似的非ASCII字符在PySimpleGUI键盘事件里显示异常的问题,下面是几个经过验证的可行解决思路:
1. 改用Tkinter底层事件绑定替代return_keyboard_events=True
return_keyboard_events=True是PySimpleGUI早期的键盘事件实现,对非ASCII字符的支持不够完善。推荐直接通过bind方法绑定<Key>事件,利用Tkinter的底层事件系统来获取正确的字符:
import PySimpleGUI as sg layout = [[sg.Text('输入希伯来语字符测试:')], [sg.Input(key='-INPUT-')]] window = sg.Window('窗口标题', layout, finalize=True) # 绑定全局键盘事件到窗口 window.bind('<Key>', '-KEY_EVENT-') while True: event, values = window.read() if event == sg.WIN_CLOSED: break if event == '-KEY_EVENT-': # 通过user_bind_event获取按下的字符 pressed_char = window.user_bind_event.char if pressed_char: # 排除回车、退格等无字符的控制键 print(f"按下的字符:{pressed_char}") window.close()
这种方式能直接获取系统正确编码的字符,对希伯来语、中文等非ASCII语言都能完美支持。
2. 监听输入框内容变化而非直接键盘事件
如果你的需求是获取用户输入的字符,而非单纯监听按键动作,可以给输入框开启enable_events=True,通过输入框的内容变化事件来获取字符:
import PySimpleGUI as sg layout = [[sg.Text('输入希伯来语字符测试:')], [sg.Input(key='-INPUT-', enable_events=True)]] window = sg.Window('窗口标题', layout, finalize=True) while True: event, values = window.read() if event == sg.WIN_CLOSED: break if event == '-INPUT-': input_content = values['-INPUT-'] if input_content: # 获取最后输入的字符 last_char = input_content[-1] print(f"刚输入的字符:{last_char}") window.close()
这种方式完全绕开了键盘事件的编码问题,依赖输入框本身的字符处理逻辑,兼容性最好。
3. 确认Python环境编码设置
虽然Python 3默认编码已经是UTF-8,但偶尔系统环境的编码设置可能影响字符处理。可以在代码开头添加以下代码确保编码正确:
import sys if hasattr(sys, 'setdefaultencoding'): sys.setdefaultencoding('utf-8')
不过这个方法的优先级低于前两种,仅作为辅助排查手段。
内容的提问来源于stack exchange,提问作者Yishay Hayardeni
相关产品推荐
相关产品推荐

