from text_to_num import text2num
from collections import Counter
from tkinter import *
window = Tk()
window.title("Добро пожаловать в приложение PythonRu")
window.geometry('700x750')
lbl = Label(window, text="Введите число:")
lbl.grid(column=0, row=0)
txt = Entry(window, width=10)
txt.grid(column=1, row=0)
# Перевести на французский!!!
# ---------------------
g_lang = "en"
# ---------------------
# Не смотри на эту функцию - она большой костыль, потому что мне было лень думать
# А вообще эта функция фильтрует слова, которые не подхоят text_to_num
# Благодаря этой функции эта прога подходит ко всем языкам.
def func_find_word_num(list_words):
list_words_checker = []
for word in list_words:
# Костыль для английского языка. Почему - то эта библиотека не понимает слово million итд, но вот слово
# thousand, например, она может понять. Странно :ъ
if 'illion' in word and g_lang == "en":
list_words_checker.append(word)
continue
try:
text2num(word, lang=g_lang)
except:
continue
else:
list_words_checker.append(word)
return list_words_checker
# Эта функция переводит арабские цифры в римские.
def func_check_io(n):
result = ''
for arabic, roman in zip((1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
'M CM D CD C XC L XL X IX V IV I'.split()):
result += n // arabic * roman
n %= arabic
return result
# Эта функция просто считает сколько раз то или иное слово встретилось в списке
def func_count_numbers_in_list(list_words):
return dict(Counter(list_words))
# Эта функция просто считает сколько раз повторилось слово, которое не должно было повторяться.
def func_count_repeat_numbers_in_list(list_words):
list_words_repeat = []
for index in range(1, len(list_words)):
if list_words[index - 1] == list_words[index]:
list_words_repeat.append(list_words[index])
else:
continue
return dict(Counter(list_words_repeat))
# Эта функция генерирует список слов, которые являются цифрой так или иначе.
def func_split_str_numbers(line):
list_words = line.split()
list_word_result = []
for word in list_words:
for word_check in set(func_find_word_num(list_words)):
if word == word_check:
list_word_result.append(word)
else:
continue
return list_word_result
def clear():
list_ = window.grid_slaves()
for l in list_:
if l is txt or l is btn:
continue
l.destroy()
# Главная функция
def main():
clear()
window.title("Добро пожаловать в приложение PythonRu")
window.geometry('700x750')
lbl = Label(window, text="Введите число:")
lbl.grid(column=0, row=0)
# txt = Entry(window, width=10)
# txt.grid(column=1, row=0)
# while True:
# number = input('\nВведите число: ').lower()
number = txt.get().lower()
# if number == 'stop':
# break
try:
lbl1 = Label(window, text="Arabic = " +
str(text2num(number, lang=g_lang)))
lbl1.grid(column=1, row=1)
lbl2 = Label(window, text="Roman = " +
str(func_check_io(text2num(number, lang=g_lang))))
lbl2.grid(column=1, row=2)
# lbl1 += str(text2num(number, lang=g_lang))
# lbl2 += str(func_check_io(text2num(number, lang=g_lang)))
except Exception as e:
length = len(str(repr(e)))
print('-' * length, '\nОшибка!\n')
dict_repeat_num = func_count_repeat_numbers_in_list(func_split_str_numbers(number))
dict_num = func_count_numbers_in_list(func_split_str_numbers(number))
set_incorrect_words = set(number.split())
set_repeat_num = set(dict_num.keys())
set_incorrect_words -= set_repeat_num
def fabric(name: str) -> '(x: Any)':
return lambda row, key_, dict_repeat_num_, : Label(window, text=name.
format(key_, dict_repeat_num_[key_])).grid(column=1,
row=row + 2)
label = fabric('* {} повторяется {} лишний(их) раз')
for offset, key in enumerate(dict_repeat_num):
label(offset, key, dict_repeat_num)
if set_incorrect_words != set():
lbl4 = Label(window, text=f'Некорректные слова:{set_incorrect_words}')
lbl4.grid(column=1, row=3)
lbl5 = Label(window, text=f'Подробнее: {repr(e)}')
lbl5.grid(column=1, row=4)
# print()
# Точка входа в программу
if __name__ == '__main__':
btn = Button(window, text="Конвертировать!", command=main)
btn.grid(column=2, row=0)
window.mainloop()