主页 > imtoken钱包苹果 > 学习 PyQt:使用 Python 和 Qt5 构建比特币市场追踪器

学习 PyQt:使用 Python 和 Qt5 构建比特币市场追踪器

imtoken钱包苹果 2023-07-04 05:16:43

比特币概念股票代码_币行 比特币交易平台_比特币源代码有多少行

比特币,一种加密货币市场追踪器

比特币概念股票代码_币行 比特币交易平台_比特币源代码有多少行

马丁·菲茨帕特里克

追踪加密货币市值和交易量

源代码 Mac 磁盘映像 Windows 应用程序

关注、转发、私信小编“01”,免费领取Python学习资料!

比特币概念股票代码_比特币源代码有多少行_币行 比特币交易平台

Goodford Bitcoin 是一个简单的加密货币市场追踪器。 它显示每日市场价格,包括高价、低价和收盘价,以及一系列流行加密货币的市场交易量。 内置支持BTC、ETH、LTC、EOS、XRP和BCH币种EUR、USD、GBP作为估值基础货币。

我拥有的唯一比特币是互联网上某个随机的人给我的。 我对加密货币一无所知,这个应用程序只是为了好玩。

继续阅读以了解应用程序是如何组合在一起的,包括与 PyQt 5 中的 API 交互、绘制数据图以及使用 PyInstaller 打包应用程序。

该应用程序由 CryptoCompare.com api 高价、低价、开盘价和收盘价提供支持,我们每天从中检索这些值以及市场交易量。 当您将鼠标移到绘制的时间线上时,生成的汇率将用于绘制图表,因为货币兑换列表视图会更新。 捆绑的应用程序可在 Windows 和 Mac 上使用。

使用 API

我们首先需要的是数据源。 我们使用 CryptoCompare.com,它为非商业目的提供免费的开发者 API 访问,包括历史数据。

API调用

我们使用两种不同的 API 调用来绘制图表 -

所有支持的加密货币(BTC、ETH、LTC、EOS、XRP 和 BCH)对一组基础货币(EUR、USD 和 GBP)的每日历史汇率。 每日市场交易量数据,给出发生的交易数量。

我们正在进行的两个 API 调用是..

https://min-api.cryptocompare.com/data/histoday?fsym={fsym}&tsym={tsym}&limit={limit}
https://min-api.cryptocompare.com/data/exchange/histoday?tsym={tsym}&limit={limit}

在 URL 中,fsym 是从符号到货币的交换,tsym 是到符号我们要交换的货币限制这是请求返回的结果数 - 因为我们调用 /histoday 这是返回数据的天数。

请求是通过请求发出的,在身份验证中传递每个应用程序的秘密。 Apikey 标题,例如:

币行 比特币交易平台_比特币概念股票代码_比特币源代码有多少行

在线程中执行 API 请求

币行 比特币交易平台_比特币源代码有多少行_比特币概念股票代码

对 API 的请求需要时间才能完成。 如果我们直接在 GUI 线程中发出请求,它会阻止应用程序的其余部分执行 - 包括响应用户输入。 应用程序将变得无响应(死亡纺车、褪色的窗口)。

我们可以通过在单独的线程中执行 API 请求来轻松避免这个问题。

有关完整概述,请参阅 PyQt 5 线程教程中的 QWorker 方法。

首先,我们定义一个信号 QObject,其中包含我们希望从工作线程发出的信号。 这包括要发出的信号。 完成、错误、进度(完成多少)和数据(返回的数据)。

比特币概念股票代码_比特币源代码有多少行_币行 比特币交易平台

我们还添加了一个取消信号,它允许父应用程序在第一个请求完成之前在新请求排队时向活动工作线程发出信号。 此信号设置标志 is_interrupted 以在下载之前检查每种货币的数据。 如果为 True 它将返回而不发出完成信号。

币行 比特币交易平台_比特币概念股票代码_比特币源代码有多少行

为每种加密货币执行单独的 api 请求,更新进度条(在每次迭代中发出 (int(100 * n / len(AVAILABLE_CRYPTO_CURRENCIES)))),然后发出最终请求以检索交易量信息。 所有请求完成后,结果数据将使用先前定义的信号发出。

缓存

免费 API 提供每月 100,000 次调用的慷慨限制,这是不太可能达到的。 但是,如果可以避免的话,不要浪费别人的带宽仍然是有礼貌的。 由于我们正在检索每日费率,因此没有理由每天下载超过 1 次。

在执行 API 调用时,我们将使用请求库 requests_cache,我们可以使用它以透明的方式自动缓存所有 API 请求。 这使用一个简单的 SQLite 文件数据库来存储以前请求的结果。

import requests_cache
requests_cache.install_cache(os.path.expanduser('~/.goodforbitcoin'))

启用缓存后,API 响应将被缓存,随后对同一 URL 的请求将从缓存中获取(直到它过期,由 API 设置为 1 天)。

您可以将缓存放在您想要的任何磁盘上,唯一的要求是它是用户可写的(因此它在应用程序打包后继续工作)。

情节数据

API 调用返回每天和每个加密货币以及个别市场的最高、最低、开盘价和收盘价交易量值。 这些代码被绘制成一系列线条,每个线条代表一种加密货币。 关闭值以不同颜色绘制高值和低值绘制为虚线。 这将在不绘制值的情况下打开。

比特币源代码有多少行_币行 比特币交易平台_比特币概念股票代码

具有多种货币和体积数据的 PyQtGraph 图

货币轴

货币值都使用相同的轴以相同的比例绘制。 我们只绘制货币行,并且仅当我们从 API 返回数据时(以防激活任何货币)比特币源代码有多少行,因此初始设置只是轴和网格。 我们还设置了轴名称并添加了无限垂直线,这只是为了通过跟踪图表来获取每日货币转换率。

比特币源代码有多少行_币行 比特币交易平台_比特币概念股票代码

轴的鼠标移动信号连接到自定义 mouse_move_handler 槽,它移动无限行并更新速率表中显示的当前速率(见下文)。

比特币源代码有多少行_币行 比特币交易平台_比特币概念股票代码

体积轴

体积轴是在单独的刻度上绘制的,就像一条黑色虚线。 这可以垂直扩展,独立于货币。 要做到这一点有点棘手。 要绘制图形,您需要手动创建一个 ViewBox 对象并将其连接到主轴。

比特币源代码有多少行_币行 比特币交易平台_比特币概念股票代码

与货币不同,我们在这里添加曲线是因为我们知道它会永远持续下去。 初始状态是对角线(无缘无故)。

比特币概念股票代码_币行 比特币交易平台_比特币源代码有多少行

我们需要将调整大小信号从主轴连接到自定义 update_plot_scale 槽,它会自动更新次轴尺寸。

def update_plot_scale(self):
 self.p2.setGeometry(self.p1.vb.sceneBoundingRect())

现在已经定义了两个轴,我们可以绘制我们的绘图线。

更新情节

该图将根据 API 请求工作者返回的数据进行更新。 这将触发 .redraw() 方法,该方法使用数据(可在 self.data 获得)向图中添加或更新行。

比特币概念股票代码_币行 比特币交易平台_比特币源代码有多少行

对情节线的引用保存在字典中。 self._data_lines 由加密标识符作为密钥。 这允许我们在每次更新时检查一行是否已经定义,并更新它而不是重新创建它。 我们还可以删除我们不想再绘制的货币线(如果它们已在货币列表中取消选择)。

然而,campaign(volume)图总是存在的,所以我们只需要对现有的行进行简单的更新。

self._market_activity.setData(x, self.volume)

除了画线外,我们还在图表中的当前位置显示了所有加密货币的货币兑换率列表。 当您来回移动指针时,这些费率会自动更新。

费率表

费率表是一个 QTableView 小部件,使用 Qt5ModelView 架构。

币行 比特币交易平台_比特币源代码有多少行_比特币概念股票代码

比特币汇率表

我们定义了 QStandardItemModel 模型,我们可以使用它来更新表中的数据,并为列设置标题。 最后,.itemChanged 信号连接到我们的自定义插槽方法 check_check_state。

self.listView = QTableView()

币行 比特币交易平台_比特币概念股票代码_比特币源代码有多少行

self.model = QStandardItemModel() self.model.setHorizontalHeaderLabels(["Currency", "Rate"]) self.model.itemChanged.connect(self.check_check_state)

如果项目被选中,并且当前未显示货币(货币标识符不在我们的 ._data_visible(map) 中,我们将货币添加到它并触发重绘。同样,如果项目未被选中但货币被显示,我们删除它并触发重绘。

比特币源代码有多少行_币行 比特币交易平台_比特币概念股票代码

我们总是下载所有货币的数据,即使它们当前没有显示,所以我们可以立即更新图表。 您可能想尝试更改此行为。

自动更新连接到主轴上鼠标移动的 mouse_move_handler 插槽。 这个插槽接收一个 pos 值,它是 QPoint 相对于轴的位置。 我们首先使用 .x() 值设置垂直线的位置,然后在我们的 update_data_viewer 方法中对该值进行 int。

def mouse_move_handler(self, pos):
 pos = self.ax.getViewBox().mapSceneToView(pos)
 self.line.setPos(pos.x())
 self.update_data_viewer(int(pos.x()))

下一个方法检查位置 i 是否在我们的数据范围内(数据的天数)。 然后,对于每一种货币,它得到相应的值(关闭值),然后将其设置为第二个 QStandardItems——货币汇率列——作为一个 4DP 数字。

def update_data_viewer(self, i):
 if i not in range(NUMBER_OF_TIMEPOINTS):
 return
 for currency, data in self.data.items():
 self.update_data_row(currency, data[i])
def update_data_row(self, currency, data):
 citem, vitem = self.get_or_create_data_row(currency)
 vitem.setText("%.4f" % data['close'])

此 get_or_create_data_row 查找模型中是否存在相应货币的数据行。 如果完成则返回现有行,如果没有则通过调用 add_data_row.. 这意味着我们不需要显式定义行,它们是根据 API 返回的数据自动创建的。

比特币概念股票代码_比特币源代码有多少行_币行 比特币交易平台

比特币概念股票代码_币行 比特币交易平台_比特币源代码有多少行

包裹

现在我们有了一个可以工作的应用程序,最后一步是将其打包以供分发。 适用于 Windows 和 Mac 的安装程序可在本文顶部找到。 为此,我们使用 PyInstaller,这是捆绑 Python 应用程序的当前标准。

因为应用程序没有外部数据文件,所以构建安装程序非常简单。 使用 pip3 install pyinstaller 安装 PyInstaller 并运行 -

pyinstaller crypto.py

这会生成一个包含所需信息的规范文件。 PyInstaller 要构建分发安装程序,请执行以下操作。 此文件是跨平台的比特币源代码有多少行,应包含在源代码管理中,以便进行任何改进。

自动生成的文件足以按原样打包此应用程序,但我们需要进行一些调整才能使其完整。

MacOS 视网膜支持

默认情况下,macOS 应用程序不支持视网膜(高分辨率)屏幕。 要启用此支持,需要将 NSHighResolutionCapable 标志捆绑在 .app 中的应用程序 .plist 中。 这很简单,可以在 PyInstaller 中找到。

编辑 .spec 文件以添加 info_plist 块,如下所示 NSHighResolutionCapable

app = BUNDLE(coll,
 ...
 info_plist={
 'NSHighResolutionCapable': 'True'
 },

现在,无论何时绑定您的应用程序,都将此标志添加到您的 macOS 包中。 .plist 自动。

图标

要使应用程序在运行时显示自定义图标,我们需要生成 Windows.ico 和 MacOS.icns 文件并将它们添加到 .spec 定义中。

MacOSX 图标包 icon.icns 包含多种图标尺寸可供选择,手工生成这些图标非常困难。 下面的脚本将一个 .png 文件作为输入并自动生成包含不同大小的 .icns 包。

#!/bin/bash
mkdir $1.iconset
sips -z 16 16 $1 --out $1.iconset/icon_16x16.png

比特币源代码有多少行_币行 比特币交易平台_比特币概念股票代码

sips -z 32 32 $1 --out $1.iconset/icon_16x16@2x.png sips -z 32 32 $1 --out $1.iconset/icon_32x32.png sips -z 64 64 $1 --out $1.iconset/icon_32x32@2x.png sips -z 128 128 $1 --out $1.iconset/icon_128x128.png sips -z 256 256 $1 --out $1.iconset/icon_128x128@2x.png sips -z 256 256 $1 --out $1.iconset/icon_256x256.png sips -z 512 512 $1 --out $1.iconset/icon_256x256@2x.png sips -z 512 512 $1 --out $1.iconset/icon_512x512.png cp $1 $1.iconset/icon_512x512@2x.png iconutil -c icns $1.iconset rm -R $1.iconset

此文件保存为 makeicns.sh,然后 chmod +x makeicns.sh 可用于从单个大 PNG 生成 .icns 包,如下所示。

./makeicns.sh bitcoin-icon.png

您可能想要检查调整大小的图标并编辑较低分辨率的图标以简化它们以获得更好的清晰度。 只需删除 rm -R $1.iconset 即可离开脚本。

对于 Windows,我们可以生成一个 .ico 来将 PNG 加载到 GIMP 中,并在不同的层上将大小调整为 64x64、32x32 和 16x16。 与 MacOS 不同,如果您愿意让它自动调整大小,您可以提供方形图像,只需确保将其另存为 .ico。

完整规格文件

要完成规范文件,我们可以手动设置应用程序的名称(Goodford Bitcoin)并更新捆绑应用程序的文件名以匹配。 此外,PyInstaller 脚本将添加一个带有静态路径的 pathex 变量。

pathex=['/Users/martin/repos/minute-apps/crypto'],

如果你自己生成这个文件,这个 pathex 是不同的。

如果 .spec 文件与您的应用程序基础 Python 文件位于同一文件夹中,请使该文件可移植。 最后一步是添加一些隐藏的导入(PyInstaller 未正确检测到的模块)。 只有 Windows 版本需要这些。

捆绑下载的完整规范文件如下所示。

币行 比特币交易平台_比特币概念股票代码_比特币源代码有多少行

可以通过以下链接下载打包的比特币应用程序以及源代码。