К чертям 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:\n\t1:Word To Translation;\n\t2: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("\n\nNothing\nWrong - {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("\n\nNothing\nRight - {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:\n\t1:Word To Translation;\n\t2: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()
ссылка на оригинал статьи http://habrahabr.ru/post/211466/
Добавить комментарий