Очень прошу ревью кода. И есть пара вопросов по выбору файла с появлением/исчезанием фрейма

Andrey6570

Новичок
Пользователь
Янв 25, 2021
6
0
1
Я только начал разбираться с Python, всего две недели. До этого только Basic в школе и HTML в универе.
Попробовал написать программу, которая проверяет знание иностранного языка, в частности греческих слов.

ТЗ: Есть файл Excel, который содержит три листа с парами слов на греческом и русском - общая лексика, числа и дни недели. Пользователь выбирает направление перевода, тип тестирования и какие слова проверять. У него есть 10 вопросов, счетчик внизу считает количество вопросов и правильные и неправильные ответы. Переход к следующему вопросу по кнопке Далее.
Как написал в теме, вроде работает. Но хочется получить рекомендации и советы по коду, что можно улучшить. И есть несколько вопросов:

1. После 10 вопроса должен пропадать фрейм с заданием, и на его месте должен появляться фрейм frame_about. Не работает.

2. Хочу сделать, чтобы из меню Файл можно открывалось окно с выбором файла Excel - не знаю как, может кто-то подскажет?

Код не могу разместить из-за ограничений количества символов в сообщении, поэтому размещаю его в виде txt

Делал всё в PyCharm
 

Вложения

  • Greek.txt
    15,3 КБ · Просмотры: 1

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
1. После 10 вопроса должен пропадать фрейм с заданием, и на его месте должен появляться фрейм frame_about. Не работает.
Без файла с данными трудно проверить.
2. Хочу сделать, чтобы из меню Файл можно открывалось окно с выбором файла Excel - не знаю как, может кто-то подскажет?
Можно с делать с помощью tkinter.filedialog:
- к кнопке привязать функцию
Python:
file_menu.add_command(label="Выбрать файл Excel", command=self.open_file)
- в функции открыть файл и сохранить в переменную класса в нужном виде (словарь, список и т. д.)
Python:
from tkinter import filedialog as fd


...
def open_file(self):
    filename = fs.askopenfilename() # имя выбранного файла
    # дальше открывайте его через openpyxl
    # получайте данные и сохраняйте в нужный формат (словарь например)
    self.questions_and_answers = ...
    # после чего можно работать с данными из файла
хочется получить рекомендации и советы по коду, что можно улучшить
- в коде много глобалов (global var) не понятно зачем нужно их использовать вместе с классами, можно все глобалы заменить аттрибутами классов (self.var).
- много повторяющегося кода, например создание и позиционирование виджетов (это можно делать в цикле)
- часть кода внутри классов, часть в виде функции вне классов (можно все сделать внутри классов)
 

Andrey6570

Новичок
Пользователь
Янв 25, 2021
6
0
1
Большое спасибо за подсказки.

Вы не могли бы еще немножко уточнить:

- много повторяющегося кода, например создание и позиционирование виджетов (это можно делать в цикле)

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

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
не могли бы Вы дать пример того, как это можно реализовать
Вот пара простых примеров на основе вашего кода:
Python:
# 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")

for i in range(1, 4):
    getattr(self, f'label_start{i}').grid(row=i, column=0, padx=10, pady=2, sticky="w")
Python:
# 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.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.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")

d = {'r1': 0, 'r2': 1, 'r3': 4, 'r4': 5, 'r5': 7, 'r6': 8, 'r7': 9}

for k, v in d.items():
    getattr(self, k).grid(row=v, column=0, padx=1, pady=1, sticky="w")
Можно также немного поменять виджеты чтобы было удобнее создавать их в цикле.
 

Форум IT Специалистов