import tkinter as tk
from tkinter import ttk, messagebox
import requests # pip install requests
from functools import partial
class CurrencyExchangeApp:
CURRENCIES = {
"USD": "Американский доллар",
"EUR": "Евро",
"JPY": "Японская йена",
"GBP": "Британский фунт стерлингов",
"AUD": "Австралийский доллар",
"CAD": "Канадский доллар",
"CHF": "Швейцарский франк",
"CNY": "Китайский юань",
"RUB": "Российский рубль",
"KZT": "Казахстанский тенге",
"UZS": "Узбекский сум"
}
def __init__(self):
self.window = tk.Tk()
self.window.title("Курс обмена валюты")
self.window.geometry("360x300")
self.create_widgets()
def create_widgets(self):
self.create_currency_section("Базовая валюта:", "base")
self.create_currency_section("Целевая валюта:", "target")
tk.Button(self.window, text="Получить курс обмена",
command=self.exchange).pack(padx=10, pady=10)
def create_currency_section(self, label_text, prefix):
tk.Label(self.window, text=label_text).pack(padx=10, pady=5)
combobox = ttk.Combobox(
self.window, values=list(self.CURRENCIES.keys()))
combobox.pack(padx=10, pady=5)
combobox.bind("<>",
partial(self.update_label, prefix))
setattr(self, f"{prefix}_combobox", combobox)
label = ttk.Label(self.window)
label.pack(padx=10, pady=10)
setattr(self, f"{prefix}_label", label)
def update_label(self, prefix, event):
combobox = getattr(self, f"{prefix}_combobox")
label = getattr(self, f"{prefix}_label")
code = combobox.get()
name = self.CURRENCIES.get(code, "")
label.config(text=name)
def exchange(self):
target_code = self.target_combobox.get()
base_code = self.base_combobox.get()
if not (target_code and base_code):
messagebox.showwarning("Внимание", "Выберите коды валют")
return
try:
response = requests.get(
f'https://open.er-api.com/v6/latest/{base_code}')
response.raise_for_status()
data = response.json()
exchange_rate = data['rates'].get(target_code)
if exchange_rate is None:
raise ValueError(f"Валюта {target_code} не найдена")
base = self.CURRENCIES[base_code]
target = self.CURRENCIES[target_code]
messagebox.showinfo("Курс обмена", f"Курс {
exchange_rate:.1f} {target} за 1 {base}")
except Exception as e:
messagebox.showerror("Ошибка", f"Ошибка: {e}")
def run(self):
self.window.mainloop()
if __name__ == "__main__":
app = CurrencyExchangeApp()
app.run()
результат выполнения программы
from tkinter import ttk
from tkinter import messagebox as mb
import requests
def update_b_label(event):
# Получаем полное название базовой валюты из словаря и обновляем метку
code = base_combobox.get()
name = currencies[code]
b_label.config(text=name)
def update_t_label(event):
# Получаем полное название целевой валюты из словаря и обновляем метку
code = target_combobox.get()
name = currencies[code]
t_label.config(text=name)
def exchange():
target_code = target_combobox.get()
base_code = base_combobox.get()
if target_code and base_code:
try:
response = requests.get(f'https://open.er-api.com/v6/latest/{base_code}')
response.raise_for_status()
data = response.json()
if target_code in data['rates']:
exchange_rate = data['rates'][target_code]
base = currencies[base_code]
target = currencies[target_code]
mb.showinfo("Курс обмена", f"Курс {exchange_rate:.1f} {target} за 1 {base}")
else:
mb.showerror("Ошибка", f"Валюта {target_code} не найдена")
except Exception as e:
mb.showerror("Ошибка", f"Ошибка: {e}")
else:
mb.showwarning("Внимание", "Выберите коды валют")
# Словарь кодов валют и их полных названий
currencies = {
"USD": "Американский доллар",
"EUR": "Евро",
"JPY": "Японская йена",
"GBP": "Британский фунт стерлингов",
"AUD": "Австралийский доллар",
"CAD": "Канадский доллар",
"CHF": "Швейцарский франк",
"CNY": "Китайский юань",
"RUB": "Российский рубль",
"KZT": "Казахстанский тенге",
"UZS": "Узбекский сум"
}
# Создание графического интерфейса
window = Tk()
window.title("Курс обмена валюты")
window.geometry("360x300")
Label(text="Базовая валюта:").pack(padx=10, pady=5)
base_combobox = ttk.Combobox(values=list(currencies.keys()))
base_combobox.pack(padx=10, pady=5)
base_combobox.bind("<<ComboboxSelected>>", update_b_label)
b_label = ttk.Label()
b_label.pack(padx=10, pady=10)
Label(text="Целевая валюта:").pack(padx=10, pady=5)
target_combobox = ttk.Combobox(values=list(currencies.keys()))
target_combobox.pack(padx=10, pady=5)
target_combobox.bind("<<ComboboxSelected>>", update_t_label)
t_label = ttk.Label()
t_label.pack(padx=10, pady=10)
Button(text="Получить курс обмена", command=exchange).pack(padx=10, pady=10)
window.mainloop()