На хабре уже не раз поднималась тема изучения английского языка (пруф). Она рассматривалась с разных ракурсов. Кто-то писал, что не зачем учить слова, при изучении иностранного. Кто-то делился способами, коих великое множество, от простых карточек, до целой тетради, исписанной по самое не хочу. В конце концов есть LinguaLeo, так же замечательный сервис, на котором без дополнительной платы можно учить по 10 слов в день. Хотя иногда платить не хочется, а 10 слов кажутся весьма небольшим количество для молодого организма, который познает таинства и прелести иностранной мовы. Тогда возможно этот скрипт вам будет полезен.
К чертям GUI!
Нет. Не вообще к чертям, а в данной задаче. Все что нам требуется это прочитать слово, написать его перевод и нажать клавишу Enter. Довольно простой механизм работы. Так зачем же напрягаться и насиловать ради этого tkinter?
JSON спешит нам на помощь
Тут конечно на любителя. Я использовал JSON. Кому-то по нраву XML. Структура данных будет довольно простая.
{
"catch, caught, caught":"ловить, хватать, успеть",
"fly, flew, flown":"летать, пролетать"
}
Сохраняем подобный «словарь» из двух слов в файл, который мы назовем для примера english.json, а что бы лишний раз не настраивать локаль сохраняем его в кодировке Windows 866 (уверен, что для Linux подойдет UTF-8).
Его сиятельство код
Перво-наперво импортируем модуль sys, и модуль random.
import sys
import random
Далее мы неожиданно для себя определяем классическую функцию main. По замыслу, она сразу же потребует словарь, который будет необходимо указать в параметрах при запуске скрипта.
def main():
try:
wordict = eval(open(sys.argv[1]).read()) # открываем словарь
except:
print "You have to enter all parameters.nExample: python wordrepeater.py yourdictionary.json" #вроде бы достаточно информативно?
raw_input("")
Теперь у нас есть словарь wordict. Дальше нужно сделать два режима прохода по словарю. Первый — скрипт выдает нам английское слово, а мы в ответ один из его переводов. Второй проход прямо противоположный — скрипт нам русское слово, а мы ему английское. Сдесь на помощь приходит конструктор словарей.
mode = raw_input("Choose mode:nt1:Word To Translation;nt2:Translation To Word.n>> ");
if mode == "2": wordict = {wordict[k]:k for k in wordict.keys()} #здесь не хитрым образом ключи словаря меняются местами с их значениями.
После проделанных манипуляций остается несколько строчек, которые и будут осуществлять прогон по всему словарю. Можно их описать внутри функции main, хотя я предпочел описать еще одну функцию.
def keysToValues(dic): # функции потребуется словарь для работы
wrong = 0 # фиксируем количество ошибок
keys = dic.keys() # извлекаем список со всеми ключами нашего словаря.
while True:
tmpkey = random.choice(keys) # извлекаем случайное слово из словаря
print "{0}: {1}".format(len(keys), tmpkey) # выводим слово на экран. Вместе с ним выводится счетчик оставшихся слов
value = dic[tmpkey] # запоминаем все значения этого слова
if raw_input("Translation: ") in value.split(", "): # пишем наш "правильный" ответ, который сразу же сравнивается с любым из значений
print "True. {0}n".format(value)
keys.remove(tmpkey) # ура! правильно! слово удаляется из списка.
else:
wrong += 1
print "Wrong! {0}n".format(value) # упс... на одну ошибку больше.
if len(keys) < 1: # все слова угаданы. В нашем спуске нет ни одного слова.
raw_input("nnNothingnWrong - {0}".format(wrong)) # здесь будет написано количество ошибок
sys_exit() # после нажатия Enter, все закончится
Все что осталось сделать — это запустить эту функцию в main, а после запустить main.
keysToValues(wordict)
if __name__ == "__main__":
main()
При наличии свободного времени и этого скрипта, получается выучить до 50 (больше я не пробовал) английских слов за вечер. Самое утомительное это заполнять словарь. Но я уверен, что это не утомительней составления карточек.
Итоговый результат.
import sys
import random
def keysToValues(dic):
wrong = 0
right = 0
keys = dic.keys()
while True:
tmpkey = random.choice(keys)
print "{0}: {1}".format(len(keys), tmpkey)
#print str(len(keys))+":", tmpkey
value = dic[tmpkey]
#answ = raw_input("Translation: ")
if raw_input("Translation: ") in value.split(", "):
print "True. {0}n".format(value) #fjf
right += 1
keys.remove(tmpkey)
else:
wrong += 1
print "Wrong! {0}n".format(value)
if len(keys) < 1:
raw_input("nnNothingnRight - {0}. Wrong - {1}".format(right, wrong))
sys_exit()
def main():
try:
wordict = eval(open(sys.argv[1]).read())
except:
print "You have to enter all parameters.nExample: python wordrepeater.py yourdictionary.json"
raw_input("")
mode = raw_input("Choose mode:nt1:Word To Translation;nt2:Translation To Word.n>> ");
if mode == "2": wordict = {wordict[k]:k for k in wordict.keys()}
elif mode == "":
print "Exit"
sys.exit()
keysToValues(wordict)
if __name__ == "__main__":
main()
Автор: Koshelenok