Forum >> Programmazione Python >> Scripting >> Salve a tutti, ho una domanda da fare

Pagina: 1 2 Avanti

salve, sto imparando il linguaggio di python e per primo programmino volevo fare un semplice keylogger(che funziona ovviamente solo avviandolo) e volevo anche farci che potevi inizialmente impostare l'Username e la Password ma non ci riesco, ora vi scrivo il programma che ho fatto qui sotto grazie in anticipo:

def start():
    print ("loading")
    user = input ("set your Username:")
    password = input ("set your password:")
    type_User()
def type_User():
    User = input ("Username:")
    if User == user:
        type_password()
    else:
        print("Username wrong")
        print
        type_user()
        
def type_password():
    Password = input ("Password")
    if Password == password:
        welcome()
    else:
        print ("password wrong")
        print
        type_password()
        
def welcome():
    print ("welcome "+user+"!")
    
    
start()





--- Ultima modifica di DanieleVaraldo in data 2015-12-14 10:44:44 ---
Il codice va indentato correttamente altrimenti è sintatticamente non valido e difficile o impossibile da leggere.
Basta rientrare in modifica sul primo post e correggere: selezionare il testo e usare il bottoncino <> a fianco ai colori.

*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
scusa non ho capito bene :question:



no niente ho sistemato


--- Ultima modifica di DanieleVaraldo in data 2015-12-14 10:45:15 ---
Benissimo. Ora, "non ci riesco" tecnicamente parlando non è un'informazione molto utile a individuare il problema. Il programma fa qualcos'altro da quello che ci si aspetta? Oppure si blocca (va in crash) con un messaggio di errore? E in tal caso quale errore? Quasi sempre il messaggio è abbastanza autoesplicativo sul problema specifico che ha causato il crash e sulla linea di codice incriminata. Dopo di che si può andare a vedere il perché.

PS: Anche sapere la versione di Python usata, il sistema operativo, e il modo di avviare il programma (click su icona, comando nella shell di sistema, comando all'interno di un IDE come idle) è utile (ad esempio col solo click su icona i messaggi di errore si perdono perché la shell si chiude subito).


--- Ultima modifica di Claudio_F in data 2015-12-14 17:38:15 ---
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
per "non ci riesco" intendo che non saprei come scrivere il codice nel senso che vorrei prima che si potesse impostare un Username e una password ma facendo così noto che non funziona ecco l'errore di crash che mi ha dato




Traceback (most recent call last):

File "C:\Users\Asus\Desktop\Programmazione\Python\another key logger.py", line 39, in <module>

start()

File "C:\Users\Asus\Desktop\Programmazione\Python\another key logger.py", line 8, in start

type_User()

File "C:\Users\Asus\Desktop\Programmazione\Python\another key logger.py", line 10, in type_User

User = input ("Username:")

File "<string>", line 1, in <module>

NameError: name 'Daniele' is not defined

User = input ("Username:")
File "<string>", line 1, in <module>
NameError: name 'Daniele' is not defined
Quella sintassi va usata solo con Python3, in quanto 'input' in Python2 svolge un'altra funzione (ed è un errore di percorso perché apre enormi problemi di sicurezza).

In Python2 per acquisire una stringa si deve invece scrivere:
variabile = raw_input("messaggio")

In alternativa, per usare 'input' in Python2 come se fosse lo stesso 'input' di Python3, nei programmi Python2 basta scrivere all'inizio:
input = raw_input


La spiegazione dell'errore comunque sta nel fatto che 'input' in Python2 non acquisisce semplicemente una stringa, ma cerca anche di eseguirla come se fosse codice (ecco la pericolosità!), e 'Daniele' non è codice valido ne il nome di una variabile definita precedentemente, da qui il 'NameError'.
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
ah si giusto scusami mi ero scordato di correggerle dato che inizialmente volevo scriverlo in python3
ora il codice l'ho cambiato un po'

ma mi resta ancora il dubbio di come devo codificare il fatto di poter impostare inizialmente un Username e una password come se ti stessi registrando ma senza che vengano salvate per sempre quindi ogni volta che avvii il programma devi reimpostarle

user = "12"
password = "134"


def start():
    print ("loading")
    type_User()
    
def type_User():
    User = raw_input ("Username:")
    try:
        if User == user:
            type_password()
        
        else:
            print("Username wrong")
            print
            type_User()
    except ValueError:
        print "Username wrong"
        print
        type_User
        
def type_password():
    Password = raw_input ("Password")
    try:
        if Password == password:
            welcome()
        else:
            print ("password wrong")
            print
            type_password()
    except ValueError:
        print"password wrong"
        print
        type_password()
        
def welcome():
    print ("welcome "+user+"!")
    
    
start()



--- Ultima modifica di DanieleVaraldo in data 2015-12-18 12:34:19 ---
Questo è il secondo problema, che è stato solo nascosto con quei due assegnamenti a livello globale, perché altrimenti si aveva sempre un NameError.

Banalmente basta scrivere dei raw_input al posto degli assegnamenti diretti, e funziona, ma il problema del perché sei stato costretto a metterli la fuori invece che lasciarli nella funzione main rimane, e riguarda:
1) la visibilità delle variabili
2) i parametri ricevuti dalle funzioni e gli argomenti passati alle funzioni
3) gli eventuali valori di ritorno prodotti dalle funzioni

Tutte cose da chiarire immediatamente se no ci si ritrova sempre con valori non visibili oppure non modificabili.

Diciamo che la via breve (che funziona ma non si dovrebbe fare) è quella di dichiarare globali nelle funzioni tutte le variabili "condivise" (che devono cioè essere lette/modificate da altre funzioni). La via corretta sarebbe usare il passaggio di argomenti e i valori di ritorno.



....
Oltre a questo ci sarebbe anche il fatto che un procedimento ciclico, come quello di richiedere degli input errati, si effettua tramite la struttura while, e non con un uso "anomalo" di chiamate ricorsive (benché nel limitato caso specifco funzionante).
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
ah ok e che ho appena iniziato a studiare python quindi d'istinto ho fatto questo comunque non ho ben capito cosa intendi scusami, ho provato a fare una cosa del genere ma niente
def start():
    print ("loading")
    user_set()
    
def user_set():
    global User
    user = raw_input("Set a Username here:")
    pass_set()
    
def pass_set():
    global Password
    password = raw_input("Set a Password here:")
    type_User()
    
def type_User():
    user = raw_input ("Username:")
    try:
        if user == User:
            type_password()
        
        else:
            print("Username wrong")
            print
            type_User()
    except ValueError:
        print "Username wrong"
        print
        type_User()
        
def type_password():
    password = raw_input ("Password")
    try:
        if password == Password:
            welcome()
        else:
            print ("password wrong")
            print
            type_password()
    except ValueError:
        print"password wrong"
        print
        type_password()
        
def welcome():
    print ("welcome "+user+"!")
    
start()


Che dice l'errore?
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***


Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.