CCCPaste

Code for Ilya

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()