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。

如何定义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 函数验证了输入是否合理。如果我输入字母,它会给出一个错误。不过,程序不会崩溃,用户可以纠正他们的错误。

用户通过单选按钮提供货币,所以我们需要一种方法来读取所选的值。所选单选按钮的索引被存储在
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()