Advertisement
BERKYT

Code for Ilya

Dec 16th, 2021 (edited)
1,268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.67 KB | None | 0 0
  1. from text_to_num import text2num
  2. from collections import Counter
  3. from tkinter import *
  4.  
  5. window = Tk()
  6. window.title("Добро пожаловать в приложение PythonRu")
  7. window.geometry('700x750')
  8. lbl = Label(window, text="Введите число:")
  9. lbl.grid(column=0, row=0)
  10. txt = Entry(window, width=10)
  11. txt.grid(column=1, row=0)
  12.  
  13.  
  14.  
  15. # Перевести на французский!!!
  16. # ---------------------
  17. g_lang = "en"
  18. # ---------------------
  19.  
  20.  
  21. # Не смотри на эту функцию - она большой костыль, потому что мне было лень думать
  22. # А вообще эта функция фильтрует слова, которые не подхоят text_to_num
  23. # Благодаря этой функции эта прога подходит ко всем языкам.
  24. def func_find_word_num(list_words):
  25.     list_words_checker = []
  26.  
  27.     for word in list_words:
  28.         # Костыль для английского языка. Почему - то эта библиотека не понимает слово million итд, но вот слово
  29.         # thousand, например, она может понять. Странно :ъ
  30.         if 'illion' in word and g_lang == "en":
  31.             list_words_checker.append(word)
  32.             continue
  33.  
  34.         try:
  35.             text2num(word, lang=g_lang)
  36.         except:
  37.             continue
  38.         else:
  39.             list_words_checker.append(word)
  40.  
  41.     return list_words_checker
  42.  
  43.  
  44. # Эта функция переводит арабские цифры в римские.
  45. def func_check_io(n):
  46.     result = ''
  47.  
  48.     for arabic, roman in zip((1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
  49.                              'M     CM   D    CD   C    XC  L   XL  X   IX V  IV I'.split()):
  50.         result += n // arabic * roman
  51.         n %= arabic
  52.  
  53.     return result
  54.  
  55.  
  56. # Эта функция просто считает сколько раз то или иное слово встретилось в списке
  57. def func_count_numbers_in_list(list_words):
  58.     return dict(Counter(list_words))
  59.  
  60.  
  61. # Эта функция просто считает сколько раз повторилось слово, которое не должно было повторяться.
  62. def func_count_repeat_numbers_in_list(list_words):
  63.     list_words_repeat = []
  64.  
  65.     for index in range(1, len(list_words)):
  66.         if list_words[index - 1] == list_words[index]:
  67.             list_words_repeat.append(list_words[index])
  68.         else:
  69.             continue
  70.  
  71.     return dict(Counter(list_words_repeat))
  72.  
  73.  
  74. # Эта функция генерирует список слов, которые являются цифрой так или иначе.
  75. def func_split_str_numbers(line):
  76.     list_words = line.split()
  77.     list_word_result = []
  78.  
  79.     for word in list_words:
  80.         for word_check in set(func_find_word_num(list_words)):
  81.             if word == word_check:
  82.                 list_word_result.append(word)
  83.             else:
  84.                 continue
  85.  
  86.     return list_word_result
  87.  
  88.  
  89. def clear():
  90.     list_ = window.grid_slaves()
  91.     for l in list_:
  92.         if l is txt or l is btn:
  93.             continue
  94.         l.destroy()
  95.  
  96.  
  97. # Главная функция
  98. def main():
  99.     clear()
  100.  
  101.     window.title("Добро пожаловать в приложение PythonRu")
  102.     window.geometry('700x750')
  103.     lbl = Label(window, text="Введите число:")
  104.     lbl.grid(column=0, row=0)
  105.     # txt = Entry(window, width=10)
  106.     # txt.grid(column=1, row=0)
  107.     # while True:
  108.     # number = input('\nВведите число: ').lower()
  109.     number = txt.get().lower()
  110.  
  111.     # if number == 'stop':
  112.     #     break
  113.  
  114.     try:
  115.         lbl1 = Label(window, text="Arabic = " +
  116.                                   str(text2num(number, lang=g_lang)))
  117.         lbl1.grid(column=1, row=1)
  118.  
  119.         lbl2 = Label(window, text="Roman = " +
  120.                                   str(func_check_io(text2num(number, lang=g_lang))))
  121.         lbl2.grid(column=1, row=2)
  122.  
  123.         # lbl1 += str(text2num(number, lang=g_lang))
  124.         # lbl2 += str(func_check_io(text2num(number, lang=g_lang)))
  125.     except Exception as e:
  126.         length = len(str(repr(e)))
  127.  
  128.         print('-' * length, '\nОшибка!\n')
  129.  
  130.         dict_repeat_num = func_count_repeat_numbers_in_list(func_split_str_numbers(number))
  131.         dict_num = func_count_numbers_in_list(func_split_str_numbers(number))
  132.  
  133.         set_incorrect_words = set(number.split())
  134.         set_repeat_num = set(dict_num.keys())
  135.         set_incorrect_words -= set_repeat_num
  136.  
  137.         def fabric(name: str) -> '(x: Any)':
  138.             return lambda row, key_, dict_repeat_num_, : Label(window, text=name.
  139.                                                                format(key_, dict_repeat_num_[key_])).grid(column=1,
  140.                                                                                                           row=row + 2)
  141.  
  142.         label = fabric('* {} повторяется {} лишний(их) раз')
  143.         for offset, key in enumerate(dict_repeat_num):
  144.             label(offset, key, dict_repeat_num)
  145.  
  146.         if set_incorrect_words != set():
  147.             lbl4 = Label(window, text=f'Некорректные слова:{set_incorrect_words}')
  148.             lbl4.grid(column=1, row=3)
  149.  
  150.         lbl5 = Label(window, text=f'Подробнее: {repr(e)}')
  151.         lbl5.grid(column=1, row=4)
  152.         # print()
  153.  
  154.  
  155. # Точка входа в программу
  156. if __name__ == '__main__':
  157.     btn = Button(window, text="Конвертировать!", command=main)
  158.     btn.grid(column=2, row=0)
  159.     window.mainloop()
  160.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement