Python npyscreen: Как запустить форму из нажатия кнопки? - PullRequest
0 голосов
/ 04 января 2019

Я погуглил, прочитал документы (мне трудно это понять), погуглил еще немного, посмотрел примеры, и я просто не могу найти ответ.Возможно нет никакого способа сделать это.

self.button = self.add(npyscreen.Button, name="Button")

Это производит кнопку, но это, кажется, больше выбора True или False.Можно ли с этим что-то сделать в печати, например, запустить другую форму?

Ниже приведен рабочий пример приложения, которое я собрал, чтобы начать.Можете ли вы показать мне, как заставить эту кнопку запустить вторую форму?Если это невозможно сделать с помощью кнопки, есть ли другой способ сделать то же самое?

В конечном счете, я бы хотел, чтобы в первом меню отображался список опций, которые после выбора одного из них открывались бы.до второй формы.Когда они будут выполнены во второй форме, они будут направлены обратно в главное меню, чтобы выбрать дополнительные параметры по мере необходимости или выйти из приложения.Я думаю, у меня есть все, что мне нужно, кроме этого.Спасибо за вашу помощь!

#!/usr/bin/python
# encoding=utf8

import npyscreen

# This is a form object
class WizardFormMain(npyscreen.ActionForm, npyscreen.SplitForm, npyscreen.FormWithMenus):
  def create(self):

    self.button = self.add(npyscreen.Button, name="Button") # Make this button go to FORM2

    # Since we are inheriting the npyscreen.FormWithMenus class we can use menus, this will add an option to the menu to exit the program
    self.menu = self.new_menu(name="Main Menu", shortcut='^M')
    self.menu.addItem("Exit Program", self.exit, "^X")
  # END DEF

  def exit(self):
    self.parentApp.switchForm(None) # causes the app to exit on OK
  # END DEF

  # Save data to conf file and Go back to first form...
  def on_ok(self):
    npyscreen.notify_confirm("OK Pressed, going to FORM2 now.", title="Notice", wrap=True, wide=True, editw=1)
    self.parentApp.setNextForm('FORM2')
  # END DEF

  def on_cancel(self):
    self.parentApp.setNextForm(None) # Also exit's the program
  # END DEF

# END CLASS

# FORM2
class WizardForm2(npyscreen.ActionForm, npyscreen.SplitForm, npyscreen.FormWithMenus):
  def create(self):

    self.name = self.add( npyscreen.TitleText, name="Username: " )
    self.passwd = self.add( npyscreen.TitleText, name="Password: " )

  # Save data to conf file and Go back to first form...
  def on_ok(self):
    npyscreen.notify_confirm("Saved! Going back to main form", title="OK Presed", wrap=True, wide=True, editw=1)
    self.parentApp.setNextForm('MAIN')
  # END DEF

  def on_cancel(self):
    npyscreen.notify_confirm("NOT Saved, going back to main form", title="OK Presed", wrap=True, wide=True, editw=1)
    self.parentApp.setNextForm('MAIN') # Back to main form
  # END DEF
# END CLASS

# This is the Wizards form manager function
class WizardApp(npyscreen.NPSAppManaged):
  def onStart(self):
    self.addForm('MAIN', WizardFormMain, name = "First Form!", lines=20, columns=60, draw_line_at=16 )
    self.addForm('FORM2', WizardForm2, name = "Second Form!", lines=20, columns=60, draw_line_at=16 )
  # END DEF
# END CLASS


if ( __name__ == "__main__"):
  wizard = WizardApp().run()

MAIN form OK Main Form MAIN form menu SECOND form

1 Ответ

0 голосов
/ 08 января 2019

Так что я думаю, что понял, как это сделать.Документы, касающиеся метода кнопки, в основном отсутствуют, поэтому я выяснил, как это сделать, изучив выходные данные метода кнопки.

Сначала в кнопке мы можем указать функцию обратного вызова (аналогично javascript) с помощью value_changed_callback = self.buttonPress внутри оператора self.add ().

Затем внутри функции buttonPress в примере показано уведомление, а затем переходит к FORM2 - переход к новой форме осуществляется путем указания формы с этим: self.parentApp.switchForm ('FORM2')

Вот важные вещи:

class WizardFormMain(npyscreen.ActionForm, npyscreen.SplitForm, npyscreen.FormWithMenus):
  def create(self):
    self.button = self.add(npyscreen.Button, name="Button", value_changed_callback=self.buttonPress) # Make this button go to FORM2

    # Since we are inheriting the npyscreen.FormWithMenus class we can use menus, this will add an option to the menu to exit the program
    self.menu = self.new_menu(name="Main Menu", shortcut='^M')
    self.menu.addItem("Exit Program", self.exit, "^X")
  # END DEF

  def buttonPress(self, widget):
    npyscreen.notify_confirm("BUTTON PRESSED!", title="Woot!", wrap=True, wide=True, editw=1)
    self.parentApp.switchForm('FORM2')
...