Найти - Пользователи
Полная версия: Очень прошу ревью кода. И есть пара вопросов по выбору файла с появлением/исчезанием фрейма
Начало » Python для новичков » Очень прошу ревью кода. И есть пара вопросов по выбору файла с появлением/исчезанием фрейма
1
Andrey6570
Всем привет!

Я только начал разбираться с 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()
AD0DE412
Andrey6570
Хочу сделать, чтобы из меню Файл можно открывалось окно с выбором файла Excel - не знаю как, может кто-то подскажет?
Делал всё в PyCharm
https://docs.python.org/3.9/library/dialog.html

зы а зачем вы в глобальном пространстве так … ммм эээ активно работаете
Andrey6570
Спасибо большое. Сейчас попробую.
doza_and
Andrey6570
Но хочется получить рекомендации и советы по коду, что можно улучшить
Напрашивается заменить всякие ваши r1,r2,r7, label_start1,label_start2,label_start3 на массивы и работать с ними циклами.

Ну и может вам глянуть на pyqt или wxpython?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB