每天进步一点点: Python 如何实现程序原地刷新

每天进步一点点: Python 如何实现程序原地刷新

之前我折腾了一通比特股的节点,终于咱也用上了自己的私有节点啦。用上私有节点之后,腰不酸了,背不疼了,腿也不抽筋啦,当然了,每月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.

(引用部分为维基百科的解释)

有了上述了解后,我们就可以:把原地刷新问题处理成将光标移回到起始点问题

比如,这段代码:

光标又回到原点啦

以下这组代码,可以实现程序原地刷新

清理屏幕区域

到了这里,似乎我们可以实现实时刷新的市场行情信息了。但是,我在实际运行过程中却发现一个奇怪的问题。

本来报价列表应该是这样的:

但是跑着跑着却变成这样:

(后边多一列或者多列竖线)

我研究了半天,才研究明白,原来列表的宽度有有可能变化的,比如出现一两个大单,这样字符串就特别长,把列表撑宽了,然后大单被消灭掉,列表恢复原来的宽度,但是之前写在屏幕上的数据还在,就出现这样的情况喽。

于是乎我又想了个办法,就是先输出一排排的空格,将屏幕指定区域清空,然后再重新输出数据,一切OK。

总结

  • Python 程序原地刷新问题可以换成光标控制问题。
  • 新输出的内容比原位置内容短,就会在行尾出现无意义内容。
  • 在屏幕上输出N个长度的空格,可以清空指定区域。
  • 可以将光标复位、清空内容、光标复位封装为清屏回位函数
  • 配合清屏回位函数与程序的输出,可以轻易实现程序原地刷新

相关链接


This page is synchronized from the post: 每天进步一点点: Python 如何实现程序原地刷新

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×