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

in #python6 years ago

之前我折腾了一通比特股的节点,终于咱也用上了自己的私有节点啦。用上私有节点之后,腰不酸了,背不疼了,腿也不抽筋啦,当然了,每月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个长度的空格,可以清空指定区域。
  • 可以将光标复位、清空内容、光标复位封装为清屏回位函数
  • 配合清屏回位函数与程序的输出,可以轻易实现程序原地刷新

相关链接

Sort:  

emmm这里你可以看一下关于\r还有\n最初设计是咋回事以及定义。。。代码中实际上存在不少不必要以及可优化的地方。。

另外清华大学的BBS上有py版的settimeout代码,可以配合supervisor来强力定时刷新以及进程守护。
全屏刷新还可以这么做:

import os

def cls():
    _ = os.system('clear') 

清屏指令我考虑过,但是它会清空整个屏幕
所以被我弃用了

另外,我就是闲着玩啦

Wonderfull posts.thanks for this.

Your simple script to view the present order situation in the specified market and the script required to be executed manually each time to generate reports!

强大的Python

Good. Thanks for sharing my friend. I like your sharing

your post is very useful for me and I say thanks as much as possible to admin steemit who has posted something that is very weighted so that I can really many I

what is a friend?
can friends explain a little ...

Coin Marketplace

STEEM 0.20
TRX 0.14
JST 0.030
BTC 64155.87
ETH 3422.91
USDT 1.00
SBD 2.59