Проблема при повторном использовании макета в PySimpleGUI

#python #pysimplegui

#python #pysimplegui

Вопрос:

У меня есть всплывающее окно с полем ввода пользователя с использованием PySimpleGUI. Если пользователь вводит неверный ввод, я хочу показать некоторый текст под полем ввода, в котором говорится, что его нужно ввести снова. Моя идея до сих пор заключается в приведенном ниже коде:

 def start_pop_up(self, wrong_answer=False):
    sg.theme('DarkAmber')
    if wrong_answer:
        layout = wrong_answer
    else:
        layout = initial

    window = sg.Window('Please chose start settings', layout)
    event, values = window.read()

    if values['user_input']:
        if test_user_input:
            # Set some parameters accordingly .....
            pass
        else:
            window.close()
            self.start_pop_up(True)

    window.close()
 

Где мои макеты выглядят так:

 initial = [[sg.Text('User input: ', size=(15, 1)), sg.InputText(size=(60, 1), key='user_input')],
           [sg.Submit()]]

wrong_answer = [[sg.Text('User input: ', size=(15, 1)), sg.InputText(size=(60, 1), key='user_input')],
                [sg.Text('Wrong input, please input the correct answer.', text_color='red')],
                [sg.Submit()]]
 

Если я ввожу неправильный формат, появляется правильное окно. Но если я снова попытаюсь ввести неправильный ответ, я получу эту ошибку:

Как я могу это решить?

Ответ №1:

Проблема решена, но это странное поведение, которое может быть ошибкой.

Вместо того, чтобы сначала создавать макеты как переменные, я сразу помещаю их в операторы layout if / else, подобные этому:

 if wrong_answer:
    layout = [[sg.Text('User input: ', size=(15, 1)), sg.InputText(size=(60, 1), key='user_input')],
              [sg.Text('Wrong input, please input the correct answer.', text_color='red')],
              [sg.Submit()]]
else:
    layout = [[sg.Text('User input: ', size=(15, 1)), sg.InputText(size=(60, 1), key='user_input')],
              [sg.Submit()]]
 

И теперь он работал правильно. Похоже, что PySimpleGUI необходимо «повторно инициализировать» макеты, распечатав их следующим образом.

Комментарии:

1. Вы повторно использовали один и тот же макет снова и снова. Содержимое initial никогда не менялось. Он всегда содержал одни и те же элементы, если вы определили его только один раз. Новые операторы if создают новый макет, а не повторно используют ранее определенный.

2. Как указано во всплывающем окне с ошибкой, печатайте макет, который вы используете каждый раз. Вы увидите, что используются одни и те же объекты. Один и тот же идентификатор / адрес в памяти будет отображаться для элементов каждый раз, когда вы его печатаете. Если вы выполняете оператор только один раз, который создает объект, у вас есть только 1 из этих объектов. Один из способов преодолеть это — использовать функцию, которая возвращает layout, тогда это будет новая копия при каждом ее вызове.

3. Ну, я хочу использовать один и тот же макет каждый раз, когда происходит определенный случай. Но он говорит, что я не могу, что кажется странной особенностью / ошибкой 🙂

4. Это похоже на настройки x = 5. Затем позже ожидается, что x будет указывать на другой 5. Это тот же 5.

5. @MikeyB, я слышу, что ты говоришь. Для меня это больше похоже на то, что я могу использовать x только один раз, а затем он «израсходован». Что является странным поведением. Спасибо за информацию, в конце концов я заставил ее работать 🙂