PySimpleGUI - обновление элемента списка

Я пытаюсь сделать простую викторину внутри графического интерфейса, но мне кажется, что я не могу обновить окно, чтобы перейти к следующему вопросу. Я пробовал какое-то время, и какое бы решение я ни придумал, оно либо работает частично, либо разбивает окно! Хотите знать, может ли кто-нибудь дать мне представление о том, как обновить текущее окно, чтобы отобразить следующий вопрос?

class Question:
    def __init__(self, prompt, answer):
        self.prompt = prompt
        self.answer = answer

questions = [
    Question(multiple_choice[0], "D"),
    Question(multiple_choice[1], "A"),
    Question(multiple_choice[2], "B"),
    Question(multiple_choice[3], "C"),
    Question(multiple_choice[4], "B"),
    Question(multiple_choice[5], "D"),
    Question(multiple_choice[6], "C"),
    Question(multiple_choice[7], "B"),
    Question(multiple_choice[8], "A"),
    Question(multiple_choice[9], "A"),
    Question(multiple_choice[10], "B"),
    Question(multiple_choice[11], "B"),
    Question(multiple_choice[12], "B"),
    Question(multiple_choice[13], "D"),
    Question(multiple_choice[14], "A"),
    Question(multiple_choice[15], "C"),
    Question(multiple_choice[16], "B"),
    Question(multiple_choice[17], "D"),
    Question(multiple_choice[18], "B"),
    Question(multiple_choice[19], "D")
]

sg.theme("DarkGreen5")
# All the stuff inside your window. This is the PSG magic code compactor...
layout = [[sg.Text()],
          [sg.Text(multiple_choice[0])],
          [sg.Text("Choose your answer:"), sg.Input()],
          [sg.Ok("Submit"), sg.Cancel("End Quiz")]]

# Create the Window
window = sg.Window("Logan's Quiz", layout)

# Event Loop to process "events"
while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, 'End Quiz'):
        break
    if event == "Submit":
        for question in questions:
            answer = sg.Input()
            if answer == question.answer:
                window[multiple_choice[0]].update(multiple_choice[1])
window.close()

Это то, что у меня есть на данный момент!

Я пропустил вопросы, поскольку они не были слишком необходимы для поиска решения - я не верю!


person Logan Lee Goodrum    schedule 30.08.2020    source источник


Ответы (1)


Несколько вещей:

  • Имя поля ввода должно быть общим, например «вопрос», поскольку вы будете использовать это поле для каждого вопроса.
  • Используйте цикл для просмотра списка вопросов, обновляя текстовое поле после каждого правильного ответа.
  • Доступ к данным вопроса через объект вопроса вместо использования списка multiple_choice

Попробуйте этот код:

sg.theme("DarkGreen5")
# All the stuff inside your window. This is the PSG magic code compactor...
layout = [[sg.Text()],
          [sg.Text("Question")],
          [sg.Text("Choose your answer:"), sg.Input()],
          [sg.Ok("Submit"), sg.Cancel("End Quiz")]]

# Create the Window
window = sg.Window("Logan's Quiz", layout)

qcur = 0  # current question 
window['Question'].update(questions[qcur].prompt)  # first question

# Event Loop to process "events"
while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, 'End Quiz'):
        break
    if event == "Submit":
        answer = sg.Input()
        if answer == questions[qcur].answer:
            qcur += 1  # next question
            if qcur = len(questions): qcur = 0  # restart list
            window['Question'].update(questions[qcur].prompt) # show next question
window.close()
person Mike67    schedule 31.08.2020
comment
Привет, Майк - запускается ошибка! Однако ваш код дал мне несколько идей и немного вдохновения! Я буду с этим возиться! - person Logan Lee Goodrum; 31.08.2020
comment
В посте не было достаточно кода для тестирования, поэтому пришлось угадывать :) Надеюсь, это поможет. - person Mike67; 31.08.2020