-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathcurrencyConverter.py
98 lines (76 loc) · 4.08 KB
/
currencyConverter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import requests
from tkinter import *
import tkinter as tk
from tkinter import ttk
import re
class RealTimeCurrencyConverter:
def __init__(self, url):
self.data = requests.get(url).json()
self.currencies = self.data['rates']
def convert(self, from_currency, to_currency, amount):
if from_currency != 'USD':
amount = amount / self.currencies[from_currency]
# limiting the precision to 4 decimal places
amount = round(amount * self.currencies[to_currency], 4)
return amount
class App(tk.Tk):
def __init__(self, converter):
tk.Tk.__init__(self)
self.title('Currency Converter')
self.currency_converter = converter
# self.configure(background = 'light-gray')
self.geometry("530x250")
# Label
self.intro_label = Label(self, text='Realtime Currency Converter', fg='black', bg='lightblue', relief=tk.RAISED,
borderwidth=3)
self.intro_label.config(font=('Helvetica', 15, 'bold'))
self.intro_label.place(relx=0.5, rely=0.08, anchor=tk.CENTER)
self.date_label = Label(self, text=f" Date : {self.currency_converter.data['date']}", relief=tk.GROOVE,
borderwidth=5)
self.intro_label.place(x=10, y=5)
self.date_label.place(x=200, y=50)
# Entry box
valid = (self.register(self.restrictNumberOnly), '%d', '%P')
self.amount_field = Entry(self, bd=3, relief=tk.RIDGE, justify=tk.CENTER, validate='key', validatecommand=valid)
self.converted_amount_field_label = Label(self, text='', fg='black', bg='white', relief=tk.RIDGE,
justify=tk.CENTER, width=17, borderwidth=3)
# dropdown
self.from_currency_variable = StringVar(self)
self.from_currency_variable.set("INR") # default value
self.to_currency_variable = StringVar(self)
self.to_currency_variable.set("USD") # default value
font = ("Helvetica", 12, "bold")
self.option_add('*TCombobox*Listbox.font', font)
self.from_currency_dropdown = ttk.Combobox(self, textvariable=self.from_currency_variable,
values=list(self.currency_converter.currencies.keys()), font=font,
state='readonly', width=12, justify=tk.CENTER)
self.to_currency_dropdown = ttk.Combobox(self, textvariable=self.to_currency_variable,
values=list(self.currency_converter.currencies.keys()), font=font,
state='readonly', width=12, justify=tk.CENTER)
# placing
self.from_currency_dropdown.place(x=30, y=120)
self.amount_field.place(x=36, y=150)
self.to_currency_dropdown.place(x=340, y=120)
# self.converted_amount_field.place(x = 346, y = 150)
self.converted_amount_field_label.place(x=346, y=150)
# Convert button
self.convert_button = Button(self, text="Convert", fg="black", bg="green", command=self.perform)
self.convert_button.config(font=('Helvetica', 10, 'bold'))
self.convert_button.place(x=225, y=135)
def perform(self):
amount = float(self.amount_field.get())
from_curr = self.from_currency_variable.get()
to_curr = self.to_currency_variable.get()
converted_amount = self.currency_converter.convert(from_curr, to_curr, amount)
converted_amount = round(converted_amount, 2)
self.converted_amount_field_label.config(text=str(converted_amount))
def restrictNumberOnly(self, action, string):
regex = re.compile(
r"[0-9,]*?(\.)?[0-9,]*$") # prevent users from entering non-numeric characters or multiple decimal points
result = regex.match(string)
return string == "" or (string.count('.') <= 1 and result is not None)
if __name__ == '__main__':
url = 'https://api.exchangerate-api.com/v4/latest/USD'
converter = RealTimeCurrencyConverter(url)
App(converter)
mainloop()