2013-03-30 3 views
5

Ich entwickle einen Backup-Daemon, der still im Hintergrund läuft. Der Daemon basiert auf der duplicity Backup-Software, die beim Backup einen Verschlüsselungsschlüssel benötigt. Ich kann nicht über die Konsole nach dem Passwort fragen, weil der Daemon offensichtlich keinen Zugriff darauf hat.Einfachste Methode, Benutzer über ein grafisches Dialogfeld in Python nach dem Kennwort zu fragen?

Wie könnte ich einfach eine Eingabeaufforderung erstellen, die den Benutzer auffordert, ein Kennwort einzugeben, und es an die Anwendung (über eine Python-Variable) zurückgibt? Ich benutze Python 2.7.

+0

Können Sie TkInter oder PyQt verwenden? – chrisaycock

+0

Ja, ich mache mir keine Sorgen über zusätzliche Abhängigkeiten. – liamzebedee

Antwort

4
from Tkinter import * 

def getpwd(): 
    password = '' 
    root = Tk() 
    pwdbox = Entry(root, show = '*') 
    def onpwdentry(evt): 
     password = pwdbox.get() 
     root.destroy() 
    def onokclick(): 
     password = pwdbox.get() 
     root.destroy() 
    Label(root, text = 'Password').pack(side = 'top') 

    pwdbox.pack(side = 'top') 
    pwdbox.bind('<Return>', onpwdentry) 
    Button(root, command=onokclick, text = 'OK').pack(side = 'top') 

    root.mainloop() 
    return password 
+0

Funktioniert nicht für mich. Ich habe ein Problem behoben, bei dem root vor der Definition referenziert wurde. Jetzt kann ich den Dialog zur Anzeige bringen, aber wenn ich das Passwort eintippe 1) ** zeigen die Zeichen anstelle von schwarzen Punkten ** und 2), wenn ich auf die Return-Taste klicke ** wird nichts von 'getpwd' ** zurückgegeben. Auch bekomme ich einen Fehler, wenn ich auf OK klicke - onpwdentry() nimmt genau 1 Argument Danke für die schnelle Antwort. – liamzebedee

+0

Ok, die letzte Bearbeitung sollte deine Probleme beheben. Für 1) setze ich die "Show" -Eigenschaft des Entry-Widgets auf '*', so dass Sternchen anstelle von Buchstaben angezeigt werden. 2) war ein unglaublich dummer Fehler von mir: Ich hatte die Unterfunktion das Passwort zurückgeben, als ich offensichtlich wollte, dass die Hauptfunktion es zurückgibt. mainloop() blockiert, so dass das Passwort nicht zurückgegeben wird, bis das Fenster durch onokclick() oder onpwdentry() zerstört wird. – pycoder112358

+0

Danke, habe gerade den letzten Fehler behoben, der das Passwort außerhalb seines Gültigkeitsbereichs geändert hat, was die Methode bedeutete war immer noch zurück "". Einen nichtlokalen Hack für Python 2.x hinzugefügt (mit dict), und es funktioniert erfolgreich! – liamzebedee

12

Da Sie für den einfachste (Python 2.7) gestellt:

import Tkinter, tkSimpleDialog 
tkSimpleDialog.askstring("Password", "Enter password:", show='*') 

für Python 3.3:

import tkinter 
tkinter.simpledialog.askstring("Password", "Enter password:", show='*') 
+0

aktualisiert Dies sollte mehr Stimmen erhalten. – palsch

+0

Können Sie sagen, wie man es in Python 3.x machen kann? – Vasily

+0

Für Python 3.3: import tkinter tkinter.simplledialog.askstring ("Passwort", "Passwort eingeben:", show = '*') – ryry1985

3

Weil nicht jeder will TK verwenden, ist hier ein Skript PyQt:

from PyQt5.QtWidgets import QApplication, QInputDialog, QLineEdit 
import sys 
app = QApplication(sys.argv) 
qd = QInputDialog() 
qd.setTextEchoMode(QLineEdit.Password) 
qd.show() 
app.exec() 

Und weil Sie nicht in der Regel nur gerade ein Passwort eines Benutzers fragen würde für das Heck von ihm:

#!/bin/env python3 
#passwordPrompt.py 

from PyQt5.QtWidgets import QApplication, QInputDialog 
import sys, time 

def succFunc(): 
    sys.stdout.write(qd.textValue()) 
    sys.stdout.flush() 
    exit(0) 

def failFunc(): 
    exit(1) 

app = QApplication(sys.argv) 
qd = QInputDialog() 
#QLineEdit.Password 
qd.setTextEchoMode(2) 
qd.rejected.connect(failFunc) 
qd.accepted.connect(succFunc) 
qd.show() 
app.exec() 

und die entsprechenden bash Funktion:

#!/bin/bash 

passwordPrompt.py | tee 
2

Gelöst Scoping Fragen von @ pycoder112358 Beitrag:

from tkinter import * 

PASSWORD = '' 

def get_passwd(): 
    global PASSWORD 
    root = Tk() 
    pwdbox = Entry(root, show = '*') 

    def onpwdentry(evt): 
     global PASSWORD 
     PASSWORD = pwdbox.get() 
     root.destroy() 
    def onokclick():  
     global PASSWORD 
     PASSWORD = pwdbox.get() 
     root.destroy() 

    Label(root, text = 'Password').pack(side = 'top') 

    pwdbox.pack(side = 'top') 
    pwdbox.bind('<Return>', onpwdentry) 
    Button(root, command=onokclick, text = 'OK').pack(side = 'top') 

    root.mainloop() 
    return PASSWORD 
1

Erweiterung auf Diego Antwort mit einigen minimalen Housekeeping (ohne dass dies ich Abstürze in Hülle und Fülle immer versucht, sein schön kurzes Beispiel zu verwenden,):

import Tkinter, tkSimpleDialog 
root = Tkinter.Tk() # dialog needs a root window, or will create an "ugly" one for you 
root.withdraw() # hide the root window 
password = tkSimpleDialog.askstring("Password", "Enter password:", show='*', parent=root) 
root.destroy() # clean up after yourself! 

Dies funktioniert gut von einem Programm, das sonst nur eine Terminal-/Konsolenanwendung ist.

+0

Für mich ist dies die beste Lösung, da ich eine Konsolenanwendung habe. Aber wie öffnet man das Dialogfenster auf dem Hauptbildschirm, wenn man mehrere Bildschirme unter Linux hat? Die Lösung von @ pycoder112358 öffnet den Dialog auf dem Hauptbildschirm. – eztam

Verwandte Themen