PySimpleGUI:点击窗口其他区域时如何移除输入框光标?
解决PySimpleGUI中点击窗口其他区域移除输入框焦点的问题
需求说明
在PySimpleGUI界面中,输入框默认获取焦点,导致绑定的数字按键被输入框接收,无法触发对应按钮操作。需要实现:仅点击输入框时,输入框保持焦点以接收键盘输入;点击窗口其他区域时,自动移除输入框焦点。
解决方案
通过监听鼠标左键点击事件,判断点击位置是否落在输入框范围内,若未命中输入框则将焦点转移到隐藏元素或窗口本身,实现常规应用的交互逻辑。
完整代码示例:
import PySimpleGUI as sg # 界面布局:包含输入框、数字按钮、用于转移焦点的隐藏文本元素 layout = [ [sg.Input(key='-INPUT-', size=(20, 1))], [sg.Button('1'), sg.Button('2'), sg.Button('3')], [sg.Text('', key='-HIDDEN-', visible=False)] # 隐藏元素用于接收焦点 ] window = sg.Window('焦点控制示例', layout, finalize=True) # 绑定窗口的鼠标左键点击事件 window.bind('<Button-1>', '-CLICK-') while True: event, values = window.read() if event == sg.WIN_CLOSED: break if event == '-CLICK-': # 获取鼠标的屏幕坐标 mouse_x, mouse_y = window.mouse_location() # 获取窗口的屏幕位置,转换为窗口内相对坐标 window_x, window_y = window.current_location() rel_x = mouse_x - window_x rel_y = mouse_y - window_y input_element = window['-INPUT-'] # 获取输入框的边界范围(窗口内坐标:左上角x1,y1,右下角x2,y2) input_box = input_element.get_bounding_box() # 判断点击位置是否在输入框范围内 if not (input_box[0] <= rel_x <= input_box[2] and input_box[1] <= rel_y <= input_box[3]): # 点击区域非输入框,将焦点转移到隐藏元素 window['-HIDDEN-'].set_focus() # 也可以直接让窗口获取焦点:window.TKroot.focus() # 数字按钮的触发逻辑示例 if event in ['1', '2', '3']: window['-INPUT-'].update(values['-INPUT-'] + event) window.close()
关键逻辑说明
- 坐标转换:通过
window.mouse_location()获取鼠标屏幕坐标,结合window.current_location()得到窗口的屏幕位置,计算出鼠标在窗口内的相对坐标。 - 元素边界判断:使用
element.get_bounding_box()获取输入框的边界范围,判断点击位置是否处于该范围内。 - 焦点转移控制:仅当点击位置不在输入框内时,才将焦点转移到隐藏元素,避免了输入时焦点被误移除的问题。
内容的提问来源于stack exchange,提问作者pyinthesky
相关产品推荐
相关产品推荐

