无法在python中将window.inch(y,x)输出写入文件

时间:2017-04-24 09:05:25

标签: python curses

在下面的程序中,我创建了窗口输出。我想将输出重定向到文件。但我无法将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()

请帮助我。

2 个答案:

答案 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屏幕显示循环。但我只是在推测。

这里的真正教训是阅读那些文档。我提供的链接告诉你这些功能正在返回。