0

我有一个基于 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)

目标是用户可以在听完声音后按一次按钮,然后禁用所有按钮,直到下一组声音结束。双击按钮并在禁用时单击按钮不会导致注册响应。

4

1 回答 1

1

你的逻辑不好。按下按钮后,您没有正确设置按钮的状态text。我去掉了所有声音的东西,然后离开了 GUI,所以我们只看那个,只有那个。

当您单击一个Text按钮时,问题就出现了。看看你的代码......你在 if 块中做的最后一件事是启用所有Text按钮。它们应该被禁用并且应该启用“开始”按钮。

这是一个工作演示,我相信它可以按照您想要的方式设置按钮状态。首先仅启用启动。如果单击,它将被禁用并启用文本按钮。一切都很好。

import PySimpleGUI as sg

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()
    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()
        window.FindElement('start').Update(disabled=False)
window.Close()

于 2019-09-02T16:50:36.750 回答