之前我折腾了一通比特股的节点,终于咱也用上了自己的私有节点啦。用上私有节点之后,腰不酸了,背不疼了,腿也不抽筋啦,当然了,每月40刀的VPS费,还是很让人心疼不已的。
(图源:bing.com)
虽然用上了私有节点,但是我亲历了比特股爆仓事件之后,我觉得我真的不适合交易,无论做啥操作,我基本上都能准确的和市场趋势保持相反。但是弄个私有节点啥也不干有点浪费,那就折腾玩吧。
话说,之前我曾经写了个简单的脚本,查看指定市场当前订单情况,但是呢,但是这个脚本需要我每次手动运行一下,生成报表。我也有想过用循环随时刷新,但是因为当时用的第三方节点,延迟大概有3-5秒的样子,所以随时刷新是不现实的。
但是有了私有节点之后,我的这个想法又再次萌生,这次不存在延迟的问题了,是不是可以考虑做一个随时刷新的市场行情列表啦。而既然延迟不是问题,那么随时刷新就剩一个问题需要解决了,那就是在原地刷新,不然一屏屏的数据滚来滚去,我估计我是受不了的。
原地刷新的思路
那么如何解决原地刷新的问题呢?我首先想到的就是ASCII码表里的回车、换行、退格
。
退格没啥说的啦,但是很多朋友搞不清楚回车、换行有什么区别,我这里简单说一下:
- 回车,即让光标回到行首
比如:print("I am oflyhigh\r", end='')
A carriage return, sometimes known as a cartridge return and often shortened to CR,
<CR>
or return, is a control character or mechanism used to reset a device's position to the beginning of a line of text. It is closely associated with the line feed and newline concepts, although it can be considered separately in its own right.
- 换行,开启新的一行
比如:print("I am oflyhigh\n", end='')
Newline (frequently called line ending, end of line (EOL), line feed, or line break) is a control character in a character encoding specification, like e.g. ASCII. It is used to signify the end of a line of text and the start of a new one. Text editors set this special character when pressing the Enter key.
(引用部分为维基百科的解释)
有了上述了解后,我们就可以:把原地刷新问题处理成将光标移回到起始点问题
比如,这段代码:
print("I am oflyhigh\n", end='')
print("I am oflyhigh\n", end='')
print("\r\b\r\b\r", end='')
光标又回到原点啦
以下这组代码,可以实现程序原地刷新
import time
for i in range(1,100):
print("I am oflyhigh\n", end='')
print(f"Seconds: {i}\n", end='')
print("\r\b\r\b\r", end='')
time.sleep(1)
清理屏幕区域
到了这里,似乎我们可以实现实时刷新的市场行情信息了。但是,我在实际运行过程中却发现一个奇怪的问题。
本来报价列表应该是这样的:
但是跑着跑着却变成这样:
(后边多一列或者多列竖线)
我研究了半天,才研究明白,原来列表的宽度有有可能变化的,比如出现一两个大单,这样字符串就特别长,把列表撑宽了,然后大单被消灭掉,列表恢复原来的宽度,但是之前写在屏幕上的数据还在,就出现这样的情况喽。
于是乎我又想了个办法,就是先输出一排排的空格,将屏幕指定区域清空,然后再重新输出数据,一切OK。
总结
- Python 程序原地刷新问题可以换成光标控制问题。
- 新输出的内容比原位置内容短,就会在行尾出现无意义内容。
- 在屏幕上输出N个长度的空格,可以清空指定区域。
- 可以将
光标复位、清空内容、光标复位
封装为清屏回位函数
- 配合
清屏回位函数
与程序的输出,可以轻易实现程序原地刷新