Заменить множество повторений if подряд на список

как мне засунуть if в список

    from tkinter import *
import random
import time

root = Tk()

o1='когда прошли первые олимпийские игры'
o2='сколько песен у группы Queen'
o3='срок президентства Джорджа   Вашингтона'
o4='национальным блюдом какой страны является Вешалица'
o5='Как называется 4 часть Гарри Поттера'
o6='Средний вес 1 авокадо'
o7='в какой стране изобрели кумыс'
o8='национальным животным какой страны является Танкуки'
o9='когда родился Билл Гейтс'
o10='количество бит в мегабайте'
root.title("Приложение на Tkinter")    
root.geometry("300x250")
FUNC=0
ESK=0

def start():
    label = Label(text=o2)
    b1 = Button(text="1 ответ")
    b2 = Button(text="2 ответ")
    b3 = Button(text="3 ответ")
    b4 = Button(text="4 ответ")
    def correct():
        if ESK > 1:
            global MF
            MF.pack_forget()
        b4.config(bg='green')
        time.sleep(1.5)
        b1.pack_forget()
        b2.pack_forget()
        b3.pack_forget()
        b4.pack_forget()
        label.pack_forget()
        MF=Button(text='next',command=start,)
        MF.pack()
    global ESK
    ESK+=1
    if ESK > 1:
        global MF
        MF.pack_forget()
        
    z=random.randint(1, 10)
    if z==1:
        label = Label(text=o1)
        b1 = Button(text="15 н.э")
        b2 = Button(text="576 н.э.")
        b3 = Button(text="776 до н.э.",command=correct,activebackground='green')
        b4 = Button(text="1698 н.э.")
    if z==2:
        label.config(text=o2)
        b1 = Button(text="264")
        b2 = Button(text="372",command=correct,activebackground='green')
        b3 = Button(text="156")
        b4 = Button(text="74")
    if z==3:
        label = Label(text=o3)
        b1 = Button(text="с 1789 по 1797",command=correct,activebackground='green')
        b2 = Button(text="с 2001 по 2006")
        b3 = Button(text="с 1824 по 1835")
        b4 = Button(text="он работал в шаурмечной и не был президентом")
    if z==4:
        label = Label(text=o4)
        b1 = Button(text="Бельгия")
        b2 = Button(text="Афганистан")
        b3 = Button(text="Чехия")
        b4 = Button(text="Сербия",command=correct,activebackground='green')
    if z==5:
        b1 = Button(text="Кубок огня",command=correct,activebackground='green')
        b2 = Button(text="Тайная комната")
        b3 = Button(text="Орден Феникса")
        b4 = Button(text="Война бесконечности")
    if z==6:
        label = Label(text=o6)
        b1 = Button(text="88000 мг")
        b2 = Button(text="0,098кг")
        b3 = Button(text="110 грамм",command=correct,activebackground='green')
        b4 = Button(text="15 тонн")
    if z==7:
        label = Label(text=o7)
        b1 = Button(text="Таджикистан")
        b2 = Button(text="Швеция")
        b3 = Button(text="Ирландия")
        b4 = Button(text="Кыргызтан",command=correct,activebackground='green')
    if z==8:
        label = Label(text=o8)
        b1 = Button(text="Китай")
        b2 = Button(text="Япония",command=correct,activebackground='green')
        b3 = Button(text="Турция")
        b4 = Button(text="Монголия")
    if z==9:
        label = Label(text=o9)
        b1 = Button(text="28 октября 1955",command=correct,activebackground='green')
        b2 = Button(text="15 апреля 1967")
        b3 = Button(text="17 декабря 1948")
        b4 = Button(text="3 июля 1938")
    if z==10:
        label = Label(text=o10)
        b1 = Button(text="10 425 728")
        b2 = Button(text="8 388 608",command=correct,activebackground='green')
        b3 = Button(text="534 972")
        b4 = Button(text="2 630 149")
    label.pack()
    b1.pack()
    b2.pack()
    b3.pack()
    b4.pack()
    zhdun.pack_forget()

    label.pack()



zhdun = Button(text='START', command = start)
zhdun.pack()

root.mainloop()

вот весь код, нужно сделать чтобы вопросы не повторялись


Ответы (1 шт):

Автор решения: Pak Uula

Я так понимаю, вы программируете что-то типа опросника, в котором есть вопросы с несколькими вариантами ответа? Задавать их в виде ветвлений if действительно тот ещё выбор. Такие вещи нужно задавать в модели данных, а не в поведении.

Например, создайте класс Question, который будет хранить вопрос, варианты ответа и идентификатор правильного ответа

class Question:
    def __init__(self, question, variants, answer_id):
        self.question = question
        self.answer = answer_id
        self.variants = variants

Тогда список вопросов для викторины можно задать так

quiz = [
    Question('когда прошли первые олимпийские игры', ["15 н.э", "576 н.э.", "776 до н.э.", "1698 н.э."], 2),
    Question('сколько песен у группы Queen', ["264", "372", "156", "74"], 1),
    Question('срок президентства Джорджа   Вашингтона', ["с 1789 по 1797", "с 2001 по 2006", "с 1824 по 1835", "он работал в шаурмечной и не был президентом"], 0),
    Question('национальным блюдом какой страны является Вешалица', ["Бельгия", "Афганистан", "Чехия", "Сербия"], 3),
    Question('Как называется 4 часть Гарри Поттера', ["Кубок огня", "Тайная комната", "Орден Феникса", "Война бесконечности"], 0),
    Question('Средний вес 1 авокадо', ["88000 мг", "0,098кг", "110 грамм", "15 тонн"], 2),
    Question('в какой стране изобрели кумыс', ["Таджикистан", "Швеция", "Ирландия", "Кыргызтан"], 3),
    Question('национальным животным какой страны является Танкуки', ["Китай", "Япония", "Турция", "Монголия"], 1),
    Question('когда родился Билл Гейтс', ["28 октября 1955", "15 апреля 1967", "17 декабря 1948", "3 июля 1938"], 0),
    Question('количество бит в мегабайте', ["10 425 728", "8 388 608", "534 972", "2 630 149"], 1)
]

и вам отныне не нужно делать ветвления if:

    z=random.randint(1, 10)
    question = quiz[z-1]
    label, buttons = controls(question, correct)
    label.pack()
    b1, b2, b3, b4 = buttons
    for button in buttons:
        button.pack()

Здесь функция controls создаёт контролы для отображения вопроса

def controls(question, correct_fn):
    label = Label(text=question.question)
    buttons = []
    for i in range(4):
        if i == question.answer:
            buttons.append(Button(text=question.variants[i], command=correct_fn, activebackground='green'))
        else:
            buttons.append(Button(text=question.variants[i]))
    return label, buttons

Полный пример

from tkinter import *
import random
import time


class Question:
    def __init__(self, question, variants, answer_id):
        self.question = question
        self.answer = answer_id
        self.variants = variants


def controls(question, correct_fn):
    label = Label(text=question.question)
    buttons = []
    for i in range(4):
        if i == question.answer:
            buttons.append(
                Button(text=question.variants[i], command=correct_fn, activebackground='green'))
        else:
            buttons.append(Button(text=question.variants[i]))
    return label, buttons


def start():
    label = Label(text='Вопрос')
    b1 = Button(text="1 ответ")
    b2 = Button(text="2 ответ")
    b3 = Button(text="3 ответ")
    b4 = Button(text="4 ответ")

    def correct():
        if ESK > 1:
            global MF
            MF.pack_forget()
        b4.config(bg='green')
        time.sleep(1.5)
        b1.pack_forget()
        b2.pack_forget()
        b3.pack_forget()
        b4.pack_forget()
        label.pack_forget()
        MF = Button(text='next', command=start,)
        MF.pack()
    global ESK
    ESK += 1
    if ESK > 1:
        global MF
        MF.pack_forget()

    quiz = [
        Question('когда прошли первые олимпийские игры', [
                 "15 н.э", "576 н.э.", "776 до н.э.", "1698 н.э."], 2),
        Question('сколько песен у группы Queen',
                 ["264", "372", "156", "74"], 1),
        Question('срок президентства Джорджа   Вашингтона', [
                 "с 1789 по 1797", "с 2001 по 2006", "с 1824 по 1835", "он работал в шаурмечной и не был президентом"], 0),
        Question('национальным блюдом какой страны является Вешалица',
                 ["Бельгия", "Афганистан", "Чехия", "Сербия"], 3),
        Question('Как называется 4 часть Гарри Поттера', [
                 "Кубок огня", "Тайная комната", "Орден Феникса", "Война бесконечности"], 0),
        Question('Средний вес 1 авокадо', [
                 "88000 мг", "0,098кг", "110 грамм", "15 тонн"], 2),
        Question('в какой стране изобрели кумыс', [
                 "Таджикистан", "Швеция", "Ирландия", "Кыргызтан"], 3),
        Question('национальным животным какой страны является Танкуки', [
                 "Китай", "Япония", "Турция", "Монголия"], 1),
        Question('когда родился Билл Гейтс', [
                 "28 октября 1955", "15 апреля 1967", "17 декабря 1948", "3 июля 1938"], 0),
        Question('количество бит в мегабайте', [
                 "10 425 728", "8 388 608", "534 972", "2 630 149"], 1)
    ]

    z = random.randint(1, 10)
    question = quiz[z-1]
    label, buttons = controls(question, correct)
    label.pack()
    b1, b2, b3, b4 = buttons
    for button in buttons:
        button.pack()

    zhdun.pack_forget()

    label.pack()

root = Tk()

root.title("Приложение на Tkinter")
root.geometry("300x250")
FUNC = 0
ESK = 0

zhdun = Button(text='START', command=start)
zhdun.pack()

root.mainloop()

ВДОГОНКУ

Структуру приложения тоже стоит переделать. Как только появляются глобальные переменные - это сигнал, что нужно переходить к классу, и заменять глобальные сущности на поля объекта.

Ваше приложение можно реструктурировать вот так

class Application(Frame):
    def __init__(self, quiz, parent):
        super().__init__(parent)
        self.quiz = quiz
        
        self.parent = parent
        self.pack()
        
        self.start_btn = Button(self, text="START", command=self.after_start)
        self.next_btn = Button(self, text="NEXT", command=self.show_question)
        
        self.label = Label(self, text="Question")
        self.buttons = [
            Button(self, text="Answer 1"),
            Button(self, text="Answer 2"),
            Button(self, text="Answer 3"),
            Button(self, text="Answer 4")
        ]
        self.create_widgets()

    def create_widgets(self):
        self.start_btn.pack(side="top")

    def after_start(self):
        self.start_btn.pack_forget()
        self.show_question()

    def show_question(self):
        self.next_btn.pack_forget()
        
        z = random.randint(1, 10)
        question = self.quiz[z-1]
        self.label.config(text=question.question)
        self.label.pack()
        for i, button in enumerate(self.buttons):
            # Clear previous button configurations
            button.config(bg='SystemButtonFace', activebackground='SystemButtonFace', command=self.wrong)
            button.config(text=question.variants[i])
            if i == question.answer:
                button.config(command=self.show_next, activebackground='green')
            button.pack()
    
    def wrong(self):
        pass
    
    def show_next(self):
        time.sleep(1.5)
        
        for button in self.buttons:
            button.pack_forget()
        self.label.pack_forget()
        self.next_btn.pack(side="top")

Запускать вот так

root = Tk()
root.title("Приложение на Tkinter")
root.geometry("300x250")

app = Application(quiz, parent=root)

root.mainloop()

что такое quiz - см. выше

→ Ссылка