Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.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 在NPSAppManaged应用程序中切换表单时出现问题_Python_Python 3.x_Python 3.8_Npyscreen - Fatal编程技术网

Python 在NPSAppManaged应用程序中切换表单时出现问题

Python 在NPSAppManaged应用程序中切换表单时出现问题,python,python-3.x,python-3.8,npyscreen,Python,Python 3.x,Python 3.8,Npyscreen,几周来,我一直在尝试使用npyscreen创建一个应用程序,但我一直遇到一些问题。我可以从我的主要形式切换到第二种形式。但当我尝试切换回主窗体时,应用程序实际上什么也不做。我的函数被调用,self.parentApp.switchForm()函数被调用,但什么都不做 预期的功能是主窗体允许输入名称。按return键后,输入处理程序将验证它是否为有效输入(检查它是否存在于预定义的字典中)。如果是,它将从字典中收集值,将该信息设置为下一个“SerialForm”显示的表单,然后切换到该表单。然后,用

几周来,我一直在尝试使用npyscreen创建一个应用程序,但我一直遇到一些问题。我可以从我的主要形式切换到第二种形式。但当我尝试切换回主窗体时,应用程序实际上什么也不做。我的函数被调用,
self.parentApp.switchForm()
函数被调用,但什么都不做

预期的功能是主窗体允许输入名称。按return键后,输入处理程序将验证它是否为有效输入(检查它是否存在于预定义的字典中)。如果是,它将从字典中收集值,将该信息设置为下一个“SerialForm”显示的表单,然后切换到该表单。然后,用户以该形式输入第一个序列号的信息。如果信息匹配,它将转到下一个输入字段。否则,它将保持在相同的输入上。一旦“SerialForm”中的两个字段都输入并匹配它们应该匹配的内容,程序就应该记录该信息并切换回“MAIN”表单

在我调用
self.serialTwoInputHandler()
中的
self.parentApp.switchForm('MAIN')
之前,一切都是正常的,但在调用“SerialForm”之后,所有填充的值仍然存在(完全没有变化)。没有出现异常或错误,我只是不知所措

NPSAppManaged

终端名称表单(“主”表单)

SerialNumbersForm(“SerialForm”形式)

有几个函数调用您可能不知道我在重写的小部件类中添加了哪些函数调用。但是,不应该通过直接调用该方法来影响表单切换功能

例如,我已覆盖每个文本输入小部件,以包括以下内容:

def setReturnHandler(self, function):
    handlers = {curses.KEY_ENTER: function,  # By key identity
                curses.ascii.NL: function,  # Unix character
                curses.ascii.CR: function  # NT character
                }
    self.add_handlers(handlers)

def hide(self, state):
    self.hidden = state
    self.display()
    return

def show(self, state):
    self.hidden = not state
    self.display()
    return

def set_editable(self, editable):
    super(TitleText, self).set_editable(editable)
    self.editable = editable
    self.entry_widget.editable = editable
    if(editable):
        self.hidden = False
    return

def set_editing(self, editing):
    if(editing):
        self.set_editable(True)
    self.editing = editing  # Affects the widget title color
    self.entry_widget.editing = editing
    self.display()
    if not editing:
        self.exit()
    else:
        self.edit()
    return

def exit(self):
    self.entry_widget.how_exited = 1
    return
class TerminalNameForm(nps.FormBaseNew):
    def __init__(self, *args, lines=None, columns=None, **kwargs):
        if(not lines or not columns):
            # Get the full terminal size as defualt
            from terminalsize import get_terminal_size
            size = get_terminal_size()
            if (not columns):
                columns = size[0]
            if (not lines):
                lines = size[1]
        super(TerminalNameForm, self).__init__(
            *args, lines=lines, columns=columns, **kwargs)

    def create(self):
        self.promptLabel = self.add(FixedText, value='Enter Terminal Name:')
        self.nameInput = self.add(TitleText, name='> ')
        self.nameInput.setReturnHandler(self.nameInputHandler)

    def nameInputHandler(self, *args, **keywords):
        if(not self.nameInput.value):
            return
        inputName = self.nameInput.value
        global terminalNames
        if(inputName not in terminalNames):
            self.promptLabel.color = 'DANGER'
            self.promptLabel.value = f'Invalid Name: {inputName}'
            self.promptLabel.display()
            return
        sn1 = terminalNames[inputName]['serial1']
        sn2 = terminalNames[inputName]['serial2']

        self.parentApp.getForm('SerialForm').setExpectedValues(inputName, sn1, sn2)
        self.parentApp.switchForm('SerialForm')

    def quit(self):
        self.parentApp.switchForm(None)
class SerialNumbersForm(nps.FormBaseNew):
    #def __init__(self, name, sn1, sn2, *args, lines=None, columns=None, **kwargs):
    def __init__(self, *args, lines=None, columns=None, **kwargs):
        if(not lines or not columns):
            # Get the full terminal size as defualt
            from terminalsize import get_terminal_size
            size = get_terminal_size()
            if (not columns):
                columns = size[0]
            if (not lines):
                lines = size[1]
        self.terminalName = ''
        self.expectedSerialOne = ''
        self.expectedSerialTwo = ''
        super(SerialNumbersForm, self).__init__(*args, lines=lines, columns=columns, **kwargs)

    def create(self):
        self.terminalNameLabel = self.add(FixedText, value=f'Name: {self.terminalName}')
        self.expectedLabel = self.add(FixedText, value='Expected Values:', color='NO_EDIT')
        self.expectedSerialOneLabel = self.add(TitleFixedText, name='\tS/N 1:', value=self.expectedSerialOne)
        self.expectedSerialTwoLabel = self.add(TitleFixedText, name='\tS/N 2:', value=self.expectedSerialTwo)

        newPos = self.expectedSerialTwoLabel.rely+2
        self.serialOneInput = self.add(TitleText, name='S/N 1:', rely=newPos)
        self.serialTwoInput = self.add(TitleText, name='S/N 2:', hidden=True)

        self.add_handlers({'^C': quit})

        self.serialOneInput.setReturnHandler(self.serialOneInputHandler)
        self.serialTwoInput.setReturnHandler(self.serialTwoInputHandler)

    def serialOneInputHandler(self, *args, **keywords):
        if(not self.serialOneInput.value):
            return

        inputValue = self.serialOneInput.value
        if(inputValue == self.expectedSerialOne):
            self.serialOneInput.set_editing(False)
            self.serialTwoInput.set_editing(True)
        else:
            # WHY. WONT. EDITING. COLOR. CHANGE!
            self.serialOneInput.color = 'DANGER'
            self.serialOneInput.labelColor = 'DANGER'

            self.serialOneInput.label_widget.color = 'DANGER'
            self.serialOneInput.label_widget.highlight_color = 'DANGER'

            self.serialOneInput.entry_widget.color = 'DANGER'
            self.serialOneInput.entry_widget.highlight_color = 'DANGER'
            self.serialOneInput.display()
            print()

    def serialTwoInputHandler(self, *args, **keywords):
        if(not self.serialTwoInput.value):
            return

        inputValue = self.serialTwoInput.value
        if(inputValue == self.expectedSerialTwo):
            self.parentApp.setNextForm('MAIN')
            self.parentApp.switchFormNow()

    def setExpectedValues(self, name, sn1, sn2):
        self.terminalName = name
        self.terminalNameLabel.value = f'Name: {name}'
        self.expectedSerialOne = sn1
        self.expectedSerialOneLabel.value = sn1
        self.expectedSerialTwo = sn2
        self.expectedSerialTwoLabel.value = sn2
        return
def setReturnHandler(self, function):
    handlers = {curses.KEY_ENTER: function,  # By key identity
                curses.ascii.NL: function,  # Unix character
                curses.ascii.CR: function  # NT character
                }
    self.add_handlers(handlers)

def hide(self, state):
    self.hidden = state
    self.display()
    return

def show(self, state):
    self.hidden = not state
    self.display()
    return

def set_editable(self, editable):
    super(TitleText, self).set_editable(editable)
    self.editable = editable
    self.entry_widget.editable = editable
    if(editable):
        self.hidden = False
    return

def set_editing(self, editing):
    if(editing):
        self.set_editable(True)
    self.editing = editing  # Affects the widget title color
    self.entry_widget.editing = editing
    self.display()
    if not editing:
        self.exit()
    else:
        self.edit()
    return

def exit(self):
    self.entry_widget.how_exited = 1
    return