Как я могу ждать, пока пользователь нажимает на кнопку tkinter с некоторым ответом, находясь внутри цикла for, который читает каждый вопрос с ответом в списке - PullRequest
0 голосов
/ 10 ноября 2019

Настройка:
Система: Windows 10 Home x64
Версия Python: 3.7.4
Программное обеспечение: Pycharm или IDLE

Я работаю над "приложением", которое в основном состоит изигра-викторина, но когда она входит в цикл, программа не ожидает нажатия пользователем кнопки в разделе кнопок ответов, код запускается только при последнем вопросе в списке (в основном происходит при каждом вопросе и не ожидает нажатия любой кнопки)что я дал (qaList), отображая последний вопрос и возможные ответы на этот вопрос в форме кнопки.

Я хотел дать один вопрос за раз, рандомизируя порядок каждый раз, когда я запускаю приложение, иукажите возможные ответы на вопрос в форме кнопки и дождитесь выбора пользователя. Затем просто напечатайте на консоли, если это правильно или неправильно, и переходите к следующему вопросу, но я не могу этого сделать.

Я выбираю цикл, потому что когда я хочу добавить ещевопросы к программе, я могу сделать это почти без каких-либо усилий.

Есть ли способ заставить этот цикл ждать выбора пользователя и просто продолжать, когда пользователь нажимает любую кнопку ответа?

Мой (часть вопроса) код:

import random
import tkinter as tk

width = 640  # Largura
height = 480  # Altura

# GUI SYSTEM
root = tk.Tk()
canvas = tk.Canvas(root, height=height, width=width)
canvas.pack()

def play_quiz():
    class pergunta_resposta:
        def __init__(self, question, answer, options):
            self.question = question
            self.answer = answer
            self.options = options

    # ===================list with  this order ('question', 'right answer', [3 other possible answers]===================
    qaList = [pergunta_resposta("", "", ["", "", ""]), 
              pergunta_resposta("", "", ["", "", ""]), 
              pergunta_resposta("", "", ["", "", ""]), 
              pergunta_resposta("", "", ["", "", ""]), 
              pergunta_resposta("", "", ["", "", ""]), 
              pergunta_resposta("", "", ["", "", ""]), 
              pergunta_resposta("", "", ["", "", ""])]

    # ===================randomise the order of the questions inside the list===================
    random.shuffle(qaList)

    # ===================for loop to go on every single question===================
    for Item in qaList:
        frame = tk.Frame(root, bg='white')
        frame.place(rely=0.05, relx=0.05, relheight=0.25, relwidth=0.9)
        ask = tk.Label(frame, text=Item.question, font=("Impact", 15))
        ask.pack(expand=True)

        possible = Item.options + [Item.answer]
        random.shuffle(possible)

        # ===================possible answers buttons functions===================
        def button(n):
            global correct
            if possible[n] == Item.answer:
                print('Right')
                correct = 1
            elif possible[n] != Item.answer:
                print('Wrong!')
                correct = 0

        # ===================frame for possible answers buttons===================
        frame1 = tk.Frame(root, bg='white')
        frame1.place(rely=0.35, relx=0.15, relheight=0.4, relwidth=0.7)

        # possible answers buttons
        answer1 = tk.Button(frame1, text=possible[0], font=("Impact", 15), command=lambda: button(0))
        answer1.pack(fill='both', expand=True)

        answer2 = tk.Button(frame1, text=possible[1], font=("Impact", 15), command=lambda: button(1))
        answer2.pack(fill='both', expand=True)

        answer3 = tk.Button(frame1, text=possible[2], font=("Impact", 15), command=lambda: button(2))
        answer3.pack(fill='both', expand=True)

        answer4 = tk.Button(frame1, text=possible[3], font=("Impact", 15), command=lambda: button(3))
        answer4.pack(fill='both', expand=True)

play_quiz()
root.mainloop()
...