【发布时间】:2022-08-17 18:10:41
【问题描述】:
我创建了一个货币应用程序,用户可以在其中键入本国的价值,并从本国货币到外币进行选择。
from kivy.core.text import LabelBase
from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivy.core.window import Window
from kivymd.uix.floatlayout import MDFloatLayout
from kivy.uix.button import Button
from kivymd.uix.menu import MDDropdownMenu
from kivy.metrics import dp
from decimal import *
from forex_python.converter import CurrencyRates
Window.size=(400, 500)
class DropdownButton(MDFloatLayout, Button):
pass
class CurrencyConvertor(MDApp):
try:
c = CurrencyRates()
rates = c.get_rates(\'USD\')
print(rates)
except:
print(\'Connection Error!\')
##################################################
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.screen = Builder.load_string(kv)
##################################################
#################### to items ####################
c = CurrencyRates()
to_items = [
{
\"viewclass\": \"OneLineListItem\",
\"text\": f\"{i}\",
\"height\": dp(56),
\"on_release\": lambda x=f\"{i}\": self.set_to(x),
# } for i in range(5)
} for i in self.rates.keys()
]
self.to_menu = MDDropdownMenu(
caller=self.screen.ids.to_currency,
items=to_items,
position=\"auto\",
width_mult=4,
)
self.to_menu.bind()
##################################################
################### from items ###################
c = CurrencyRates()
from_items = [
{
\"viewclass\": \"OneLineListItem\",
\"text\": f\"{i}\",
\"height\": dp(56),
\"on_release\": lambda x=f\"{i}\": self.set_from(x),
} for i in self.rates.keys()
# } for i in range(5)
]
self.from_menu = MDDropdownMenu(
caller=self.screen.ids.from_currency,
items=from_items,
position=\"auto\",
width_mult=4,
)
self.from_menu.bind()
##################################################
##################### set to #####################
def set_to(self, text_item):
if text_item != self.screen.ids.from_currency.text:
self.screen.ids.to_currency.text = text_item
self.to_menu.dismiss()
##################################################
#################### set from ####################
def set_from(self, text_item):
if text_item != self.screen.ids.to_currency.text:
self.screen.ids.from_currency.text = text_item
self.from_menu.dismiss()
##################################################
def build(self):
return self.screen
##################################################
def convert(self):
c = CurrencyRates(force_decimal=True)
amount = int(self.screen.ids.amount.text)
from_currency = self.screen.ids.from_currency.text
to_currency = self.screen.ids.to_currency.text
converted_amount = c.convert(from_currency, to_currency, Decimal(amount))
#print(converted_amount)
self.root.ids.result.text = f\"{amount} {from_currency} = {converted_amount} {to_currency}\"
kv = \'\'\'
#<KvLang>
MDFloatLayout:
md_bg_color: 1,1,1,1
MDLabel:
text: \'Currency Convertor\'
pos_hint: {\'center_x\': .5, \'center_y\': .9}
halign: \'center\'
font_name: \'media/poppins-bold\'
front_size: \'32sp\'
MDFloatLayout:
size_hint: .85,.2
pos_hint: {\'center_x\': 0.5,\'center_y\': 0.7}
MDLabel:
text: \"Enter Amount\"
pos_hint: {\'center_x\': 0.5, \'center_y\': 0.85}
font_name: \'media/poppins-medium\'
font_size: \'18sp\'
MDFloatLayout:
size_hint_y: .5
pos_hint: {\'center_x\': .5, \'center_y\':.38}
canvas.before:
Color:
rgb: 210/255, 210/255, 210/255, 1
Line:
width: 1.2
rounded_rectangle:self.x, self.y, self.width, self.height, 6, 6, 6, 6, 100
TextInput:
id: amount
text: \'\'
size_hint: 1, None
pos_hint: {\'center_x\': .5, \'center_y\': .5}
height: self.minimum_height
font_name: \'media/poppins-medium\'
font_size: \'18sp\'
hint_text_color: 170/255, 170/255, 170/255, 1
background_color: 1, 1, 1, 0
padding: 13
cursor_color: 0,0,0,1
multiline: False
MDFloatLayout:
size_hint: .85, .2
pos_hint: {\'center_x\': .5, \'center_y\': .46}
MDFloatLayout:
pos_hint: {\'center_x\': .6, \'center_y\': .5}
MDLabel:
text: \"From\"
pos_hint: {\'center_x\': 0.5, \'center_y\': 0.85}
font_name: \'media/poppins-medium\'
font_size: \'18sp\'
DropdownButton:
id: from_currency
text: \'EUR\'
size_hint: .25, .5
pos_hint: {\'center_x\': .125, \'center_y\':.38}
background_color: 0, 0, 0, 0
color: 0, 0, 0, 1
font_size: \'20sp\'
font_name: \'media/poppins-medium\'
on_release: app.from_menu.open()
# on_release: print(\'Hello\')
canvas.before:
Color:
rgb: 210/255, 210/255, 210/255, 1
Line:
width: 1.2
rounded_rectangle:self.x, self.y, self.width, self.height, 6, 6, 6, 6, 100
Image:
source: \'media/arrow.png\'
size_hint: .35, .35
pos_hint: {\'center_x\': .5, \'center_y\': .38}
MDFloatLayout:
pos_hint: {\'center_x\':1.15, \'center_y\': .5}
MDLabel:
text: \"To\"
pos_hint: {\'center_x\': 0.5, \'center_y\': 0.85}
font_name: \'media/poppins-medium\'
font_size: \'18sp\'
DropdownButton:
id: to_currency
text: \'USD\'
size_hint: .25, .5
pos_hint: {\'center_x\': .125, \'center_y\':.38}
background_color: 0,0,0,0
color: 0,0,0,1
font_name: \'media/poppins-medium\'
font_size: \'20sp\'
on_release: app.to_menu.open()
canvas.before:
Color:
rgb: 210/255, 210/255, 210/255, 1
Line:
width: 1.2
rounded_rectangle:self.x, self.y, self.width, self.height, 6, 6, 6, 6, 100
MDLabel:
id: result
text: \'\'
pos_hint: {\'center_x\': .5, \'center_y\': .3}
halign: \'center\'
font_name: \'media/poppins-medium\'
font_size: \'18sp\'
Button:
text: \'Get Exchange Rate\'
font_name: \'media/poppins-medium\'
size_hint: .85, .12
font_size: \'18sp\'
pos_hint: {\'center_x\': .5, \'center_y\': .15}
background_color: 1,1,1,0
color: 1,1,1,1
# on_release: print(\'result\')
on_release: app.convert()
canvas.before:
Color:
rgb: 71/255, 104/255, 237/255, 1
RoundedRectangle:
size: self.size
pos: self.pos
radius: [6]
#<KvLang>
\'\'\'
CurrencyConvertor().run()
LabelBase.register(name=\"Poppins\", fn_regular=\"media/Poppins-Regular.ttf\")
它可以打印出所有的货币转换。示例:当我输入 10,000 美元的值时,需要将其转换为欧元,结果如下图所示: 10000 欧元 = 10131.0000 美元
如果我需要格式化结果,我该怎么办: 1) 美元和欧元的每千个逗号?和 2) 指定美元中的 2 位小数? 因此可以轻松阅读而不会分心