如何使用curses在终端中编写三条不断更新的行?

时间:2017-11-26 15:57:14

标签: python curses

我有一个程序需要输出三条不断变化的消息。连接数,已用时间和拒绝连接。

我尝试在字符串末尾用'\r'编写它们并打印换行符,然后其他人开始自己的输出循环,认为返回的回车符回一行。但是他们都在第一线被覆盖了。

我已经看过类似的问题,人们建议使用curses,但我似乎无法让它发挥作用。我尝试使用addstr()代替printsys.stdout.write(),但显然我做得不对,因为它最终看起来像this.我也尝试使用{{1}每个move(0,0)之后因为我认为坐标是从光标的最后位置计算的,但是输出看起来和我没有做的时候相同

这是我使用addstr -

的当前代码
curses

另外,除了没有正确写入我似乎无法正常关闭它,当我使用from scapy.all import * from curses import wrapper import argparse, random, socket, sys, time, os, threading, re, subprocess, curses def main(target): try: stdscr.clear() curses.noecho() curses.cbreak() stdscr.keypad(1) #things regarding user agents and iptables for conn in range(args.connections): t = threading.Thread(target=sendPacket, args=(targetIP, args.port, targetHost,random.choice(userAgents))) threads.append(t) t.start() numConn += 1 try: lock.acquire() stdscr.addstr(0, 0,'{0} Connections Established to {1} '.format(numConn,getIP(target))) stdscr.refresh() #sys.stdout.flush() finally: lock.release() time.sleep(args.timer) CloseWin() sys.exit() except KeyboardInterrupt, e: lock.acquire() stdscr.addstr (5,0,'Exiting {0}'.format(e)) CloseWin() lock.release() sys.exit() #functions that deal with resolving host and IP def sendPacket(targetIP,targetPort,targetHost,userAgent): try: #building and sending the packet failPacket = 0 lock.acquire() if synack is None: stdscr.addstr(1, 0, '{0} Connections refused'.format(failPacket)) stdscr.refresh() failPacket += 1 return #send final packet lock.release() return except Exception,e: CloseWin() #print e lock.release() return def MeasureTime(): try: lock.acquire() while True: stdscr.addstr(3, 0,'{0} Time elapsed'.format(time.time() - startTime)) stdscr.refresh() finally: lock.release() def CloseWin(): try: lock.acquire() curses.nocbreak() stdscr.keypad(0) curses.echo() curses.endwin() finally: lock.release() if __name__ == '__main__': #args stdscr = curses.initscr() if args.debug == True: wrapper(OneConn(args.target)) #OneConn is the same as the main function except it only opens one connection, so the print is the same else: startTime = time.time() wrapper(main(args.target)) 尝试并退出时,看起来它停止更新有关数据包的打印输出但是时间仍在坚持下去。除了关闭终端之外,我无法找到阻止它的方法。

尝试根据@ martinaeu的建议添加锁定并编辑帖子以显示我的所作所为。结果是我只能看到ctrl+c被打印出来并在第四行更新,根本看不到其他打印件,仍然无法关闭程序而不关闭终端

1 个答案:

答案 0 :(得分:0)

您可以简单地发出原始代码,将光标移回三行,而不是使用curses。这将是:

os.write(1, "\x1b[3F")

小心:线条不会被删除。如果您打印的新行与旧行的长度相同(例如,因为它们的格式为"foo: %10d"),则应该不会出现问题。

参考:https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes(其中“CSI”代表“\ x1b [”,n是以十进制表示的可选数字。)