货币转换(Python)

原理

爬取数据进行计算

灵感来源:https://gitee.com/huacaoye/the-money-converter

可以获取最近时间的汇率加以计算。

代码

# -*- coding: utf-8 -*-
# Environment    PyCharm
# File_name   conMon1 |User    Pfolg
# 2024/7/29   0:37
# -*- coding: utf-8 -*-
# Environment    PyCharm
# File_name   moneyConvert |User    Pfolg
# 2024/7/28   20:41
import os
from tkinter import ttk
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
import requests
import re

moneyUrl = "https://themoneyconverter.com/zh-CN"

moneyDict = {'阿联酋迪拉姆': 'AED', '阿根廷比索': 'ARS', '澳元': 'AUD', '阿魯巴弗羅林': 'AWG',
             '波斯尼亚和黑塞哥维那可兑换马克': 'BAM', '巴巴多斯元': 'BBD', '孟加拉塔卡': 'BDT', '保加利亞列弗': 'BGN',
             '巴林第纳尔': 'BHD', '百慕達元': 'BMD', '玻利維亞諾': 'BOB', '巴西雷亚尔': 'BRL', '巴哈馬元': 'BSD',
             '波札那普拉': 'BWP', '加元': 'CAD', '瑞士法郎': 'CHF', '智利比索': 'CLP', "人民币": "CNY",
             '哥伦比亚比索': 'COP', '捷克克朗': 'CZK', '丹麦克朗': 'DKK', '多明尼加比索': 'DOP', '埃及鎊': 'EGP',
             '欧元': 'EUR', '斐濟元': 'FJD', '英镑': 'GBP', '迦納塞地': 'GHS', '甘比亞達拉西': 'GMD',
             '瓜地馬拉格查爾': 'GTQ', '港元': 'HKD', '匈牙利福林': 'HUF', '印尼盾': 'IDR', '以色列谢克尔': 'ILS',
             '印度卢比': 'INR', '伊朗里亞爾': 'IRR', '冰岛克朗': 'ISK', '牙买加元': 'JMD', '约旦第纳尔': 'JOD',
             '日元': 'JPY', '肯尼亚先令': 'KES', '柬埔寨瑞爾': 'KHR', '韩元': 'KRW', '科威特第纳尔': 'KWD',
             '寮國基普': 'LAK', '黎巴嫩镑': 'LBP', '斯里兰卡卢比': 'LKR', '摩洛哥迪拉姆': 'MAD', '摩爾多瓦列伊': 'MDL',
             '阿里亞里': 'MGA', '馬其頓代納爾': 'MKD', '模里西斯盧比': 'MUR', '馬爾地夫拉菲亞': 'MVR',
             '墨西哥比索': 'MXN', '马来西亚林吉特': 'MYR', '纳米比亚元': 'NAD', '奈及利亞奈拉': 'NGN',
             '挪威克朗': 'NOK', '尼泊尔卢比': 'NPR', '新西兰元': 'NZD', '阿曼里亚尔': 'OMR', '巴拿马波亚': 'PAB',
             '秘鲁索尔': 'PEN', '菲律宾比索': 'PHP', '巴基斯坦卢比': 'PKR', '波兰兹罗提': 'PLN', '巴拉圭瓜拉尼': 'PYG',
             '卡塔尔里亚尔': 'QAR', '罗马尼亚列伊': 'RON', '塞爾維亞第納爾': 'RSD', '俄罗斯卢布': 'RUB',
             '沙特里亚尔': 'SAR', '塞席爾盧比': 'SCR', '瑞典克朗': 'SEK', '新加坡元': 'SGD', '泰铢': 'THB',
             '突尼斯第納爾': 'TND', '土耳其里拉': 'TRY', '特立尼达和多巴哥元': 'TTD', '新臺幣': 'TWD',
             '乌克兰格里夫纳': 'UAH', '烏干達先令': 'UGX', '美元': 'USD', '烏拉圭比索': 'UYU',
             '委内瑞拉玻利瓦尔': 'VES', '越南盾': 'VND', '中非法郎': 'XAF', '东加勒比海元': 'XCD', '西非法郎': 'XOF',
             '太平洋法郎': 'XPF', '南非南特': 'ZAR'}
moneyList = list(moneyDict.keys())


def openBrowse():
    with open(".\\run.bat", "w", encoding="utf-8") as file:
        file.write(f"start {moneyUrl}")
    os.system(".\\run.bat")
    os.remove(".\\run.bat")


def conMon(source, target, m):
    if source and target and m:
        url = f"https://themoneyconverter.com/zh-CN/{moneyDict.get(source)}/{moneyDict.get(target)}?amount=1"
        c = requests.get(url)
        c.encoding = "utf-8"
        pattern = r'1 (\w{3}) = ([\d.]+) (\w{3})'
        x = re.findall(pattern, c.text)
        rate = x[-1][1]
        out = eval(m) * eval(rate)

        e1.delete("0", "end")
        e1.insert("end", out)


def moneyConvert(frame):
    ttk.Label(frame, text="名存实亡的货币转换器(bushi", font=("微软雅黑 bold", 16)).place(relx=.3, rely=.1)
    box = ScrolledText(frame, width=40, height=0.01)
    box.place(relx=.3, rely=.2)
    box.insert("end", "你可以复制这个链接到浏览器打开:\n" + moneyUrl +
               "\n作者只是把前端做了,后端要一点点技术,拖着一点点完成吧。(上头了,于是做完了)"
               "\n项目灵感来源:https://gitee.com/huacaoye/the-money-converter"
               )
    box["state"] = "disabled"
    ttk.Button(frame, text="召唤真正的货币转换工具", command=openBrowse).place(relx=.4, rely=.9)

    ttk.Label(frame, text="From\t\t\t\t\tTo").place(relx=.2, rely=.4)
    sbox = ttk.Combobox(frame, values=moneyList, width=8)
    tbox = ttk.Combobox(frame, values=moneyList, width=8)
    sbox.set("人民币")
    tbox.set("美元")
    sbox.place(relx=.32, rely=.4)
    tbox.place(relx=.65, rely=.4)

    num = tk.StringVar()
    ttk.Entry(frame, textvariable=num, width=16).place(relx=.25, rely=.5)
    global e1
    e1 = ttk.Entry(frame, width=16)
    e1.place(relx=.6, rely=.5)
    # 中部符号按钮
    ttk.Button(
        frame, text=">>>", command=lambda: conMon(sbox.get(), tbox.get(), num.get())
    ).place(relx=.44, rely=.5)


if __name__ == '__main__':
    window = tk.Tk()
    window.title("货币转换")
    screen_w, screen_h = window.winfo_screenwidth(), window.winfo_screenheight()
    w, h = int(screen_w / 2), int(screen_h / 2)
    window.geometry(f'{w}x{h}+{int(screen_w / 4)}+{int(screen_h / 4)}')
    window.resizable(False, False)

    frame = ttk.Frame(window)
    frame.place(relx=0, rely=0, width=w, height=h)
    moneyConvert(frame)

    window.mainloop()

 实现效果

说明

此模块已集成到项目ToolsBox中。

吐槽

为什么我要用request而不用forex呢——因为一直报错用不了。

网上找不到好资源(于我而言),好资源都不便宜,有免费的但额度不多。

话说我这算铤而走险吗?不管了,反正有一个第三方库已经是“先贤”了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值