Advertisement
Toxotsist

Task E1 на 11.05.2021

Apr 29th, 2021 (edited)
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.64 KB | None | 0 0
  1. import datetime
  2. import tkinter
  3. from tkinter import *
  4. import tkinter.ttk as ttk
  5. import urllib.request
  6. import xml.dom.minidom
  7. import datetime
  8. from datetime import *
  9. import matplotlib
  10. import dateutil.relativedelta
  11. import matplotlib.pyplot as plot
  12. ###
  13. import matplotlib.pyplot as plt
  14.  
  15. window = Tk()
  16. window.title("THE CALCULATOR")
  17. #window.resizable(width=False, height=False)
  18. window.geometry("1080x640")
  19. tab_control = ttk.Notebook(window)
  20. tab1 = ttk.Frame(tab_control)
  21. tab2 = ttk.Frame(tab_control)
  22. tab_control.add(tab1, text="Калькулятор валюты")
  23. tab_control.add(tab2, text="Динамика курса")
  24.  
  25. now = datetime.now()
  26. print('Сегодня:', now)
  27. print(now.year)
  28. u = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req=' + str(now.day) + '/' + '0' + str(now.month) + '/' + str(now.year)
  29. res = urllib.request.urlopen(str(u))
  30. dom = xml.dom.minidom.parse(res)
  31. dom.normalize()
  32. nodeArray = dom.getElementsByTagName("Valute")
  33. currency = {}
  34. count = 0
  35. keylog = []
  36. for node in nodeArray:
  37.     childList = node.childNodes
  38.     for child in childList:
  39.         if child.nodeName == 'Name':
  40.             currency.update({child.childNodes[0].nodeValue:0})
  41.         if child.nodeName == 'Value':
  42.             value = child.childNodes[0].nodeValue.replace(',', '.')
  43.             currency.update({list(currency)[-1]:value})
  44. for key in currency.keys():
  45.     keylog.append(key)
  46. print(currency)
  47. print(u)
  48.  
  49. def GetCurrencyIdList(cur):
  50.     u = 'http://www.cbr.ru/scripts/XML_val.asp?d=0'
  51.     res = urllib.request.urlopen(str(u))
  52.     dom = xml.dom.minidom.parse(res)
  53.     dom.normalize()
  54.     nodeArray = dom.getElementsByTagName("Item")
  55.     currency_id = {}
  56.     for node in nodeArray:
  57.         childList = node.childNodes
  58.         for child in childList:
  59.             if child.nodeName == 'Name':
  60.                 currency_id.update({child.childNodes[0].nodeValue: 0})
  61.             if child.nodeName == 'ParentCode':
  62.                 value = child.childNodes[0].nodeValue.replace('    ', '')
  63.                 currency_id.update({list(currency_id)[-1]: value})
  64.     return currency_id.get(cur)
  65.  
  66. def SwitchDate():
  67.     now = datetime.now()
  68.     if r_var.get() == 0:
  69.         print('МЕНЯЕМ МАСШТАБ')
  70.         x = []
  71.         for i in range(4):
  72.             delta = dateutil.relativedelta.relativedelta(days=7)
  73.             x.append(
  74.                 f'{(now - delta).strftime("%d")}.{(now - delta).strftime("%m")}.{(now - delta).year}-{now.strftime("%d")}.{now.strftime("%m")}.{now.year}')
  75.             now = now - delta
  76.         date_switch['values'] = x
  77.     if r_var.get() == 1:
  78.         print('МЕНЯЕМ МАСШТАБ')
  79.         x = []
  80.         for i in range(4):
  81.             delta = dateutil.relativedelta.relativedelta(months=1)
  82.             x.append(f'{(now-delta).strftime("%m")}')
  83.             now = now - delta
  84.         date_switch['values'] = x
  85.     if r_var.get() == 2:
  86.         print('МЕНЯЕМ МАСШТАБ')
  87.         x = []
  88.         delta = dateutil.relativedelta.relativedelta(months=1)
  89.         while (now).strftime("%m") != '01':
  90.             now = now - delta
  91.         for i in range(4):
  92.             delta = dateutil.relativedelta.relativedelta(months=3)
  93.             x.append(f'{(now).strftime("%m")}')
  94.             now = now + delta
  95.         date_switch['values'] = x
  96.     if r_var.get() == 3:
  97.         print('МЕНЯЕМ МАСШТАБ')
  98.         x = []
  99.         for i in range(4):
  100.             delta = dateutil.relativedelta.relativedelta(years=1)
  101.             x.append(f"{now.year}")
  102.             now = now - delta
  103.         date_switch['values'] = x
  104.  
  105. def GetCurrencyCurs_1():
  106.     cur = cur_switch.get()
  107.     id = GetCurrencyIdList(cur)
  108.     dat = date_switch.get().split('-')
  109.     date_req = []
  110.     for i in dat:
  111.         date_req.append(i.replace('.', '/'))
  112.     u = 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=' + date_req[0] + '&date_req2=' + date_req[1] + '&VAL_NM_RQ=' + str(id)
  113.     print(u)
  114.     res = urllib.request.urlopen(str(u))
  115.     dom = xml.dom.minidom.parse(res)
  116.     dom.normalize()
  117.     nodeArray = dom.getElementsByTagName("Record")
  118.     curs_list = []
  119.     for node in nodeArray:
  120.         childList = node.childNodes
  121.         for child in childList:
  122.             if child.nodeName == 'Value':
  123.                 curs_list.append(float(child.childNodes[0].nodeValue.replace(',', '.')))
  124.     print(curs_list)
  125.     return curs_list
  126.  
  127. def GetCurrencyCurs_2():
  128.     cur = cur_switch.get()
  129.     month = date_switch.get()
  130.     if int(month) % 2 == 1:
  131.         day = '31'
  132.     elif (int(month) % 2 == 0) & (int(month) != 2):
  133.         day = '30'
  134.     elif month == '02':
  135.         day = '28'
  136.     id = GetCurrencyIdList(cur)
  137.     u = 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=' + '01/' + month + '/2021' + '&date_req2=' + day + '/' + month + '/2021' + '&VAL_NM_RQ=' + str(id)
  138.     print(u)
  139.     res = urllib.request.urlopen(str(u))
  140.     dom = xml.dom.minidom.parse(res)
  141.     dom.normalize()
  142.     nodeArray = dom.getElementsByTagName("Record")
  143.     curs_list = []
  144.     for node in nodeArray:
  145.         childList = node.childNodes
  146.         for child in childList:
  147.             if child.nodeName == 'Value':
  148.                 curs_list.append(float(child.childNodes[0].nodeValue.replace(',', '.')))
  149.     print(curs_list)
  150.     return curs_list
  151.  
  152. def GetCurrencyCurs_3():
  153.     cur = cur_switch.get()
  154.     month = date_switch.get()
  155.     if int(month) == 1:
  156.         month2 = '0' + str(int(date_switch.get()) + 2)
  157.     elif int(month) == 4:
  158.         month2 = '0' + str(int(date_switch.get()) + 2)
  159.     elif int(month) == 7:
  160.         month2 = '0' + str(int(date_switch.get()) + 2)
  161.     elif int(month) == 10:
  162.         month2 = str(int(date_switch.get()) + 2)
  163.     id = GetCurrencyIdList(cur)
  164.     u = 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=' + '01/' + month + '/2021' + '&date_req2=' + '31/' + month2 + '/2021' + '&VAL_NM_RQ=' + str(id)
  165.     print(u)
  166.     res = urllib.request.urlopen(str(u))
  167.     dom = xml.dom.minidom.parse(res)
  168.     dom.normalize()
  169.     nodeArray = dom.getElementsByTagName("Record")
  170.     curs_list = []
  171.     for node in nodeArray:
  172.         childList = node.childNodes
  173.         for child in childList:
  174.             if child.nodeName == 'Value':
  175.                 curs_list.append(float(child.childNodes[0].nodeValue.replace(',', '.')))
  176.     print(curs_list)
  177.     return curs_list
  178.  
  179. def GetCurrencyCurs_4():
  180.     cur = cur_switch.get()
  181.     year = date_switch.get()
  182.     id = GetCurrencyIdList(cur)
  183.     if year == now.year:
  184.         u = 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=' + '01/01/' + str(
  185.             now.year) + '&date_req2=' + '0' + str(now.day) + '/' + '0' + str(now.month) + '/' + str(
  186.             now.year) + '&VAL_NM_RQ=' + str(id)
  187.     else:
  188.         u = 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=' + '01/01/' + str(
  189.             year) + '&date_req2=' + '31/12/' + str(year) + '&VAL_NM_RQ=' + str(id)
  190.     print(u)
  191.     res = urllib.request.urlopen(str(u))
  192.     dom = xml.dom.minidom.parse(res)
  193.     dom.normalize()
  194.     nodeArray = dom.getElementsByTagName("Record")
  195.     curs_list = []
  196.     for node in nodeArray:
  197.         childList = node.childNodes
  198.         for child in childList:
  199.             if child.nodeName == 'Value':
  200.                 curs_list.append(float(child.childNodes[0].nodeValue.replace(',', '.')))
  201.     print(curs_list)
  202.     return curs_list
  203.  
  204. def CreatePlot():
  205.     if r_var.get() == 0: # недели
  206.         x = []
  207.         y = GetCurrencyCurs_1()
  208.         print(y)
  209.         for i in range(len(y)):
  210.             x.append(i)
  211.         print(x)
  212.     elif r_var.get() == 1: # месяцы
  213.         x = []
  214.         y = GetCurrencyCurs_2()
  215.         print(y)
  216.         for i in range(len(y)):
  217.             x.append(i)
  218.         print(x)
  219.     elif r_var.get() == 2: # кварталы
  220.         x = []
  221.         y = GetCurrencyCurs_3()
  222.         print(y)
  223.         for i in range(len(y)):
  224.             x.append(i)
  225.         print(x)
  226.     elif r_var.get() == 3:  # годы
  227.         x = []
  228.         y = GetCurrencyCurs_4()
  229.         print(y)
  230.         date = datetime.now()
  231.         for i in range(len(y)):
  232.             x.append(i)
  233.         print(x)
  234.     matplotlib.use('TkAgg')
  235.     fig = plt.figure()
  236.     canvas = matplotlib.backends.backend_tkagg.FigureCanvasTkAgg(fig, master=tab2)
  237.     plot_widget = canvas.get_tk_widget()
  238.     fig.clear()
  239.     plt.plot(x, y)
  240.     plt.grid()
  241.     plot_widget.grid(column=4, row=4)
  242.  
  243. def Convert():
  244.     quant = float(quantity.get())
  245.     First_Cur = comboFirstCur.get()
  246.     Second_Cur = comboSecondCur.get()
  247.     First_Cur = float(currency.get(First_Cur))
  248.     Second_Cur = float(currency.get(Second_Cur))
  249.     res = (First_Cur/Second_Cur)*quant
  250.     lbl['text']=str(res)
  251.  
  252. top_frame = Frame(tab1)
  253. bottom_frame = Frame(tab1)
  254. right_topframe = Frame(tab1)
  255. button_frame = Frame(tab1)
  256. lbl_frame = Frame(tab1)
  257. comboFirstCur = ttk.Combobox(top_frame)
  258. comboSecondCur = ttk.Combobox(bottom_frame)
  259. quantity = ttk.Entry(right_topframe)
  260. lbl = Label(lbl_frame)
  261. top_frame.grid(column=0)
  262. bottom_frame.grid(column=0)
  263. right_topframe.grid(column=1, row=0, padx=20)
  264. button_frame.grid(column=2, row=0, padx=20)
  265. lbl_frame.grid(column=1, row=1, ipadx=50)
  266. button = Button(button_frame, text='Конвертировать', command=Convert)
  267. comboFirstCur["values"] = keylog
  268. comboSecondCur["values"] = keylog
  269. comboFirstCur.grid(ipadx=30, pady=20)
  270. comboSecondCur.grid(ipadx=30, pady=20)
  271. quantity.grid()
  272. button.grid()
  273. lbl.grid(padx=15)
  274. tab_control.pack(expand=1, fill='both')
  275.  
  276. top_left_lbl = Label(tab2, text='Валюта')
  277. top_center_lbl = Label(tab2, text='Период')
  278. top_right_lbl = Label(tab2, text='Выбор периода')
  279. top_left_lbl.grid(column=0, row=0, ipadx=15)
  280. top_center_lbl.grid(column=1, row=0, ipadx=15)
  281. top_right_lbl.grid(column=2, row=0, ipadx=15)
  282. plot_but = Button(tab2, text='Построить график', command=CreatePlot)
  283. plot_but.grid(column=0, row=3)
  284. top_left_frame = Frame(tab2)
  285. top_center_frame = Frame(tab2)
  286. top_right_frame = Frame(tab2)
  287. cur_switch = ttk.Combobox(top_left_frame)
  288. cur_switch['values'] = keylog
  289. cur_switch.grid()
  290. date_switch = ttk.Combobox(top_right_frame)
  291. top_left_frame.grid(column=0, row=1)
  292. top_right_frame.grid(column=2, row=1)
  293. r_var = IntVar()
  294. r_var.set(0)
  295. r1 = Radiobutton(top_center_frame, text='Неделя', variable=r_var, value=0, command=SwitchDate)
  296. r2 = Radiobutton(top_center_frame, text='Месяц', variable=r_var, value=1, command=SwitchDate)
  297. r3 = Radiobutton(top_center_frame, text='Квартал', variable=r_var, value=2, command=SwitchDate)
  298. r4 = Radiobutton(top_center_frame, text='Год', variable=r_var, value=3, command=SwitchDate)
  299. date_switch.grid()
  300. r1.grid()
  301. r2.grid()
  302. r3.grid()
  303. r4.grid()
  304. top_center_frame.grid(column=1, row=1)
  305. window.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement