0

このプログラムの以前のバージョンでは、echo() は正常に機能していましたが、いくつかの書き換え後に機能しなくなりました。関連する可能性があると私が考えることができる唯一のことは、メインウィンドウ(self.screen)が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)
4

1 に答える 1

0

これは、ドキュメントを十分に読んでいないだけでした。

パッドはウィンドウに似ていますが、画面サイズに制限されず、必ずしも画面の特定の部分に関連付けられているわけではありません。パッドは、大きなウィンドウが必要な場合に使用でき、一度にウィンドウの一部のみが画面に表示されます。パッドの自動更新 (スクロールや入力のエコーなどによる) は発生しません。パッドの refresh() メソッドと noutrefresh() メソッドには、表示するパッドの部分と、表示に使用する画面上の位置を指定する 6 つの引数が必要です。

パッドウィンドウを書き換える代わりに、echo() を有効にする必要があるセクションに newwin() を使用するだけで問題が解決しました。

于 2013-05-20T15:52:59.070 に答える