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

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()

关键逻辑说明

  1. 坐标转换:通过window.mouse_location()获取鼠标屏幕坐标,结合window.current_location()得到窗口的屏幕位置,计算出鼠标在窗口内的相对坐标。
  2. 元素边界判断:使用element.get_bounding_box()获取输入框的边界范围,判断点击位置是否处于该范围内。
  3. 焦点转移控制:仅当点击位置不在输入框内时,才将焦点转移到隐藏元素,避免了输入时焦点被误移除的问题。

内容的提问来源于stack exchange,提问作者pyinthesky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:49:56