ㅁ 개요
O 프로젝트 소개
- 이번 글은 이전글([파이썬 프로젝트 강좌(초급)/환율 계산기] - 환율 계산기 만들기 - 2.GUI 환율 계산기 - 실행버튼 클릭(한방향))에 이은 4번째 글로 실행버튼을 클릭하면 양방향(예: 원화 -> 달러, 달러->원화)으로 환율을 계산하도록 하는 방법을 알아보겠습니다.
O 완성된 프로그램 실행 화면
1. 3_1.py 실행 시 아래와 같이 실행됩니다.
환율 계산 코드를 넣지 않아 단순히 lineEdit, lineEdit_2의 값이 존재하는지 여부만 체크하고 있습니다.
2. 3_2.py 실행 시 아래와 같이 실행됩니다.
lineEdit(아래 (1)번) 에 값을 입력 후 실행하면 아래 실행결과에 환율과 업데이트 시간을 보여주고 있습니다.
다만, lineEdit_2(아래 그림에서 두번에 입력박스)에 입력 시 실행되는 코드는 아직 완성되지 않았습니다.
3. 3_3.py 실행 시 아래와 같이 실행됩니다.
lineEdit_2(아래 (1)번) 의 값을 입력 후 실행해도 잘 실행되는 것을 볼 수 있습니다.
(양방향으로 실행 가능)
ㅁ 세부 내용
O 완성된 소스
소스파일 : 3_1.py
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtWidgets
import os
from PyQt5.QtGui import *
import re
import requests
import json
from datetime import datetime
form_class = uic.loadUiType("exchangeRate.ui")[0]
class MyWindow(QMainWindow, form_class):
def __init__(self):
super().__init__()
self.setFixedSize(800,600)
self.setWindowIcon(QIcon("pagichacha.png"))
self.setupUi(self)
self.pushButton.clicked.connect(self.main)
def get_exchange_rate(self, base_currency, target_currency):
url = f"https://api.exchangerate-api.com/v4/latest/{base_currency}"
try:
response = requests.get(url)
data = json.loads(response.text)
if response.status_code == 200:
rate = data['rates'][target_currency]
last_updated = datetime.fromtimestamp(data['time_last_updated'])
print(f"현재 환율: 1 {base_currency} = {rate} {target_currency}")
print(f"마지막 업데이트: {last_updated}")
return rate, last_updated
else:
print("환율 정보를 가져오는데 실패했습니다.")
except requests.exceptions.RequestException as e:
print(f"오류 발생: {e}")
def main(self):
# present_value = self.lineEdit.text()
# print(present_value, type(present_value))
fromCurrency = self.comboBox.currentText()
toCurrency = self.comboBox_2.currentText()
####################################################################################
#### lineEdit 또는 lineEdit_2 중 하나의 에디트에 값을 주고 실행 시 다른 에디트에 값채우기 시작
####################################################################################
# lineEdit에 값이 있는 경우
if self.lineEdit.text() and not self.lineEdit_2.text():
print("lineEdit에 값이 존재하고, lineEdit_2에 값이 존재하지 않습니다.")
self.textEdit.setText("lineEdit에 값이 존재하고, lineEdit_2에 값이 존재하지 않습니다.")
# present_value = self.lineEdit.text()
# if re.match(r'^-?\d+(?:\.\d+)?$', present_value):
# present_value = float(present_value)
# rate, last_updated = self.get_exchange_rate(fromCurrency, toCurrency)
# converted_value = present_value * rate
# self.lineEdit_2.setText(f"{converted_value:.6f}")
# self.update_result_text(present_value, converted_value, rate, fromCurrency, toCurrency, last_updated)
# else:
# self.textEdit.setText("입력값은 숫자가 아닙니다. 숫자를 입력하여 주시기 바랍니다.")
# lineEdit_2에 값이 있는 경우
elif self.lineEdit_2.text() and not self.lineEdit.text():
print("lineEdit에 값이 존재하고, lineEdit_2에 값이 존재하지 않습니다.")
self.textEdit.setText("lineEdit에 값이 존재하지 않고, lineEdit_2에 값이 존재합니다.")
# present_value = self.lineEdit_2.text()
# if re.match(r'^-?\d+(?:\.\d+)?$', present_value):
# present_value = float(present_value)
# rate, last_updated = self.get_exchange_rate(toCurrency, fromCurrency) # 주의: 통화 순서 변경
# converted_value = present_value * rate
# self.lineEdit.setText(f"{converted_value:.6f}")
# self.update_result_text(present_value, converted_value, 1/rate, toCurrency, fromCurrency, last_updated)
# else:
# self.textEdit.setText("입력값은 숫자가 아닙니다. 숫자를 입력하여 주시기 바랍니다.")
else:
self.textEdit.setText("하나의 입력 필드에만 값을 입력해 주세요.")
#### lineEdit 또는 lineEdit_2 중 하나의 에디트에 값을 주고 실행 시 다른 에디트에 값채우기 끝
def update_result_text(self, input_value, output_value, rate, from_currency, to_currency, last_updated):
result_text = f"{input_value:,.6f} {from_currency}는 {output_value:,.6f} {to_currency} 입니다."
result_text += f"\n\n환율: 1 {from_currency} = {rate:,.6f} {to_currency}"
result_text += f"\n마지막 업데이트: {last_updated}"
self.textEdit.setText(result_text)
app=QApplication(sys.argv)
window = MyWindow()
window.show()
print("Before event loop")
app.exec_()
print("After event loop")
소스파일 : 3_2.py
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtWidgets
import os
from PyQt5.QtGui import *
import re
import requests
import json
from datetime import datetime
form_class = uic.loadUiType("exchangeRate.ui")[0]
class MyWindow(QMainWindow, form_class):
def __init__(self):
super().__init__()
self.setFixedSize(800,600)
self.setWindowIcon(QIcon("pagichacha.png"))
self.setupUi(self)
self.pushButton.clicked.connect(self.main)
def get_exchange_rate(self, base_currency, target_currency):
url = f"https://api.exchangerate-api.com/v4/latest/{base_currency}"
try:
response = requests.get(url)
data = json.loads(response.text)
if response.status_code == 200:
rate = data['rates'][target_currency]
last_updated = datetime.fromtimestamp(data['time_last_updated'])
print(f"현재 환율: 1 {base_currency} = {rate} {target_currency}")
print(f"마지막 업데이트: {last_updated}")
return rate, last_updated
else:
print("환율 정보를 가져오는데 실패했습니다.")
except requests.exceptions.RequestException as e:
print(f"오류 발생: {e}")
def main(self):
# present_value = self.lineEdit.text()
# print(present_value, type(present_value))
fromCurrency = self.comboBox.currentText()
toCurrency = self.comboBox_2.currentText()
####################################################################################
#### lineEdit 또는 lineEdit_2 중 하나의 에디트에 값을 주고 실행 시 다른 에디트에 값채우기 시작
####################################################################################
# lineEdit에 값이 있는 경우
if self.lineEdit.text() and not self.lineEdit_2.text():
print("lineEdit에 값이 존재하고, lineEdit_2에 값이 존재하지 않습니다.")
self.textEdit.setText("lineEdit에 값이 존재하고, lineEdit_2에 값이 존재하지 않습니다.")
present_value = self.lineEdit.text()
if re.match(r'^-?\d+(?:\.\d+)?$', present_value):
present_value = float(present_value)
rate, last_updated = self.get_exchange_rate(fromCurrency, toCurrency)
converted_value = present_value * rate
self.lineEdit_2.setText(f"{converted_value:.6f}")
self.update_result_text(present_value, converted_value, rate, fromCurrency, toCurrency, last_updated)
else:
self.textEdit.setText("입력값은 숫자가 아닙니다. 숫자를 입력하여 주시기 바랍니다.")
# lineEdit_2에 값이 있는 경우
elif self.lineEdit_2.text() and not self.lineEdit.text():
print("lineEdit에 값이 존재하고, lineEdit_2에 값이 존재하지 않습니다.")
self.textEdit.setText("lineEdit에 값이 존재하지 않고, lineEdit_2에 값이 존재합니다.")
# present_value = self.lineEdit_2.text()
# if re.match(r'^-?\d+(?:\.\d+)?$', present_value):
# present_value = float(present_value)
# rate, last_updated = self.get_exchange_rate(toCurrency, fromCurrency) # 주의: 통화 순서 변경
# converted_value = present_value * rate
# self.lineEdit.setText(f"{converted_value:.6f}")
# self.update_result_text(present_value, converted_value, 1/rate, toCurrency, fromCurrency, last_updated)
# else:
# self.textEdit.setText("입력값은 숫자가 아닙니다. 숫자를 입력하여 주시기 바랍니다.")
else:
self.textEdit.setText("하나의 입력 필드에만 값을 입력해 주세요.")
#### lineEdit 또는 lineEdit_2 중 하나의 에디트에 값을 주고 실행 시 다른 에디트에 값채우기 끝
def update_result_text(self, input_value, output_value, rate, from_currency, to_currency, last_updated):
result_text = f"{input_value:,.6f} {from_currency}는 {output_value:,.6f} {to_currency} 입니다."
result_text += f"\n\n환율: 1 {from_currency} = {rate:,.6f} {to_currency}"
result_text += f"\n마지막 업데이트: {last_updated}"
self.textEdit.setText(result_text)
app=QApplication(sys.argv)
window = MyWindow()
window.show()
print("Before event loop")
app.exec_()
print("After event loop")
소스파일 : 3_3.py
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtWidgets
import os
from PyQt5.QtGui import *
import re
import requests
import json
from datetime import datetime
form_class = uic.loadUiType("exchangeRate.ui")[0]
class MyWindow(QMainWindow, form_class):
def __init__(self):
super().__init__()
self.setFixedSize(800,600)
self.setWindowIcon(QIcon("pagichacha.png"))
self.setupUi(self)
self.pushButton.clicked.connect(self.main)
def get_exchange_rate(self, base_currency, target_currency):
url = f"https://api.exchangerate-api.com/v4/latest/{base_currency}"
try:
response = requests.get(url)
data = json.loads(response.text)
if response.status_code == 200:
rate = data['rates'][target_currency]
last_updated = datetime.fromtimestamp(data['time_last_updated'])
print(f"현재 환율: 1 {base_currency} = {rate} {target_currency}")
print(f"마지막 업데이트: {last_updated}")
return rate, last_updated
else:
print("환율 정보를 가져오는데 실패했습니다.")
except requests.exceptions.RequestException as e:
print(f"오류 발생: {e}")
def main(self):
# present_value = self.lineEdit.text()
# print(present_value, type(present_value))
fromCurrency = self.comboBox.currentText()
toCurrency = self.comboBox_2.currentText()
####################################################################################
#### lineEdit 또는 lineEdit_2 중 하나의 에디트에 값을 주고 실행 시 다른 에디트에 값채우기 시작
####################################################################################
# lineEdit에 값이 있는 경우
if self.lineEdit.text() and not self.lineEdit_2.text():
print("lineEdit에 값이 존재하고, lineEdit_2에 값이 존재하지 않습니다.")
self.textEdit.setText("lineEdit에 값이 존재하고, lineEdit_2에 값이 존재하지 않습니다.")
present_value = self.lineEdit.text()
if re.match(r'^-?\d+(?:\.\d+)?$', present_value):
present_value = float(present_value)
rate, last_updated = self.get_exchange_rate(fromCurrency, toCurrency)
converted_value = present_value * rate
self.lineEdit_2.setText(f"{converted_value:.6f}")
self.update_result_text(present_value, converted_value, rate, fromCurrency, toCurrency, last_updated)
else:
self.textEdit.setText("입력값은 숫자가 아닙니다. 숫자를 입력하여 주시기 바랍니다.")
# lineEdit_2에 값이 있는 경우
elif self.lineEdit_2.text() and not self.lineEdit.text():
print("lineEdit에 값이 존재하고, lineEdit_2에 값이 존재하지 않습니다.")
self.textEdit.setText("lineEdit에 값이 존재하지 않고, lineEdit_2에 값이 존재합니다.")
present_value = self.lineEdit_2.text()
if re.match(r'^-?\d+(?:\.\d+)?$', present_value):
present_value = float(present_value)
rate, last_updated = self.get_exchange_rate(toCurrency, fromCurrency) # 주의: 통화 순서 변경
converted_value = present_value * rate
self.lineEdit.setText(f"{converted_value:.6f}")
self.update_result_text(present_value, converted_value, 1/rate, toCurrency, fromCurrency, last_updated)
else:
self.textEdit.setText("입력값은 숫자가 아닙니다. 숫자를 입력하여 주시기 바랍니다.")
else:
self.textEdit.setText("하나의 입력 필드에만 값을 입력해 주세요.")
#### lineEdit 또는 lineEdit_2 중 하나의 에디트에 값을 주고 실행 시 다른 에디트에 값채우기 끝
def update_result_text(self, input_value, output_value, rate, from_currency, to_currency, last_updated):
result_text = f"{input_value:,.6f} {from_currency}는 {output_value:,.6f} {to_currency} 입니다."
result_text += f"\n\n환율: 1 {from_currency} = {rate:,.6f} {to_currency}"
result_text += f"\n마지막 업데이트: {last_updated}"
self.textEdit.setText(result_text)
app=QApplication(sys.argv)
window = MyWindow()
window.show()
print("Before event loop")
app.exec_()
print("After event loop")
O 소스 실행 방법
O 주요 내용
아래 소스코드에 대한 주요 내용만 설명하겠습니다.
(다수가 중복되어 이전 글과 동일한 소스는 설명에서 제외합니다.)
소스 파일 : 3_1.py
단순히 lineEdit, lineEdit_2에 값이 존재하는지 여부만 체크합니다.
line 58~60 : lineEdit에 값이 있으면 그 내용으로 textEdit(실행결과 화면)에 뿌려줍니다.
line 63~65 : lineEdit_2에 값이 있으면 그 내용으로 textEdit(실행결과 화면)에 뿌려줍니다.
line 67~68 : 그 외의 경우(둘 다 값이 있거나, 둘 다 값이 없는 경우) 하나만 입력하도록 안내 합니다.
소스 파일 : 3_2.py
단순히 lineEdit, lineEdit_2에 값이 존재하는지 여부만 체크합니다.
line 61 : lineEdit에 값을 읽어 와서 present_value변수에 담습니다.
line 62 : 입력값이 숫자인지 체크합니다.
line 67 : 입력값이 숫자이면 if문이 실행되며, 환율을 계산한 값을 보여주기 위해 update_result_text()함수를 호출 합니다.
line 81~85: update_result_text()함수로 계산된 환율을 textEdit로 뿌려줍니다.
소스 파일 : 3_3.py
위 3_2.py의 내용과 동일합니다.
ㅁ 정리
O 우리가 배운 내용
오늘은 여기까지이며, 위의 내용이 유익하셨다면, 광고 한번씩만 클릭 부탁드립니다.
감사합니다.
'파이썬 프로젝트 강좌(초급) > 환율 계산기' 카테고리의 다른 글
환율 계산기 만들기 - 5. GUI 환율 계산기 - 실행버튼 없이 실행(엔터시 실행) (0) | 2024.07.17 |
---|---|
환율 계산기 만들기 - 4. GUI 환율 계산기 - 실행버튼 없이 실행(change 이벤트) (0) | 2024.07.13 |
환율 계산기 만들기 - 2.GUI 환율 계산기 - 실행버튼 클릭(한방향) (1) | 2024.07.13 |
환율 계산기 만들기 - 1.텍스트 환율 계산기 (0) | 2024.07.13 |
환율 계산기 만들기 - 0.소개 (0) | 2024.07.13 |