我正在编写一个使用Python的curses库的IRC客户端,但是服务器的响应在屏幕上输出不正确。
基本上,我的终端越小,输出越接近它应该是:
在全尺寸终端(1366x768分辨率)上基本没有输出
在半尺寸的终端上,有更多可见的输出
在一个四分之一大小的终端上,程序会输出我期望的一切。
基于这种模式,我最好的猜测是一些行长问题,但我真的不知道问题是什么。
import curses
import queue
import socket
import threading
import time
PAD_LENGTH = 1000
def main(stdscr):
s = socket.create_connection(("chat.freenode.net",6667))
s.settimeout(1.0)
s.send(b"PASS hello\r\n")
s.send(b"NICK testingclient\r\n")
s.send(b"USER testingclient tclient tclient :Test Client\r\n")
s.setblocking(False)
curses.noecho()
curses.cbreak()
stdscr.nodelay(1)
pad = curses.newpad(PAD_LENGTH,curses.COLS-1)
top = 0
while True:
try:
msg = s.recv(512).decode("latin-1")
pad.addstr(msg)
except BlockingIOError:
pass
kc = stdscr.getch()
if kc != -1:
k = chr(kc)
if k == "q":
break
elif k == "j" and top < PAD_LENGTH:
top += 1
elif k == "k" and top > 0:
top -= 1
pad.refresh(top,0,0,0,curses.LINES-1,curses.COLS-1)
s.close()
curses.nocbreak()
curses.echo()
curses.endwin()
curses.wrapper(main)
我在VirtualBox的Arch Linux上使用i3和xterm
答案 0 :(得分:1)
LINES和COLS值在任何意义上都不是 magic ;它们由curses库根据终端大小(来自操作系统)进行初始化,并且可以通过设置环境变量(名为$ LINES和$ COLUMNS)来覆盖(通常)。有关更多信息,请阅读use_env
的手册页如果您的应用程序具有更窄的格式可读性,那么您可以随时检查脚本中COLS的值并限制传递给curses.newpad的值:
pad = curses.newpad(PAD_LENGTH,curses.COLS-1)
比如说,你应该在那个调用中使用你自己的变量(COLS的副本),并在另一个对COLS的引用中重用它:
pad.refresh(top,0,0,0,curses.LINES-1,curses.COLS-1)
如上所述,使用环境变量操作这是你可以做的事情 - 但它并不经常使用。请记住,如果将$ LINES和/或$ COLUMNS设置为较大的值而不是终端提供的值,结果将不会很好。
回顾评论(还有其他可能相关的陷阱,但我没有适合测试你的脚本的配置):
答案 1 :(得分:0)
问题是由在带有回车符的字符串上使用addstr
引起的。
我不知道\r
在curses中的具体行为,但将消息更改为msg = s.recv(512).decode("latin-1").replace("\r\n","\n")
为我提供了完美的输出。