在下面的程序中,我创建了窗口输出。我想将输出重定向到文件。但我无法将window.inch(y,x)
输出写入文件。
#! /usr/bin/python2.6
import sys, getopt
import curses
from curses import wrapper
def call(stdscr):
inputFile = ''
try:
opts, args = getopt.getopt(sys.argv[1:],"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
print 'my_box.py -i <inputFile_With_Path>'
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print 'my_box.py -i <inputFile_With_Path>'
sys.exit()
elif opt == '-i':
inputFile = arg
output_file = open("/home/vparamasivam/Training/Python/output.txt", "w+")
my_Dict = { }
cur_y = 3
cur_sbc = 30
cur_EP1 = 10
cur_uas = 50
cur_UAC = 10
sbc_cur = 24
cur_poi = 2
RED_TEXT = 1
endPointCount = 0
callCount = 0
count = 0
if not curses.has_colors():
curses.endwin()
print "no colors"
sys.exit()
else:
curses.start_color()
curses.init_pair(RED_TEXT, curses.COLOR_RED, curses.COLOR_BLACK)
window = curses.newwin(500, 500, 0, 0)
window.box()
fo = open(inputFile, "r");
print "Name of the file :", fo.name
print "File closed or not :", fo.closed
window.addstr(1, 29, "SBC", curses.color_pair(RED_TEXT))
window.vline(cur_y, cur_sbc, '|', 500)
for line in fo:
if (line.find("Receive Msg From:") != -1) :
ip, l, p, s, msg = line.split(',')
ipc, ip = ip.rsplit(' ',1)
ip, port = ip.split('/')
ipPort = ip + ':' + port
s, msg, req_uri = msg.split(' ', 2)
print "\n SIP message : ", msg, ' '
print "Received from IP : ", ipPort, ' '
callCount += 1
if not my_Dict.has_key(ipPort):
endPointCount +=1
if endPointCount == 1:
window.addstr(1, 4, ipPort, curses.color_pair(RED_TEXT))
window.vline(cur_y, cur_EP1, '|', 500)
new = {ipPort:cur_EP1}
my_Dict.update(new)
cur_EP1 += 7
cur_poi += 1
window.addstr(cur_poi, cur_EP1, msg, curses.color_pair(RED_TEXT))
cur_poi += 1
cur_EP1 -= 6
window.hline(cur_poi, cur_EP1, '-', 18)
cur_EP1 += 18
window.addstr(cur_poi, cur_EP1, '>')
else :
sbc_cur +=20
if endPointCount != 2:
cur_uas +=20
window.addstr(1, sbc_cur, ipPort, curses.color_pair(RED_TEXT))
window.vline(cur_y, cur_uas, '|', 500)
new = {ipPort:cur_uas}
my_Dict.update(new)
cur_poi +=2
cur_uas -=13
window.addstr(cur_poi, cur_uas, msg, curses.color_pair(RED_TEXT))
cur_uas +=13
cur_poi +=1
cur_sbc +=1
window.addstr(cur_poi, cur_sbc, '<')
count = cur_uas - cur_sbc - 1
cur_sbc +=1
window.hline(cur_poi, cur_sbc, '-', count)
cur_sbc -=2
else :
ep = my_Dict[ipPort]
if ep == cur_UAC :
ep += 7
window.addstr(cur_poi, ep, msg, curses.color_pair(RED_TEXT))
cur_poi += 1
ep -= 6
window.hline(cur_poi, ep, '-', 18)
ep += 18
window.addstr(cur_poi, ep, '>')
cur_poi += 1
else :
cur_poi +=1
ep -=13
window.addstr(cur_poi, ep, msg, curses.color_pair(RED_TEXT))
ep +=13
cur_poi +=1
cur_sbc +=1
window.addstr(cur_poi, cur_sbc, '<')
count = ep - cur_sbc - 1
cur_sbc +=1
window.hline(cur_poi, cur_sbc, '-', count)
cur_sbc -=2
elif (line.find("Send Msg to:") != -1) :
ip, l, p, s, msg = line.split(',')
s, msg, status = msg.split(' ', 2)
ipc, ip = ip.rsplit(' ',1)
ip, port = ip.split('/')
ipPort = ip + ':' + port
print "\n SIP message : ", msg, ' '
print "Sent to IP : ", ipPort, ' '
callCount += 1
if not my_Dict.has_key(ipPort):
endPointCount +=1
if endPointCount == 1:
window.addstr(1, 9, ipPort, curses.color_pair(RED_TEXT))
window.vline(cur_y, cur_EP1, '|', 500)
new = {ipPort:cur_EP1}
my_Dict.update(new)
cur_poi +=1
cur_EP1 +=7
window.addstr(cur_poi, cur_EP1, msg, curses.color_pair(RED_TEXT))
cur_poi +=1
cur_EP1 -=6
window.addstr(cur_poi, cur_EP1, '<')
cur_EP1 +=1
window.hline(cur_poi, cur_EP1, '-', 18)
else :
sbc_cur +=20
if endPointCount != 2:
cur_uas +=20
window.addstr(1, sbc_cur, ipPort, curses.color_pair(RED_TEXT))
window.vline(cur_y, cur_uas, '|', 500)
new = {ipPort:cur_uas}
my_Dict.update(new)
cur_poi +=1
cur_uas -=13
window.addstr(cur_poi, cur_uas, msg, curses.color_pair(RED_TEXT))
cur_uas +=13
cur_poi +=1
cur_sbc +=1
count = cur_uas - cur_sbc - 1
window.hline(cur_poi, cur_sbc, '-', count)
cur_uas -=1
window.addstr(cur_poi, cur_uas, '>')
cur_uas +=1
cur_sbc -=1
else :
ep = my_Dict[ipPort]
if ep == cur_UAC :
cur_poi +=1
ep +=7
window.addstr(cur_poi, ep, msg, curses.color_pair(RED_TEXT))
cur_poi += 1
ep -= 6
window.addstr(cur_poi, ep, '<')
ep +=1
window.hline(cur_poi, ep, '-', 18)
cur_poi += 1
else :
cur_poi +=1
ep -=13
window.addstr(cur_poi, ep, msg, curses.color_pair(RED_TEXT))
ep +=13
cur_poi +=1
cur_sbc +=1
count = ep - cur_sbc - 1
window.hline(cur_poi, cur_sbc, '-', count)
ep -=1
window.addstr(cur_poi, ep, '>')
cur_sbc -=1
print ""
for y in range(0,500):
for x in range(0,500):
inchar = window.inch(y,x)
output_file.write(inchar)
#curses.scr_dump(output_file)
inchar = window.getch()
output_file.close()
fo.close()
def main(stdscr):
call(stdscr)
wrapper(main)
获得以下错误,
TypeError:参数1必须是字符串或只读字符缓冲区, 不是int
@ inchar = window.getch()
请帮助我。
答案 0 :(得分:0)
问题在于:
output_file.write(inchar)
因为inchar
是一个数字,包含一个8位字符和一些视频属性。您可以使用类似
output_file.write(str(inchar))
但这引入了另一个问题:在输出文件中确定视频属性的开始(和结束)以及角色的实际位置。
答案 1 :(得分:0)
你应该尝试使用 window.getkey()方法,而不是 window.getch() 。
如文档中所述, getch()函数可以为各种函数,光标和其他键返回ASCII字符范围之外的值。 getkey()将返回一个多字符字符串,用于标识那些不是简单ASCII的字符。这里有一点解释:Curses Programming with Python。如上所述,非ASCII键的名称在 curses 模块中被定义为顶级符号(常量),所有这些都遵循命名模式 KEY_xxx 。
试试。
关于围绕 window.inch() 的循环......你需要屏蔽每次调用返回值的低8位( this_ascii_char = ret&amp; 0xFF ,其中 ret 是 window.inch()返回的整数。
其余位是该位置角色的curses属性。 (目前还不清楚你想要用它们做什么。如果你想存储属性和ASCII字符而不是它看起来像你需要为每个ASCII字符写16位属性。它可能有意义从屏幕的X * Y栅格中写下所有ASCII,然后是所有相应属性的压缩二进制文件。然后当您读取并处理数据时,您可以 zip()这两个部分将它们一起归档并将它们提供给你的curses屏幕显示循环。但我只是在推测。
这里的真正教训是阅读那些文档。我提供的链接告诉你这些功能正在返回。