我正在使用 PySimpleGui 创建一个界面,其中包含一些输入框、按钮、文本和一些显示的图像。我正在尝试将数字键绑定到其他按下按钮的操作。但是,默认焦点位于输入框中,因此只要按下我设置绑定的数字键,数字就会在输入框中输入。我想从输入框中移除焦点,并且不输入键盘输入,除非我专门选择了输入框。这是我能想到的几乎所有其他应用程序的行为。例如,如果我在当前正在输入的文本输入框之外单击,则光标将不再存在,并且我输入的任何内容都不会输入)。
我尝试将焦点设置到另一个文本框,每次单击鼠标按钮时该文本框都不可见,但如果我确实想在其中输入内容,那么它会立即将焦点从输入框移开。
有办法做到这一点吗?
window.bind('<Button-1>', "-OUTFOCUS-")
if event =="-OUTFOCUS-":
window['-FOCUSOUT-'].set_focus()
我已经尝试了无数次迭代来找到焦点所在并将其设置在其他地方,但没有任何效果。
PySimpleGUI 演示浏览器执行类似的操作。按 F1、F2、F3 可以访问 3 个输入元素。
您尝试的解决方案的问题是文本元素无法获得焦点,因此将焦点设置在一个元素上失败。
创建窗口时设置
use_default_focus=False
将解决初始焦点问题。另一种选择是将焦点设置到不可见的元素。
正如您所看到的,tkinter 在处理焦点的方式上有点不同。在输入外部单击不足以导致该元素失去焦点。您可以按 Tab 移动到下一个可以获得焦点的元素。我不建议使用数字键作为导航方式,因为它们可能会作为文本输入。也许功能键适合您?
这是一个使用功能键进行导航的示例程序:
import PySimpleGUI as sg
layout = [ [sg.Text('Use Function Keys to Navigate to Input Elements')],
[sg.Text('F1'), sg.Input(key='-IN1-')],
[sg.Text('F2'), sg.Input(key='-IN2-')],
# [sg.Input(key='-INVISIBLE-', visible=False)], # Optional if you use use_default_focus=False
[sg.Button('Does Nothing'), sg.Button('Exit')] ]
window = sg.Window('Function Keys to Navigate', layout, finalize=True, use_default_focus=False)
# window['-INVISIBLE-'].set_focus()
window.bind('<F1>', '-F1-')
window.bind('<F2>', '-F2-')
while True:
event, values = window.read()
print(event, values)
if event == sg.WIN_CLOSED or event == 'Exit':
break
elif event == '-F1-':
window['-IN1-'].set_focus()
elif event == '-F2-':
window['-IN2-'].set_focus()
window.close()
eCookbook 中还有一个条目,显示使用箭头键在输入元素之间导航。