相关文章推荐
乐观的枕头  ·  Python ...·  3 天前    · 
失眠的遥控器  ·  RabbitMQ 系列(2) —— 用 ...·  16 分钟前    · 
成熟的椰子  ·  Flutter:scrollControll ...·  6 月前    · 
一身肌肉的蟠桃  ·  java.net.unknownhostex ...·  1 年前    · 

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

8 人关注

我正在开发一个备份守护程序,它将在后台静静地运行。这个守护进程依赖于 duplicity 备份软件,在备份时需要一个加密密钥。我不能通过控制台询问密码,因为很明显,守护进程没有权限访问这些密码。

我怎样才能轻松地创建一个提示,要求用户输入密码,并将其返回给应用程序(通过一个Python变量)?我正在使用 Python 2.7 .

2 个评论
你可以使用TkInter或PyQt吗?
是的,我不太担心额外的依赖性。
python
python-2.7
passwords
liamzebedee
liamzebedee
发布于 2013-03-31
5 个回答
Diego Torres Milano
Diego Torres Milano
发布于 2016-09-15
已采纳
0 人赞同

因为你要求的是 simplest (Python 2.7):

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

For Python 3.3:

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

For Python 3.6+:

import tkinter as tk
import tkinter.simpledialog
tk.Tk().withdraw()
tkinter.simpledialog.askstring("Password", "Enter password:", show='*')
    
对于 Python 3.3: import tkinter tkinter.simpledialog.askstring("Password", "Enter password:", show='*')
似乎只有在你先初始化Tk()的情况下才能工作,否则会以 'NoneType' object has no attribute 'winfo_viewable' 失败。至少在Python 3.6中是这样
pycoder112358
pycoder112358
发布于 2016-09-15
0 人赞同
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
    
对我来说不起作用。我修复了一个问题,即在定义前引用了root。现在我可以让对话框显示出来,但当我输入密码1) 字符显示,而不是黑点 和2)当我按下返回键时 nothing is returned from getpwd .另外,当我点击确定时,我得到一个错误 - onpwdentry()正好需要一个参数 谢谢你的快速回复。
好的,最后的编辑应该能解决你的问题。1)我把条目部件的 "显示 "属性设置为 "*",所以它将显示星号而不是字母。2)是我的一个极其愚蠢的错误。我让子函数返回密码,而我显然想让主函数返回密码。 mainloop()是阻塞的,所以密码不会被返回,直到窗口被onokclick()或onpwdentry()销毁。
谢谢,刚刚修复了最后一个bug,即在其范围之外修改密码,这意味着该方法仍在返回""。为Python 2.x添加了一个非本地黑客(使用dict),它成功地工作了!
很高兴能提供帮助!对于前两次编辑的所有错误,我很抱歉;我今晚似乎没有想得太清楚。
@pycoder112358 仍然存在范围问题,我已经在底部更新了程序。
smaudet
smaudet
发布于 2016-09-15
0 人赞同

因为不是每个人都想使用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
    
Mallikarjunarao Kosuri
Mallikarjunarao Kosuri
发布于 2016-09-15
0 人赞同

Resolved scoping issues of @pycoder112358 post:

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
    
你只需要在 onpwdentry() onokclick() 里面使用全局。
dsz
dsz
发布于 2016-09-15
0 人赞同

在迭戈的回答基础上,做了一些最基本的内务工作(如果不这样做,我在试图使用他的漂亮的简短例子时就会出现大量的崩溃)。

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