从python curses程序运行终端文本编辑器

时间:2017-02-22 18:21:07

标签: python text-editor curses

我想在我的python curses程序中使用外部终端文本编辑器和寻呼机。我使用子进程库。在大多数情况下它工作正常,除非我退出文本编辑器(与nemovi相同),我不能再次使光标不可见。此外,在调用子进程后,库在退出时不清理屏幕。我错过了什么?

P.S。我知道curses.textpad,但我更喜欢使用外部编辑器和寻呼机。

这是一个程序:

import curses
import subprocess

class tui(object):

    def __init__(self):
        pass

    def setup(self, stdscr):
        self.stdscr = stdscr
        curses.use_default_colors()
        curses.init_pair(1, curses.COLOR_WHITE, -1)
        self.maxY, self.maxX = self.stdscr.getmaxyx()
        try:
            curses.curs_set(0)
        except:
            pass
        self.win = curses.newwin(self.maxY, self.maxX, 0, 0)
        self.stdscr.nodelay(0)
        self.draw()
        while True:
            try:
                c = self.win.getch()
                ret = self.keypress(c)
                if (ret == -1):
                    return
            except KeyboardInterrupt:
                break


    def draw(self):
        self.win.erase()
        self.win = curses.newwin(self.maxY, self.maxX, 0, 0)
        self.win.box()
        self.win.refresh()


    def nano(self):
        curses.savetty()
        subprocess.run("nano")
        curses.resetty()
        curses.curs_set(0)

    def less(self):
        curses.savetty()
        subprocess.run(["less", "/etc/fstab"])
        curses.resetty()
        curses.curs_set(0)



    def keypress(self, char):
        if char == curses.KEY_EXIT or char == ord('q'):
            return -1

        if char == ord('e'):
            self.nano()
            self.draw()
            return

        if char == ord('l'):
            self.less()
            self.draw()
            return

if __name__ == '__main__':
    mytui = tui()
    curses.wrapper(mytui.setup)

1 个答案:

答案 0 :(得分:2)

你没有告诉curses库你要离开(例如,当你离开运行nano时),并且 curses 记住你告诉它用于游标的状态-能见度。所以它忽略了你的改变,因为它没有改变,就像诅咒所知。

如果您要离开,请使用endwin功能。当你回来时,refresh撤消。