我有一个基于 PySimpleGUI(PySimpleGUI 3.4.2.、Python 3.7.2、macOS Mojave 10.14.6)的 GUI,除了按钮似乎在被禁用之外,它工作正常。
用户听 3 个连续的声音并通过单击按钮在我的 GUI 中给出评分。当用户收听声音时,按钮被禁用,因此在所有声音结束之前无法给出响应。按钮在 GUI 中成功显示为灰色 (window.FindElement(button_label).Update(disabled=False))。但是,如果按下禁用的按钮,则 GUI 会在启用按钮后立即接受此响应(就好像响应事件已排队一样),即使在启用按钮后没有按下任何按钮,这也会使 GUI 混乱(例如,意外双击被视为对两组 3 个声音的响应。)
我试图找到答案,但我没有找到 PySimpleGUI 的任何答案。我尝试了不同的方法在声音演示期间暂停代码(sd.wait 和 time.sleep),以防在播放声音时以某种方式在后台启用按钮。我试图弄乱读入的事件以解决该问题,但无济于事。我之前在使用 .Update() 方法启用这些按钮时遇到了麻烦,并且只有在添加 window.Refresh() 行后按钮才会变灰。我必须以某种方式确保按钮在禁用时不接受任何输入。
这是从真实版本严重压缩的示例代码。这是一个工作版本,其中响应按钮在提供响应后禁用 3 秒,并打印所有收集的响应。这可视化按钮在禁用时收集响应。
import PySimpleGUI as sg
import time
response_buttons = ['b1', 'b2', 'b3', 'b4', 'b5']
current_event=[]
layout = [[sg.Button('start', key='start')],
[sg.Button('text5', key='b5')],
[sg.Button('text4', key='b4')],
[sg.Button('text3', key='b3')],
[sg.Button('text2', key='b2')],
[sg.Button('text1', key='b1')]]
window = sg.Window('GUI test').Layout(layout).Finalize()
for button_label in response_buttons:
window.FindElement(button_label).Update(disabled=True)
window.Refresh()
while True:
# Read the Window
event, values = window.Read()
print(event)
if event is None:
break
# Take appropriate action based on button
if event == 'start':
window.FindElement('start').Update(disabled=True)
for button_label in response_buttons:
window.FindElement(button_label).Update(disabled=False)
window.Refresh()
if event in response_buttons:
# collect and store response
current_event = current_event + [event]
# disable the buttons during sound presentation
for button_label in response_buttons:
window.FindElement(button_label).Update(disabled=True)
window.Refresh()
time.sleep(3)
for button_label in response_buttons:
window.FindElement(button_label).Update(disabled=False)
目标是用户可以在听完声音后按一次按钮,然后禁用所有按钮,直到下一组声音结束。双击按钮并在禁用时单击按钮不会导致注册响应。