2013-03-30 1 views
5

バックグラウンドでサイレントモードで実行されるバックアップデーモンを開発しています。デーモンはバックアップソフトウェアのduplicityに依存しています。バックアップソフトウェアはバックアップ時に暗号化キーが必要です。明らかに、デーモンはそのようなものへのアクセス権がないので、コンソールからパスワードを尋ねることはできません。Pythonでグラフィカルなダイアログを使ってパスワードを尋ねる最も簡単な方法は?

パスワードを入力してアプリケーションに(Python変数を使用して)返すように求めるプロンプトを簡単に作成する方法はありますか?私はPython 2.7を使用しています。

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

のPython 3.3の場合:あなたは最も簡単な(Pythonの2.7)を求めているので

+0

TkInterまたはPyQtを使用できますか? – chrisaycock

+0

はい、余分な依存関係についてあまり心配していません。 – liamzebedee

答えて

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

私のためには機能しません。定義される前に参照されているルートに関する問題を修正しました。今度はダイアログを表示することができますが、パスワードを入力すると、黒い点**と2の代わりに文字が表示されます。** returnを押すと、 'getpwd' **から何も返されません。また、OKをクリックするとエラーになる - onpwdentry()は1つの引数をとる。 クイックレスポンスありがとう。 – liamzebedee

+0

最後に編集して問題を解決する必要があります。 1)私はEntryウィジェットの "show"プロパティを '*'に設定しているので、文字の代わりにアスタリスクが表示されます。 2)は私の部分では信じられないほど愚かなエラーでした:私は明らかにメイン関数が返すようにしたいときに、私はサブ関数がパスワードを返すようにしました。 mainloop()はブロックされているので、ウィンドウがonokclick()またはonpwdentry()によって破棄されるまでパスワードは返されません – pycoder112358

+0

ありがとう、ちょうどそのスコープの外でパスワードを変更していた最後のバグを修正しました。まだ ""を返していました。 Python 2.xの非局所的なハッキングを追加しました。(dictを使用しています)、正常に動作します! – liamzebedee

12

は誰もがTKを使用したい

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

これは、より多くの票を得るはずです。 – palsch

+0

Python 3.xで動作させる方法を教えてください。 – Vasily

+0

Python 3.3の場合: import tkinter tkinter.simpledialog.askstring( "パスワード"、 "パスワードを入力:"、show = '*') – ryry1985

3

ので、ここで使用したスクリプトです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 
2

は@ 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 
1

):

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! 

これは、端末/コンソールアプリケーションだけのプログラムからうまく機能します。

+0

これは私がコンソールアプリケーションを持っているので、これは最善の解決策です。しかし、Linux上で複数の画面を表示する場合、メイン画面でダイアログウィンドウを開くにはどうすればいいですか? @ pycoder112358のソリューションは、メイン画面のダイアログを開きます。 – eztam

関連する問題