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

in python •  7 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个长度的空格,可以清空指定区域。
  • 可以将光标复位、清空内容、光标复位封装为清屏回位函数
  • 配合清屏回位函数与程序的输出,可以轻易实现程序原地刷新

相关链接

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

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

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

import os

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

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

另外,我就是闲着玩啦

Very good post

Wonderfull posts.thanks for this.

I like post oflyhigh

Very good post.

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 ...

大神你好!不知道你有没有留意 @dapeng 最近发起的编写《Steem 指南》的活动。我们小组负责 Steemit 上的机器人这一章节。我们打算从机器人介绍入手。通过文献查阅,发现大神几个月前写过聊聊机器人。大神的帖子写得很棒,但由于时间推移,有些信息需要更新,比如机器人种类的增加等。 @dapeng 建议:

不要重复写前人已经写过的东西。如果旧帖涉及的信息陈旧,只需很小改动的话,请原作者修改即可。如果原作者没时间或没兴趣修改,可以协商后换人修改,共同署名。

不知道大神有没有兴趣再写一篇,或者授权给我进行扩充并共同署名?如果两者都不适合大神,我也可以自己完全重新写一篇。谢谢合作!:-)

我不是大神啦
我以前的文章你们要是觉得有用,就拿去吧,随便用随便改😀

好的,谢谢!不叫大神都不知道怎么称呼了。我写完请 O 哥 (这个称呼问题不大吧) 和 @dapeng 看看再说吧。再次感谢!