pythonnpyscreen

(Npyscreen) How to implement functions into picking widget?


I have an issue with npyscreen application, which implicitly will be able to turning off or rebooting entire LAN (small project for my teacher). I have created picking widget with two test functions in order to check if app works correctly: enter image description here

def test_1():
    if True:
        file = open("test_1.txt", "w")
        file.write("This file is created because option 1 had been activated")
        file.close()
    else:
        pass


def test_2():
    if True:
        file = open("test_2.txt", "w")
        file.write("This file is created because option 2 had been activated")
        file.close()
    else:
        pass


class RatScreen(npyscreen.ActionForm):
    def create(self):
        # elf.show_atx = 20
        self.show_aty = 4
        self.add(npyscreen.TitleFixedText, name="Description:", value="Remote Access Tool is small app designed to manage machines in local network")
        self.add(npyscreen.TitleFixedText, name="Active computers:", value=active_computers)
        self.nextrely += 1
        self.add(npyscreen.TitleSelectOne, max_height=4, value=[test_1(), test_2()], name="Choose option", values=["Option 1", "Option 2"], scroll_exit=True)

    def on_ok(self):
        ok_cancel = npyscreen.notify_ok_cancel("Are you sure you want to execute selected task?", "Warning", editw=2)
        if ok_cancel == True:
            self.parentApp.setNextForm(None)
        else:
            self.parentApp.setNextFormPrevious

    def on_cancel(self):
        self.parentApp.setNextForm(None)


class RAT(npyscreen.NPSAppManaged):
    def onStart(self):
        self.addForm('MAIN', RatScreen, name='Remote Access Tool v1.1', lines=20)


if __name__ == '__main__':
    active_computers = []
    # ping()
    app = RAT().run()

And there the problem appeared, after every start of the app, it immediately creates both files. enter image description here

Can somebody help me with this issue? Thanks!


Solution

  • class RatScreen(npyscreen.ActionForm):
        def create(self):
            # elf.show_atx = 20
            self.show_aty = 4
            self.add(npyscreen.TitleFixedText, name="Description:", value="Remote Access Tool is small app designed to manage machines in local network")
            self.add(npyscreen.TitleFixedText, name="Active computers:", value=active_computers)
            self.nextrely += 1
            self.option = self.add(npyscreen.TitleSelectOne, max_height=4, name="Choose option", values=["Option 1", "Option 2"], scroll_exit=True)
    
        def on_ok(self):
            ok_cancel = npyscreen.notify_ok_cancel("Are you sure you want to execute selected task?", "Warning", editw=2)
            if ok_cancel:
                if self.option.values[self.option.value[0]] == "Option 1":
                    test_1()
                else:
                    test_2()
                self.parentApp.setNextForm(None)
            else:
                self.parentApp.setNextFormPrevious
    
        def on_cancel(self):
            self.parentApp.setNextForm(None)
    

    The problem was that you made both options True as default (value=[test_1(), test_2()]). Hope it helps.