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

问题描述:

我想在我的python curses程序中使用外部终端文本编辑器和寻呼机。我使用它的子进程库。大多数情况下,除非退出文本编辑器(与nemovi相同),否则我无法再次使光标不可见。而且,在调用子进程之后,库不会在退出时清理屏幕。我错过了什么?从python curses程序运行终端文本编辑器

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) 

你没告诉你离去的library(当你离开运行纳米,例如),并诅咒想起了什么状态,你告诉它用于光标可视性。所以它忽略了你的改变,因为它不会像诅咒知道的那样改变。

如果您打算离开,请使用endwin函数。当你回来时,一个refresh撤消了。