Создавайте интерактивные элементы в CLI - PullRequest
0 голосов
/ 27 июня 2019

Итак, я создаю небольшую программу на python, которая запускает другие программы с помощью функции subprocess.call().Мне интересно, есть ли способ создать интерактивные блоки в CLI, чтобы помочь пользователю узнать, какая у него опция, и упростить их выбор.

В настоящее время я просто использую функции input()с if/elif/else функциями, чтобы определить, что запускать.Я хотел бы преобразовать это в интерактивный интерфейс в интерфейсе командной строки, чтобы не требовалось ничего, кроме щелчка.

Это то, что я сейчас использую.Не удалось найти какой-либо материал о такой опции, возможно, я не выгляжу достаточно усердно.

import getpass
import subprocess
import os
OSPath = "/SYS64 3.7/"
full_path = os.getcwd()
CurrentPath = ""
dir_path = os.path.dirname(os.path.realpath(__file__))
answer = input("INPUT BOOT PARAMETER ")
if answer == "jdos":
    subprocess.call(["python3",dir_path + OSPath + "bootthingy.py"])
    subprocess.call(["python3",dir_path + OSPath + "jdosos.py"])
elif answer == "jdos.fboot":
    subprocess.call(["python3",full_path + OSPath + "jdosos.py"])
elif answer == "jdos.admin":
    user = getpass.getpass("username: ")
    password = getpass.getpass("password: ")
    bootcheck = 0
    with open('userpass.txt', 'r') as file:
        for line in file:
            line = line.strip('\n')
            login = line.split(',')
            if login[0] == user and login[1] == password:
                subprocess.call(["python3",full_path + OSPath + "jdososadmin.py"])
                bootcheck = 1
        if bootcheck == 0:
            print("Incorrect user or password.")
elif "jdos.exp" in answer:
    subprocess.call(["python3",full_path + OSPath + "jdosexperimentail.py"])
elif answer == "cancel":
    print("")
else:
    print("invalid")

Вместо того, чтобы пользователь вводил jdos в input(), у вас было бы 4 интерактивных поляиз 4-х различных вариантов, что-то вроде этого: [jdos] [jdos.fboot] [jdos.admin] [jdos.exp], каждый из которых запускает subprocess.call() при нажатии

Я пытался использовать пакет npyscreen, но я не былв состоянии заставить его работать успешно

Вот как это выглядит, когда я использую прилагаемый код npyscreen.

Код NPYScreen работает!

и вот что происходит, когда я выбираю поле и нажимаю OK

Программа Python не запускается должным образом ...

Как видите, программа работает,он просто перезаписывает текст в самом верху, и я не могу ничего ввести в функцию input('C:/SYS64 3.7> '), что, я думаю, могло бы быть сделано, чтобы приложение npyscreen не закрывалось.Я все еще новичок в npyscreen, и я не знаю точно, как это работает.

1 Ответ

0 голосов
/ 03 июля 2019

Npyscreen позволяет создавать консольные приложения, которые вы можете попросить пользователя предоставить вам некоторую информацию.

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

import npyscreen
import os
import getpass
import subprocess

class mainform(npyscreen.ActionForm):
    def create(self):
        self.OSPath = "/SYS64 3.7/"
        self.full_path = os.getcwd()
        self.CurrentPath = ""
        self.dir_path = os.path.dirname(os.path.realpath(__file__))

        opt_values = ["jdos", "jdos.fboot", "jdos.admin", "jdos.exp"]

        welcome_box = self.add(npyscreen.BoxTitle, max_height = 2, editable = False, value = "Welcome. Select BOOT PARAMETER")
        self.answer = self.add(npyscreen.TitleSelectOne, max_height = 4, name = "Selections:", values = opt_values, scroll_exit = True)


    def on_ok(self):
        if self.answer.value[0] == 0:
            subprocess.call(["python3", self.dir_path + self.OSPath + "bootthingy.py"])
            subprocess.call(["python3", self.dir_path + self.OSPath + "jdosos.py"])
        elif self.answer.value[0] == 1:
            subprocess.call(["python3", self.full_path + self.OSPath + "jdosos.py"])
        elif self.answer.value[0] == 2:
            user = getpass.getpass("username: ")
            password = getpass.getpass("password: ")
            bootcheck = 0
            with open('userpass.txt','r') as file:
                for line in file:
                    line = line.strip('\n')
                    login = line.split(',')
                    if login[0] == user and login[1] == password:
                        subprocess.call(["python3", self.full_path + self.OSPath + "jdososadmin.py"])
                        bootcheck = 1
                if bootcheck == 0:
                    print("Incorrect user or password.")
        elif self.answer.value[0] == 3:
            subprocess.call(["python3", self.full_path + self.OSPath + "jdosexperimentail.py"])

        self.parentApp.setNextForm(None)

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

#Application starts here
class App(npyscreen.NPSAppManaged):

    #Defining forms.
    def onStart(self):
        self.addForm('MAIN', mainform, name="name_here")

if __name__ == "__main__":
    app = App().run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...