如何建立一个货币转换工具Python桌面应用程序

457 阅读7分钟

Python是一种优秀的编程语言,用于创建各种方便的脚本和程序。今天我们要建立一个货币兑换工具。我们将通过所有必要的细节来理解代码,即使你是一个绝对的初学者。

什么是货币兑换器?

货币兑换器是用来计算一种货币与另一种货币的等值的工具。 网上有各种货币兑换工具,你可以选择两种货币,输入金额并获得兑换值。

最简单的Python货币兑换器是什么?

建立转换器的最基本方法是要求用户输入汇率和要转换的金额。然而,从用户体验的角度来看,这是不方便的。让我们一起做个热身练习吧。

# The latest exchange rate from USD to EUR:
exchange_rate = 0.9453582907922102
# Let's convert $10 to euro
usd = 10
euro = exchange_rate*usd
print("$%.2f = %.2f EUR" % (usd, euro))

"""
Output:
$10.00 = 9.45 EUR
"""

如何使工具自动获得货币汇率?

有各种免费的Python软件包可以下载货币汇率数据。在这个例子中,我们将使用forex-python包。通过进入工具 -> 工具 -> 使用 pip 安装包,可以在 PyScripter 中轻松安装它。在字段中,你必须输入forex-python,然后按确定。不久之后,该包就安装完毕,你就可以开始使用它了。下面是一个例子,说明如何获得美元对其他货币的所有汇率。之后,我们将10美元换成欧元。

from forex_python.converter import CurrencyRates

c = CurrencyRates()

# get the latest currency exchange rate
USD_rates = c.get_rates('USD')
print(USD_rates)

usd = 10
euro = c.convert('USD', 'EUR', usd)
print("$%.2f = %.2f EUR" % (usd, euro))


"""
{'EUR': 0.9453582907922102, 'JPY': 133.94781622234825, 'BGN': 1.8489317451314047, 'CZK': 23.355076574021552, 'DKK': 7.032425789374172, 'GBP': 0.8040083191529589, 'HUF': 376.70637171487994, 'PLN': 4.353658536585366, 'RON': 4.674040461334846, 'SEK': 9.950368689733407, 'CHF': 0.9835507657402155, 'ISK': 130.17583664208732, 'NOK': 9.594913972395537, 'HRK': 7.111457742484401, 'TRY': 17.027415390432974, 'AUD': 1.403384382681036, 'BRL': 4.889204008319153, 'CAD': 1.2747211193042163, 'CNY': 6.699565135186235, 'HKD': 7.849404424276801, 'IDR': 14552.155416903006, 'INR': 77.83654755152202, 'KRW': 1270.7978823974286, 'MXN': 19.690395159765547, 'MYR': 4.401966345244847, 'NZD': 1.558139534883721, 'PHP': 53.03554547173378, 'SGD': 1.3821138211382114, 'THB': 34.764605785592735, 'ZAR': 15.618169786349027}
$10.00 = 9.45 EUR
"""

该软件包获取的是最新的汇率,尽管稍作修改也可以给出过去的数据。可以给一个日期时间对象作为get_rate()函数的参数。

如何为货币兑换器Python桌面应用工具建立GUI?

构建一个Python桌面应用程序是你可以给自己的一个很好的挑战。有几个软件包允许你创建窗口、菜单、添加按钮、列表等等。你的想象力就是极限。我们之前已经回顾了一些流行的Python GUI包。

今天我们将使用Embarcadero的DelphiVCL4Python来构建我们的应用程序。博客里有很多资源,但我将简单介绍一下如何构建Python图形界面。我首先要说明的是,对于某些平台,包的名称有不同的大写。我在Windows下的版本完全是用小写的,虽然有些人要写成DelphiVCL。

# under Windows:
from delphivcl import *

# alternative capitalization
from DelphiVCL import *

我从现有的例子出发,建立了这个图形化程序的例子。我从DelphiVCL4Python的GitHub页面借用了这个例子。还有一个关于该主题的YouTube教程,强烈推荐大家去看看。我还使用了这个博客上发布的不错的例子。

如何实际编码我们的Python桌面应用程序?

如何初始化、显示和退出我们的Python桌面应用程序

应用程序在main函数中被定义、初始化、启动和关闭。在这个例子中,对象MainForm指的是一个叫做ActivityIndicatorForm的类。

def main():
    Application.Initialize()
    Application.Title = "Activity Indicator"
    MainForm = ActivityIndicatorForm(Application)
    MainForm.Show()
    FreeConsole()
    Application.Run()
    MainForm.Destroy()

ActivityIndicatorForm类包含一长串的函数。自然,有一个初始化函数和一个创建组件的函数。在这个例子中,我们将使用的组件是一个单选按钮的列表、一个输入字段、一个按钮和关于它们的标签。窗口还有一个基本的带有退出按钮的文件菜单,尽管对于这样一个简单的程序来说,它是可有可无的,因为顶部栏上已经有了x。

How To Build A Currency Converter Tool Python Desktop App - image of defining the Python GUI

如何定义Python应用程序的组件

该库的代码在大多数时候都是直观的、不言自明的。在我看来,唯一不太清楚的定义是 "TEdit "组件,即一个文本输入域。

def __create_comps(self):
        self.od_styles = FileOpenDialog(self)
        self.mm_menu = MainMenu(self)
        self.mi_file = self.mm_menu.CreateMenuItem()
        self.mi_load_style = self.mm_menu.CreateMenuItem()
        self.mi_exit = self.mm_menu.CreateMenuItem()
        self.output_amount_label = Label(self)
        self.input_currency_list = RadioGroup(self)
        self.output_currency_list = RadioGroup(self)
        self.input_field = CreateComponent('TEdit',self)
        self.label_input_amount = CreateComponent('TLabel',self)
        self.button_calc = Button(self)

如何配置Python GUI组件的属性

每个组件都有各种参数和属性需要设置,包括宽度、高度、标题以及项目被点击时要发生的事件。我们设置窗口的标题,以及它的大小,并初始化一个菜单。

self.caption = "Currency exchange converter"
self.SetProps(ClientHeight = 328, ClientWidth = 452, Position = "poScreenCenter", OnClose = self.__on_form_close)
self.SetProps(Menu = self.mm_menu)

菜单被作为项目添加到我们在对象mm_menu中定义的主菜单中。每个菜单都有一个索引。在这里,我们只有一个,因此数字是0。 第二个参数是子菜单的名称。

self.mm_menu.Items.Insert(0, self.mi_file)

子菜单项目是以类似的方式添加的。它们的属性中最重要的可能是条目被点击时发生的事件。

self.mi_exit.SetProps(Caption = "Exit", OnClick = (lambda sender: Application.Terminate()))

文本可以作为标签的标题属性被添加。位置是用Left和Top参数定义的。

self.label_input_amount.SetProps(Parent = self, Caption = 'Enter input amount:', Left = 20, Top = 14, Width = 121, Height = 30)

文本输入栏的设置也非常简单。有两个重要的点。属性Text是在用户输入任何文本之前,字段中可见的内容。在这里,我把0作为一个默认的金额来转换。属性Name是一种从代码中引用该组件的方式。我将很快回到它。

self.input_field.SetProps(Parent = self, Text = '0', Name = 'input_field', Left = 20, Top = 40, Width = 121, Height = 30)

例如,货币可以被添加为单选按钮。我也可以用一个下拉列表。每种货币都作为一个项目被添加到列表中。最后,我们定义第一个单选按钮被选中。在某些情况下,它可以被排除在外。在这里,如果用户在选择货币之前点击计算按钮,会导致程序崩溃。

self.input_currency_list.SetProps(Parent = self, Left = 20, Top = 120, Width = 145, Height = 117, Caption = 'Input currency', TabOrder = 0)
self.input_currency_list.Items.Add('USD')
self.input_currency_list.Items.Add('EUR')
self.input_currency_list.Items.Add('NOK')
self.input_currency_list.Items.Add('AUD')
self.input_currency_list.Items.Add('JPY')
self.input_currency_list.SetProps(ItemIndex = 0)

与文本字段类似,该按钮也有一个标题和一个名称。很明显,当点击它时,它也需要一个事件发生;否则,它就没有用了。这个按钮从这个类中调用了名为 __convert_currency 的函数。

self.button_calc.SetProps(Parent=self, Caption = 'Calculate', Name = 'button_calc', Left = 20, Top = 70, Width = 60, Height = 30, OnClick = self.__convert_currency)

如何使 Python 执行货币转换

货币转换需要输入金额、输入货币和输出货币。要转换的金额是在文本字段中输入的。Python 将其视为一个字符串,所以我们需要将其转换为一个数字。

input_amount = float(self.input_field.Text)

float 函数验证了输入是否合理。如果我输入字母,它会给出一个错误。不过,程序不会崩溃,用户可以纠正他们的错误。

How To Build A Currency Converter Tool Python Desktop App - an image of the currency convertor showing an error due to a floating point conversion

用户通过单选按钮提供货币,所以我们需要一种方法来读取所选的值。所选单选按钮的索引被存储在

self.input_currency_list.ItemIndex

在这个例子中,这个变量是一个介于0和4之间的数字,因为我们已经定义了五种货币。我可以使用这个索引来获得属于该条目的文本是什么。这个字符串被存储为一个项目。

selected_input_currency = self.input_currency_list.Items[self.input_currency_list.ItemIndex]

我在这里有点偷懒。我可以用这种方式来分割它。

input_currency_index = self.input_currency_list.ItemIndex
selected_input_currency = self.input_currency_list.Items[input_currency_index]

变量selected_input_currency是一个字符串,是我们所定义的五种货币之一。

关于我们的货币转换Python桌面应用程序工具的更多提示和解释

我希望这不会让人觉得太难受。如果你是一个初学者,类可能看起来太难掌握了,但实际上,它们只是一个由函数和变量组成的组件。这些函数对于类之外的代码来说是不能直接使用的。这使得整合来自不同包的、可能具有相同函数名称的类更加顺畅。

自我量是在面向对象编程中经常看到的东西。这是一种访问属于对象或类的变量和函数的方式。

以下是编写货币兑换器Python桌面应用工具的完整示例代码

import os
from delphivcl import *
from forex_python.converter import CurrencyRates
from decimal import Decimal

class ActivityIndicatorForm(Form):

    def __init__(self, owner):
        self.__create_comps()
        self.__config_comps()

    def __create_comps(self):
        self.od_styles = FileOpenDialog(self)
        self.mm_menu = MainMenu(self)
        self.mi_file = self.mm_menu.CreateMenuItem()
        self.mi_load_style = self.mm_menu.CreateMenuItem()
        self.mi_exit = self.mm_menu.CreateMenuItem()
        self.output_amount_label = Label(self)
        self.input_currency_list = RadioGroup(self)
        self.output_currency_list = RadioGroup(self)
        self.input_field = CreateComponent('TEdit',self)
        self.label_input_amount = CreateComponent('TLabel',self)
        self.button_calc = Button(self)

    def __config_comps(self):
        # configure the window
        self.caption = "Currency exchange converter"
        self.SetProps(ClientHeight = 328, ClientWidth = 452,
                Position = "poScreenCenter", OnClose = self.__on_form_close)
        self.SetProps(Menu = self.mm_menu)

        # configure the menu items
        self.mm_menu.Items.Insert(0, self.mi_file)
        self.mi_file.Insert(0, self.mi_exit)
        self.mi_file.SetProps(Caption = "File")
        self.mi_exit.SetProps(Caption = "Exit",
                OnClick = (lambda sender: Application.Terminate()))

        # configure the label for the input
        self.label_input_amount.SetProps(Parent = self,
                Caption = 'Enter input amount:', Left = 20, Top = 14,
                Width = 121, Height = 30)

        # configure the label for the output
        self.output_amount_label.SetProps(Parent = self, Left = 184, Top = 45,
                Width = 88, Height = 15)

        # configure the text input field
        self.input_field.SetProps(Parent = self, Text = '0',
                Name = 'input_field', Left = 20, Top = 40,
                Width = 121, Height = 30)

        # configure the list of input currencies
        self.input_currency_list.SetProps(Parent = self, Left = 20, Top = 120,
                Width = 145, Height = 117, Caption = 'Input currency',
                TabOrder = 0)
        self.input_currency_list.Items.Add('USD')
        self.input_currency_list.Items.Add('EUR')
        self.input_currency_list.Items.Add('NOK')
        self.input_currency_list.Items.Add('AUD')
        self.input_currency_list.Items.Add('JPY')
        self.input_currency_list.SetProps(ItemIndex = 0)

        # configure the list of output currencies
        self.output_currency_list.SetProps(Parent = self, Left = 184, Top = 120,
                Width = 125, Height = 117, Caption = 'Output currency',
                TabOrder = 3)
        self.output_currency_list.Items.Add('USD')
        self.output_currency_list.Items.Add('EUR')
        self.output_currency_list.Items.Add('NOK')
        self.output_currency_list.Items.Add('AUD')
        self.output_currency_list.Items.Add('JPY')
        self.output_currency_list.SetProps(ItemIndex = 0)

        # configure the button
        self.button_calc.SetProps(Parent=self, Caption = 'Calculate',
                Name = 'button_calc',
                Left = 20, Top = 70, Width = 60, Height = 30,
                OnClick = self.__convert_currency)

    def __on_form_close(self, sender, action):
        action.Value = caFree

    def __convert_currency(self, sender):
        selected_input_currency = self.input_currency_list.Items[self.input_currency_list.ItemIndex]
        selected_output_currency = self.output_currency_list.Items[self.output_currency_list.ItemIndex]
        input_amount = float(self.input_field.Text)

        c = CurrencyRates(force_decimal=True)
        exchange_rates = c.get_rate(selected_input_currency,selected_output_currency)
        converted_amount = c.convert(selected_input_currency,selected_output_currency, Decimal(input_amount))
        self.output_amount_label.Caption = f"%.2f %s = %.2f %s" % (input_amount, selected_input_currency, converted_amount, selected_output_currency)

def main():
    Application.Initialize()
    Application.Title = "Activity Indicator"
    MainForm = ActivityIndicatorForm(Application)
    MainForm.Show()
    FreeConsole()
    Application.Run()
    MainForm.Destroy()

if __name__ == '__main__':
    main()