python – curses – 在较大的终端中看不到addstr文本
我正在编写一个使用
Python的curses库的IRC客户端,但是服务器的响应在屏幕上输出不正确.
基本上,我的终端越小,输出越接近它应该是: 在全尺寸终端(1366×768分辨率)上基本没有输出 在半尺寸的终端上,有更多可见的输出 在一个四分之一大小的终端上,该程序会输出我期望的所有内容. 根据这种模式,我最好的猜测是一些行长问题,但我真的不知道问题是什么. 源代码 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 hellorn") s.send(b"NICK testingclientrn") s.send(b"USER testingclient tclient tclient :Test Clientrn") 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,curses.LINES-1,curses.COLS-1) s.close() curses.nocbreak() curses.echo() curses.endwin() curses.wrapper(main) 其他笔记 我在VirtualBox的Arch Linux上使用i3和xterm 解决方法
LINES和COLS值在任何意义上都不是魔术;它们由curses库根据终端大小(来自操作系统)进行初始化,并且可以通过设置环境变量(名为$LINES和$COLUMNS)来覆盖(通常).有关更多信息,请阅读
use_env的手册页
如果您的应用程序具有更窄的格式可读性,那么您始终可以在脚本中检查COLS的值并限制传递给curses.newpad的值: pad = curses.newpad(PAD_LENGTH,curses.COLS-1) 比方说,你应该在那个调用中使用自己的变量(COLS的副本),并在这里对COLS的另一个引用中重用它: pad.refresh(top,curses.COLS-1) 正如所指出的那样,使用环境变量来操纵这个是你可以做的事情 – 但它并不经常使用.请记住,如果将$LINES和/或$COLUMNS设置为大于终端提供的值,结果将不会很好. 回顾一下评论(还有其他可能相关的陷阱,但我没有合适的配置来测试你的脚本): > pad与stdscr不是同一块内存.给定窗口上的getch告诉curses刷新该窗口.因此,如果窗口上有挂起的更改,它将覆盖任何其他窗口,因为curses库将数据复制到curscr.>另一个潜在的问题是,如果你的addtr写了换行符. addch / addstr中的换行符将清除该行的其余部分. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |