Заменить множество повторений 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 шт):
Я так понимаю, вы программируете что-то типа опросника, в котором есть вопросы с несколькими вариантами ответа? Задавать их в виде ветвлений 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 - см. выше