Я только начал разбираться с Python, всего две недели. До этого только Basic в школе и HTML в универе.
Попробовал написать программу, которая проверяет знание иностранного языка, в частности греческих слов.
ТЗ: Есть файл Excel, который содержит три листа с парами слов на греческом и русском - общая лексика, числа и дни недели. Пользователь выбирает направление перевода, тип тестирования и какие слова проверять. У него есть 10 вопросов, счетчик внизу считает количество вопросов и правильные и неправильные ответы. Переход к следующему вопросу по кнопке Далее.
Как написал в теме, вроде работает. Но хочется получить рекомендации и советы по коду, что можно улучшить. И есть несколько вопросов:
1. После 10 вопроса должен пропадать фрейм с заданием, и на его месте должен появляться фрейм frame_about. Не работает.
2. Хочу сделать, чтобы из меню Файл можно открывалось окно с выбором файла Excel - не знаю как, может кто-то подскажет?
Делал всё в PyCharm
from openpyxl import load_workbook import random import tkinter as tk i=0 counter_right = 0 counter_wrong = 0 class Answer: 'Варианты ответов' def __init__(self, top, bot, ans1,ans2,ans3): self.top = top self.bot = bot self.ans1 = ans1 self.ans2 = ans2 self.ans3 = ans3 class App(tk.Tk): 'Интерфейс' def __init__(self): super().__init__() global choice1 global choice2 global choice3 menu = tk.Menu(self) file_menu = tk.Menu(menu, tearoff=0) file_menu.add_command(label="Выбрать файл Excel") menu.add_cascade(label="Файл", menu=file_menu) menu.add_command(label="Выйти", command=self.destroy) self.config(menu=menu) self.title("Проверка знания слов греческого языка") self.resizable(False, False) w = 620 h = 400 ws = self.winfo_screenwidth() wh = self.winfo_screenheight() x = int(ws / 2 - w / 2) y = int(wh / 2 - h / 2) self.geometry("{0}x{1}+{2}+{3}".format(w, h, x, y)) self["bg"] = "cyan3" # Фреймы основного окна self.frame1 = tk.LabelFrame(self, bg="cyan3", bd=2, text="Выбор", font="Arial 12", ) self.frame1.grid(row=1, column=1, rowspan=2, padx=5, pady=5, sticky="ne") # Основные кнопки choice1 = tk.IntVar() self.r1 = tk.Radiobutton(self.frame1, text="Ru-Gr", font="Tahoma 12", variable=choice1, value=1, bg="cyan3") self.r2 = tk.Radiobutton(self.frame1, text="Gr-Ru", font="Tahoma 12", variable=choice1, value=2, bg="cyan3") choice1.set(1) self.r1.grid(row=0, column=0, padx=1, pady=1, sticky="w") self.r2.grid(row=1, column=0, padx=1, pady=1, sticky="w") self.label1 = tk.Label(self.frame1, text="_________________", font="Tahoma 10", bg="cyan3") self.label1.grid(row=3, column=0, padx=10, pady=2, columnspan=2) choice2 = tk.IntVar() self.r3 = tk.Radiobutton(self.frame1, text="Да/Нет", font="Tahoma 12", variable=choice2, value=1, bg="cyan3", ) self.r4 = tk.Radiobutton(self.frame1, text="Один из трех", font="Tahoma 12", variable=choice2, value=2, bg="cyan3",) choice2.set(1) self.r3.grid(row=4, column=0, padx=1, pady=1, sticky="w") self.r4.grid(row=5, column=0, padx=1, pady=1, sticky="w") self.label8 = tk.Label(self.frame1, text="_________________", font="Tahoma 10", bg="cyan3") self.label8.grid(row=6, column=0, padx=10, pady=2, columnspan=2) choice3 = tk.IntVar() self.r5 = tk.Radiobutton(self.frame1, text="Слова", fg="Black", font="Tahoma 12", variable=choice3, value=1, bg="cyan3") self.r6 = tk.Radiobutton(self.frame1, text="Числа", fg="Black", font="Tahoma 12", variable=choice3, value=2, bg="cyan3") self.r7 = tk.Radiobutton(self.frame1, text="Дни недели", fg="Black", font="Tahoma 12", variable=choice3, value=3, bg="cyan3") choice3.set(1) self.r5.grid(row=7, column=0, padx=1, pady=1, sticky="w") self.r6.grid(row=8, column=0, padx=1, pady=1, sticky="w") self.r7.grid(row=9, column=0, padx=1, pady=1, sticky="w") self.butStart = tk.Button(self.frame1, text="Начать", fg="Green", font="Tahoma 12", command=start) self.butStop = tk.Button(self.frame1, text="Закончить", fg="Red", font="Tahoma 12", command = stop ) self.butStart.grid(row=10, column=0, padx=5, pady=5, sticky="we") self.butStop.grid(row=11, column=0, padx=5, pady=5, sticky="we") self.frame_about = tk.LabelFrame(self, text ="Выберите задание", bg="cyan3", bd=2, width=570, font="Arial 12") self.label_start1 = tk.Label(self.frame_about, justify="left", text ="\n1. Выберите направление перевода: \n Русский - Греческий или Греческий - Русский", font="Arial 12", bg="cyan3") self.label_start2 = tk.Label(self.frame_about, justify="left", text ="2. Выберите задание: \n - Да/Нет - Необходимо ответить правильный \n или не правильный перевод предложен \n - Необходимо выбрать правильный вариант ответа", font="Arial 12", bg="cyan3") self.label_start3 = tk.Label(self.frame_about, justify="left", text ="3. Выберите тему: \n - Общая лексика \n - Числительные \n - Дни недели", font="Arial 12", bg="cyan3") self.frame_about.grid(row=1, column=0, padx=15, pady=5, sticky="new", ipadx=2, ipady=5) self.label_start1.grid(row=1, column=0, padx=10, pady=2, sticky="w") self.label_start2.grid(row=2, column=0, padx=10, pady=2, sticky="w") self.label_start3.grid(row=3, column=0, padx=10, pady=2, sticky="w") def count(self): self.frame_total = tk.LabelFrame(self, bg="cyan3", bd=2, width=570) self.frame_total.grid(row=2, column=0, padx=15, pady=5, sticky="sew", ipadx=5, ipady=5) self.label5 = tk.Label(self.frame_total, text="Счет:", font="Tahoma 16", bg="cyan3") self.labelTotal = tk.Label(self.frame_total, text=i, font="Tahoma 16", bg="cyan3", fg ="Blue") self.label_right = tk.Label(self.frame_total, text=counter_right, font="Tahoma 16", bg="cyan3", fg ="Green") self.label_wrong = tk.Label(self.frame_total, text=counter_wrong, font="Tahoma 16", bg="cyan3", fg ="Red") self.butNext = tk.Button(self.frame_total, text="Дальше", bg="White", fg="Green", font="Tahoma 15", width=10, height=1, command = round_1) self.label5.grid(row=1, column=0, padx=10, pady=2) self.labelTotal.grid(row=1, column=2, padx=10, pady=2) self.label_right.grid(row=1, column=3, padx=10, pady=2) self.label_wrong.grid(row=1, column=4, padx=10, pady=2) self.butNext.grid(row=1, column=5, sticky="e", pady=5) def choose_task1(self): self.frame_task1 = tk.LabelFrame(self, bg="cyan3", bd=2, text="Правильно или нет?", font="Arial 12", width=570, ) # Задание Yes/No self.labelTop = tk.Label(self.frame_task1, text=" ", font="Tahoma 18", bg="cyan3", width=20) self.labelBot = tk.Label(self.frame_task1, text=" ", font="Tahoma 18", bg="cyan3", width=20) self.labelAns1 = tk.Label(self.frame_task1, text=" ", font="Tahoma 18", bg="cyan3", ) self.butYes = tk.Button(self.frame_task1, text="Да", bg="Yellow green", fg="White", font="Tahoma 15", width=10, height=1, command = task1_ans_yes) self.butNo = tk.Button(self.frame_task1, text="Нет", bg="Indian red", fg="White", font="Tahoma 15", width=10, height=1, command = task1_ans_no) self.labelTop.grid(row=2, column=0, padx=10, pady=2) self.labelBot.grid(row=3, column=0, padx=10, pady=2) self.labelAns1.grid(row=4, column=0, padx=10, pady=2) self.butYes.grid(row=2, column=3, padx=2, pady=2, sticky="e") self.butNo.grid(row=3, column=3, padx=2, pady=2, sticky="e") def choose_task2(self): global choice4 # Задание 3-1 self.frame_task2 = tk.LabelFrame(self, bg="cyan3", bd=2, text="Выберите правильный вариант", font="Arial 12", width=570) self.labelQuest = tk.Label(self.frame_task2, text=answer1.top, font="Tahoma 18", bg="cyan3", width=20, fg='Blue') self.labelQuest.grid(row=1, column=0, padx=10, pady=2) choice4 = tk.IntVar() self.r8 = tk.Radiobutton(self.frame_task2, text=" ", fg="Black", font="Tahoma 16", variable=choice4, value=1, bg="cyan3") self.r9 = tk.Radiobutton(self.frame_task2, text=" ", fg="Black", font="Tahoma 16", variable=choice4, value=2, bg="cyan3") self.r10 = tk.Radiobutton(self.frame_task2, text=" ", fg="Black", font="Tahoma 16", variable=choice4, value=3, bg="cyan3") choice4.set(1) self.r8.grid(row=2, column=0, padx=1, pady=1, sticky="w") self.r9.grid(row=3, column=0, padx=1, pady=1, sticky="w") self.r10.grid(row=4, column=0, padx=1, pady=1, sticky="w") self.butApply = tk.Button(self.frame_task2, text="Ответить", bg="cyan4", fg="White", font="Tahoma 15", width=10, height=1, command=task2_check) self.butApply.grid(row=1, column=3, padx=2, pady=2, sticky="nsw") def disable_1(): #Деактивация кнопок основного меню app.r1["state"] = 'disabled' app.r2["state"] = 'disabled' app.r3["state"] = 'disabled' app.r4["state"] = 'disabled' app.r5["state"] = 'disabled' app.r6["state"] = 'disabled' app.r7["state"] = 'disabled' app.butStart["state"] = 'disabled' def active_1(): #Активация кнопок основного меню app.r1["state"] = 'normal' app.r2["state"] = 'normal' app.r3["state"] = 'normal' app.r4["state"] = 'normal' app.r5["state"] = 'normal' app.r6["state"] = 'normal' app.r7["state"] = 'normal' app.butStart["state"] = 'normal' def count_right(): #Счетчик правильных ответов global counter_right,i counter_right += 1 i +=1 def count_wrong(): #Счетчик неправильных ответов global counter_wrong,i counter_wrong += 1 i += 1 def task1(): #Задание 1 global ch, answer1,i app.choose_task1() disable_1() app.butNext["state"] = 'disable' app.frame_task1.grid(row=1, column=0, padx=15, pady=5, sticky="new", ipadx=5, ipady=5) app.labelTop.config(text=answer1.top) app.labelBot.config(text=answer1.bot) def task2(): #Задание 2 global list_task2 app.choose_task2() app.frame_task2.grid(row=1, column=0, padx=15, pady=5, sticky="new", ipadx=5, ipady=5) list_task2_1 = [answer1.ans1, answer1.ans2, answer1.ans3] list_task2_2 = set(list_task2_1) list_task2 = list(list_task2_2) app.r8["text"] = list_task2[0] app.r9["text"] = list_task2[1] app.r10["text"] = list_task2[2] disable_1() def task2_check(): #Проверка второго задания global choice4,list_task2, ch4 app.butNext["state"] = 'normal' app.butApply["state"] = 'disable' ch4 = choice4.get() if ch4 == 1: if list_task2[0] == answer1.ans1: app.r8.config(fg ="Green") count_right() elif list_task2[1] == answer1.ans1: app.r8.config(fg="Red") app.r9.config(fg ="Green") app.r10.config(fg ="Gray") count_wrong() elif list_task2[2] == answer1.ans1: app.r8.config(fg="Red") app.r9.config(fg="Gray") app.r10.config(fg="Green") count_wrong() elif ch4 == 2: if list_task2[1] == answer1.ans1: app.r9.config(fg ="Green") count_right() elif list_task2[0] == answer1.ans1: app.r9.config(fg="Red") app.r8.config(fg ="Green") app.r10.config(fg ="Gray") count_wrong() elif list_task2[2] == answer1.ans1: app.r9.config(fg="Red") app.r8.config(fg="Gray") app.r10.config(fg="Green") count_wrong() elif ch4 == 3: if list_task2[2] == answer1.ans1: app.r10.config(fg ="Green") count_right() elif list_task2[0] == answer1.ans1: app.r10.config(fg="Red") app.r8.config(fg ="Green") app.r9.config(fg ="Gray") count_wrong() elif list_task2[1] == answer1.ans1: app.r10.config(fg="Red") app.r8.config(fg="Gray") app.r9.config(fg="Green") count_wrong() total() def task1_ans_yes(): #Проверка первого задания при нажатии ДА global answer1, i app.butNext["state"] = 'normal' app.butYes["state"] = 'disable' app.butNo["state"] = 'disable' if answer1.bot == answer1.ans1: app.labelBot.config(text=answer1.ans1, fg="Green") count_right() else: app.labelBot.config(text=answer1.bot, fg="Red") app.labelAns1.config(text=answer1.ans1, fg="Green") count_wrong() total() def task1_ans_no(): #Проверка первого задания при нажатии НЕТ global answer1, i app.butNext["state"] = 'normal' app.butYes["state"] = 'disable' app.butNo["state"] = 'disable' if answer1.bot != answer1.ans1: app.labelAns1.config(text=answer1.ans1, fg="Green") app.labelBot.config(text=answer1.bot, fg="Red") count_right() else: app.labelBot.config(text=answer1.bot, fg="Red") app.labelAns1.config(text=answer1.ans1, fg="Green") count_wrong() total() def choiceLang(): #Выбор направления перевода global choice1, answer1, a, sheet c=0 d=0 e=0 while c == d or d == e or c == e: b = random.randint(1, a) c = random.randint(1, a) d = random.randint(1, a) e = random.randint(1, a) gr = sheet.cell(row=b, column=1).value ru = sheet.cell(row=b, column=2).value ruw1 = sheet.cell(row=c, column=2).value ruw2 = sheet.cell(row=d, column=2).value ruw3 = sheet.cell(row=e, column=2).value grw1 = sheet.cell(row=c, column=1).value grw2 = sheet.cell(row=d, column=1).value grw3 = sheet.cell(row=e, column=1).value if choice1.get() == 1: answer1 = Answer(ru, grw1, gr, grw2, grw3) else: answer1 = Answer(gr, ruw1, ru, ruw2, ruw3) return answer1 def exlist(): #Работа с файлом Excel global choice1, choice3, a, ch,sheet, s wb = load_workbook('dic.xlsx') s = choice3.get() sh = 'Sheet' + str(s) ch = choice1.get() sheet = wb[sh] a = sheet.max_row + 1 return (a, sheet, ch,s ) def total(): #Вывод результатов global i app.labelTotal.config(text=i) app.label_right.config(text= counter_right) app.label_wrong.config(text=counter_wrong) def round_1(): #Счетчик заданий global i if i < 10: start() else: stop() def start(): #Запуск задания global choice1, choice2, choice3, choice4, round1 app.frame_about.destroy() exlist() app.count() choiceLang() if choice2.get() == 1: task1() else: task2() def stop(): #Сброс global counter_wrong, counter_right, i, choice2 app.butNext["state"] = 'disable' if choice2.get == 1: app.frame_task1.destroy() elif choice2.get == 2: app.frame_task2.destroy() counter_wrong = 0 counter_right = 0 i = 0 active_1() app = App() app.mainloop()