如何在 npyscreen 中制作退出按钮?

How do I make an exit button in npyscreen?

我想要的基本上是一个常规的 npyscreen.Form,但我希望 "OK" 按钮显示 "Exit"。

看来你不能在常规 npyscreen.Form 中更改按钮的名称,所以我尝试子类化 npyscreen.ButtonPress:

import npyscreen

class ExitButton(npyscreen.ButtonPress):
    def whenPressed(self):
        self.parentApp.setNextForm(None)

class MainForm(npyscreen.FormBaseNew):
    def create(self):
        self.exitButton = self.add(ExitButton, name="Exit", relx=-12, rely=-3)

class App(npyscreen.NPSAppManaged):
    def onStart(self):
        self.addForm("MAIN", MainForm, name="My Form")

if __name__ == "__main__":
    app = App().run()

按钮出现了,但是当你点击它时,你得到 'ExitButton' object has no attribute 'parentApp'

有更简单的方法吗?

这不是最优雅的解决方案,但它确实有效,首先要从 ExitButton 访问 setNextForm,您应该按如下方式进行:self.parent.parentApp.setNextForm(None)。即使更正它也不起作用,我使用 sys.exit(0) 退出。

import npyscreen
import sys


class ExitButton(npyscreen.ButtonPress):
    def whenPressed(self):
        sys.exit(0)

class MainForm(npyscreen.FormBaseNew):
    def create(self):
        self.exitButton = self.add(ExitButton, name="Exit", relx=-12, rely=-3)


class App(npyscreen.NPSAppManaged):
    def onStart(self):
        self.addForm("MAIN", MainForm, name="My Form")

if __name__ == "__main__":
    app = App().run()

Edwin 说得对,使用 self.parent.parentApp 而不是 self.parentApp

要退出应用程序,请使用 switchForm(None) 而不是 setNextForm(None)

def whenPressed(self):
    self.parent.parentApp.switchForm(None)

参考:post by npyscreen's author 确认这按预期工作。

有一种方法可以更改 OK 按钮的名称。以所需形式修改 class 属性

OK_BUTTON_TEXT='YourCustomNameOKButton'

参考:FORM class.

的内置帮助

使用 self.parent.parentApp,因为 ExitButton 驻留在 Form 中,并且表单可以访问 parentApp

使用 switchForm() 代替 setNextForm()

class ExitButton(npyscreen.ButtonPress):
    def whenPressed(self):
        self.parent.parentApp.switchForm(None)