То, что я хочу, это в основном обычный npyscreen.Form, но я хочу, чтобы кнопка «ОК» говорила «Выход».

Похоже, что вы не можете изменить имя кнопки в обычном 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'.

Есть ли более простой способ сделать это?

3
John 7 Янв 2017 в 01:19

4 ответа

Лучший ответ

Эдвин прав, используйте self.parent.parentApp, а не self.parentApp.

Для выхода из приложения используйте switchForm(None) вместо setNextForm(None).

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

Ссылка: сообщение автора npyscreen подтверждает эту работу, как и ожидалось ,

3
davedwards 7 Янв 2017 в 01:11

Используйте self.parent.parentApp, поскольку ExitButton находится внутри Form, а Форма имеет доступ к parentApp

Используйте switchForm() вместо setNextForm()

class ExitButton(npyscreen.ButtonPress):
    def whenPressed(self):
        self.parent.parentApp.switchForm(None)
0
IanTheAdrian 29 Авг 2019 в 00:34

Есть способ изменить имя кнопки ОК. Изменить в нужной форме класса атрибут

OK_BUTTON_TEXT='YourCustomNameOKButton'

Справка: встроенная справка для класса FORM.

1
Julián 26 Апр 2019 в 17:35

Это не самое элегантное решение, но оно работает, прежде всего, для доступа к setNextForm из ExitButton, вы должны сделать это следующим образом: 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()
3
eyllanesc 7 Янв 2017 в 00:27