Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 窗口变为pad后,curses.echo()停止在curses中工作_Python_Curses_Python Curses - Fatal编程技术网

Python 窗口变为pad后,curses.echo()停止在curses中工作

Python 窗口变为pad后,curses.echo()停止在curses中工作,python,curses,python-curses,Python,Curses,Python Curses,在这个程序的早期版本中,echo()工作正常,但在一些重写后停止工作。 我能想到的唯一相关的事情是主窗口(self.screen)现在是一个pad,而不是stdscr 其他一切都像以前一样正常工作;当我在一个选择上按enter键时,我可以输入一个字符串,当我输入完时,字符串就在那里。它只是在我键入或粘贴时不会回显它,并且在getstr()完成之前我无法看到它。我不明白为什么。在我看来,这一切都应该像echo()/noecho()一样简单 我是遗漏了什么还是这是一个错误 (我知道此代码与pep8不

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

其他一切都像以前一样正常工作;当我在一个选择上按enter键时,我可以输入一个字符串,当我输入完时,字符串就在那里。它只是在我键入或粘贴时不会回显它,并且在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)
def详细信息(自身、scr、目标):
self.screen.clear()
屏幕=scr
光标集(0)
#此列表用于控制程序中选定项目的突出显示。
选项=[0]*6
#值列表为[目标值,(坐标),字符串的最大长度]
值=[
[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],
]
计数器=0#用于测试
选择=-1
光标位置=(0,0)
详细信息=真
自我更新_详细信息(目标、选项)
详情如下:
q=self.screen.getch()
如果q==ord(“b”)或q==ord(“q”):
详细信息=错误
如果q==按下键:
如果选择<5:
选择+=1
选项[选择]=A_反转
如果选择>0:
选项[selection-1]=0
自我更新_详细信息(目标、选项)
如果q==键向上:
如果选择>=0:
选择-=1
如果选择==-1:
选项[0]=0
其他:
选项[选择]=A_反转
选项[选择+1]=0
自我更新_详细信息(目标、选项)
如果q==ord(“\n”):
如果选择>=0:
目标值=值[选择][0]
self.screen.timeout(-1)
光标集(1)
self.screen.move(值[selection][1][0],值[selection][1][1])
self.screen.clrteool()
诅咒
self.screen.refresh(0,0,0,0,self.y_max-1,self.x_max-1)
如果选择==0:
self.TargetDict[Target].Name=self.screen.getstr()
如果选择==1:
#没有用。无法更改目标地址
new_ip=self.screen.getstr()
如果选择==2:
self.TargetDict[Target].CPE=self.screen.getstr()
如果选择==3:
self.TargetDict[Target].Inc=self.screen.getstr()
如果选择==4:
self.TargetDict[Target].Inst_ID=self.screen.getstr()
如果选择==5:
self.TargetDict[Target].Span_ID=self.screen.getstr()
诺埃乔()
光标集(0)
自我屏幕超时(300)
自我更新_详细信息(目标、选项)
self.screen.refresh(0,0,0,0,self.y_max-1,self.x_max-1)
自我更新_详细信息(目标、选项)
self.screen.addstr(0,0,str(计数器))
计数器+=1
self.screen.refresh(0,0,0,0,self.y_max-1,self.x_max-1)

这是因为我没有充分阅读文档

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


对于需要在中启用echo()而不是重写pad窗口的部分,只使用newwin()即可解决此问题。

能否添加代码示例?我正在尝试向一个新窗口添加echo,但似乎我并没有这样做,我正在跳过一个代码示例。非常感谢。