在Python中使用图形对话框询问用户密码的最简单方法?

在Python中使用图形对话框询问用户密码的最简单方法?,python,python-2.7,passwords,Python,Python 2.7,Passwords,我正在开发一个备份守护进程,它将在后台静默运行。守护进程依赖于备份软件的双重性,备份时需要加密密钥。我无法通过控制台请求密码,因为很明显,守护进程无法访问此类密码 我如何轻松地创建一个提示,要求用户输入密码,并将其返回给应用程序(通过Python变量)?我正在使用Tkinter import中的Python 2.7* from Tkinter import * def getpwd(): password = '' root = Tk() pwdbox = Entry(

我正在开发一个备份守护进程,它将在后台静默运行。守护进程依赖于备份软件的双重性,备份时需要加密密钥。我无法通过控制台请求密码,因为很明显,守护进程无法访问此类密码

我如何轻松地创建一个提示,要求用户输入密码,并将其返回给应用程序(通过Python变量)?我正在使用Tkinter import中的Python 2.7

*
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
def getpwd(): 密码=“” root=Tk() pwdbox=Entry(根,show='*')) def onpwdentry(evt): password=pwdbox.get() root.destroy() def onokclick(): password=pwdbox.get() root.destroy() 标签(根,文本='Password').pack(边='top') pwdbox.pack(边='top') pwdbox.bind(“”,onpwdentry) 按钮(root,command=onokclick,text='OK')。pack(side='top') root.mainloop() 返回密码
因为您要求的是最简单的(Python 2.7):

对于Python 3.3:

import tkinter
tkinter.simpledialog.askstring("Password", "Enter password:", show='*')
对于Python 3.6+:

import tkinter as tk
import tkinter.simpledialog
tk.Tk().withdraw()
tkinter.simpledialog.askstring("Password", "Enter password:", show='*')

因为不是每个人都想使用TK,所以这里有一个使用PyQt的脚本:

from PyQt5.QtWidgets import QApplication, QInputDialog, QLineEdit
import sys
app = QApplication(sys.argv)
qd = QInputDialog()
qd.setTextEchoMode(QLineEdit.Password)
qd.show()
app.exec()
而且,因为你通常不会只是为了好玩而要求用户输入密码:

#!/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()
以及相应的bash函数:

#!/bin/bash

passwordPrompt.py | tee

解决了@pycoder112358帖子的范围界定问题:

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
从tkinter导入*
密码=“”
def get_passwd():
全局密码
root=Tk()
pwdbox=Entry(根,show='*'))
def onpwdentry(evt):
全局密码
PASSWORD=pwdbox.get()
root.destroy()
def onokclick():
全局密码
PASSWORD=pwdbox.get()
root.destroy()
标签(根,文本='Password').pack(边='top')
pwdbox.pack(边='top')
pwdbox.bind(“”,onpwdentry)
按钮(root,command=onokclick,text='OK')。pack(side='top')
root.mainloop()
返回密码

以最小的内务管理扩展Diego的答案(没有这个,我尝试使用他漂亮的简短示例时会遇到大量崩溃):


如果程序只是终端/控制台应用程序,这将很好地工作。

您可以使用TkInter或PyQt吗?是的,我不太担心额外的依赖关系。对我来说不适用。我修复了在定义之前引用root的问题。现在我可以让对话框显示,但是当我键入密码时,1)字符显示,而不是黑点;2)当我点击return时,
getpwd
没有返回任何内容。另外,我在单击“确定”时出错-onpwdentry()正好接受1个参数,感谢您的快速响应。好的,最后一次编辑应该可以解决您的问题。对于1)我将条目小部件的“show”属性设置为“*”,因此它将显示星号而不是字母。2) 我犯了一个极其愚蠢的错误:我让子函数返回密码,而我显然希望主函数返回密码。mainloop()正在阻塞,因此在窗口被onokclick()或onpwdentry()破坏之前不会返回密码。谢谢,刚刚修复了上一个错误,该错误在其作用域之外修改密码,这意味着该方法仍然返回“”。为Python2.x添加了一个非本地的hack(使用dict),它成功地工作了!很乐意帮忙!抱歉,前两次编辑中出现的所有错误;今晚我似乎想得不太好。@pycoder112358仍然存在范围问题。我已经用底部的过程更新了它。这对我来说是最好的解决方案,因为我有一个控制台应用程序。但是,当Linux上有多个屏幕时,如何在主屏幕上打开对话框窗口呢?@pycoder112358的解决方案打开主屏幕上的对话框。对于Python 3.3:导入tkinter tkinter.simpledialog.askstring(“密码”,“输入密码:”,show='*'))似乎只有在您首先初始化Tk()时才起作用,如果不初始化Tk(),则会失败,
“非类型”对象没有属性“winfo\u可视”
。至少在Python3.6中,您只需要在
onpwdentry()
onokclick()中使用global。
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
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!