0

在这个程序的早期版本中,echo() 工作正常,但在一些重写后停止工作。我能想到的唯一可能相关的是主窗口(self.screen)现在是一个pad而不是stdscr。

其他一切都像以前应该做的那样工作;当我在一个选择上按回车键时,我可以输入一个字符串,当我完成后,字符串就在我输入它的地方。它只是在我键入或粘贴时不会回显它,并且在 getstr() 完成之前我看不到它。我不明白为什么。在我看来,这一切都应该像 echo()/noecho() 一样简单。

我错过了什么还是这是一个错误?

(我知道这段代码不符合 pep8。我最终会解决这个问题)

在旧版本中工作!:

        if q == ord("\n"):
            if selection >= 0:
                target_value = values[selection][0]
                screen.timeout(-1)
                curs_set(1)
                curs_pos = values[selection][1]
                screen.move(curs_pos[0], curs_pos[1])
                screen.clrtoeol()
                echo()
                if selection == 0:
                    self.TargetDict[Target].Name = screen.getstr()
                if selection == 1:
                    new_ip = screen.getstr()
                if selection == 2:
                    self.TargetDict[Target].CPE = screen.getstr()
                if selection == 3:
                    self.TargetDict[Target].Inc = screen.getstr()
                if selection == 4:
                    self.TargetDict[Target].Inst_ID = screen.getstr()
                if selection == 5:
                    self.TargetDict[Target].Span_ID = screen.getstr()
                noecho()
                curs_set(0)
                screen.timeout(300)    

        self.screen.addstr(0,0, str(counter))
        counter += 1
        self.screen.refresh()

不工作!:

        if q == ord("\n"):

            if selection >= 0:
                target_value = values[selection][0]
                self.screen.timeout(-1)
                curs_set(1)
                self.screen.move(values[selection][1][0], values[selection][1][1])
                self.screen.clrtoeol()
                curses.echo()
                self.screen.refresh(0, 0, 0, 0, self.y_max-1, self.x_max-1)

                if selection == 0:
                    self.TargetDict[Target].Name = self.screen.getstr()
                if selection == 1:
                    #not used. Can't change target address
                    new_ip = self.screen.getstr()
                if selection == 2:
                    self.TargetDict[Target].CPE = self.screen.getstr()
                if selection == 3:
                    self.TargetDict[Target].Inc = self.screen.getstr()
                if selection == 4:
                    self.TargetDict[Target].Inst_ID = self.screen.getstr()
                if selection == 5:
                    self.TargetDict[Target].Span_ID = self.screen.getstr()

                noecho()
                curs_set(0)
                self.screen.timeout(300)
                self.update_details(Target, option)
                self.screen.refresh(0, 0, 0, 0, self.y_max-1, self.x_max-1)

这是整个功能

def Details(self, scr, Target):

    self.screen.clear()
    screen = scr
    curs_set(0)        

    #This list is used to control the highlight of selected item in the program. 
    option = [0]*6

    # valuesList is [Targetvalue, (co-ordinates), max-lenght of string]
    values = [
              [self.TargetDict[Target].Name, (1,0), 38],
              [self.TargetDict[Target].IP, (3,12), 15],
              [self.TargetDict[Target].CPE, (4,12), 15],
              [self.TargetDict[Target].Inc, (5,12), 10],
              [self.TargetDict[Target].Inst_ID, (6,12), 10],
              [self.TargetDict[Target].Span_ID, (7,12), 6],
            ]
    counter = 0     #For testing

    selection = -1
    curs_pos = (0,0)

    Details = True

    self.update_details(Target, option)

    while Details:

        q = self.screen.getch()

        if q == ord("b") or q == ord("q"):
            Details = False

        if q == KEY_DOWN:
            if selection < 5 :
                selection += 1
                option[selection] = A_REVERSE
                if selection > 0 :
                    option[selection-1] = 0
            self.update_details(Target, option)

        if q == KEY_UP:
            if selection >= 0 :
                selection -= 1
                if selection == -1:
                    option[0] = 0
                else:
                    option[selection] = A_REVERSE
                    option[selection + 1] = 0
            self.update_details(Target, option)

        if q == ord("\n"):

            if selection >= 0:
                target_value = values[selection][0]
                self.screen.timeout(-1)
                curs_set(1)
                self.screen.move(values[selection][1][0], values[selection][1][1])
                self.screen.clrtoeol()
                curses.echo()
                self.screen.refresh(0, 0, 0, 0, self.y_max-1, self.x_max-1)

                if selection == 0:
                    self.TargetDict[Target].Name = self.screen.getstr()
                if selection == 1:
                    #not used. Can't change target address
                    new_ip = self.screen.getstr()
                if selection == 2:
                    self.TargetDict[Target].CPE = self.screen.getstr()
                if selection == 3:
                    self.TargetDict[Target].Inc = self.screen.getstr()
                if selection == 4:
                    self.TargetDict[Target].Inst_ID = self.screen.getstr()
                if selection == 5:
                    self.TargetDict[Target].Span_ID = self.screen.getstr()

                noecho()
                curs_set(0)
                self.screen.timeout(300)
                self.update_details(Target, option)
                self.screen.refresh(0, 0, 0, 0, self.y_max-1, self.x_max-1)

        self.update_details(Target, option)            
        self.screen.addstr(0,0, str(counter))
        counter += 1
        self.screen.refresh(0, 0, 0, 0, self.y_max-1, self.x_max-1)
4

1 回答 1

0

这只是我没有很好地阅读文档。

pad 就像一个窗口,只是它不受屏幕大小的限制,也不一定与屏幕的特定部分相关联。当需要大窗口时可以使用焊盘,并且一次只会在屏幕上显示窗口的一部分。不会自动刷新焊盘(例如滚动或回显输入)。pad 的 refresh() 和 noutrefresh() 方法需要 6 个参数来指定要显示的 pad 的部分以及屏幕上用于显示的位置。

通过只对我需要启用 echo() 的部分使用 newwin() 而不是重写 pad-window 来解决问题。

于 2013-05-20T15:52:59.070 回答