2013-03-30 37 views
5

Tôi đang phát triển một daemon sao lưu sẽ chạy âm thầm trong nền. Daemon dựa trên phần mềm sao lưu duplicity, khi sao lưu cần có khóa mã hóa. Tôi không thể yêu cầu mật khẩu thông qua giao diện điều khiển vì rõ ràng, daemon không có quyền truy cập như vậy.Cách đơn giản nhất để yêu cầu người dùng sử dụng mật khẩu bằng hộp thoại đồ họa bằng Python?

Làm cách nào tôi có thể dễ dàng tạo lời nhắc yêu cầu người dùng nhập mật khẩu và trả về ứng dụng (thông qua biến số Python)? Tôi đang sử dụng Python 2.7.

+0

Bạn có thể sử dụng TkInter hoặc PyQt không? – chrisaycock

+0

Vâng, tôi không quá lo lắng về sự phụ thuộc thêm. – liamzebedee

Trả lời

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

Không hiệu quả với tôi. Tôi đã khắc phục sự cố với thư mục gốc được tham chiếu trước khi được xác định. Bây giờ tôi có thể nhận được hộp thoại hiển thị, nhưng khi tôi nhập mật khẩu 1) ** các ký tự hiển thị, thay vì chấm đen ** và 2) khi tôi nhấn return ** không có gì được trả về từ 'getpwd' **. Ngoài ra, tôi nhận được một lỗi khi tôi bấm OK - onpwdentry() mất chính xác 1 đối số Cảm ơn bạn đã phản hồi nhanh. – liamzebedee

+0

Ok, chỉnh sửa cuối cùng đó sẽ khắc phục được sự cố của bạn. Đối với 1) tôi đặt thuộc tính "hiển thị" của tiện ích Nhập thành '*', vì vậy nó sẽ hiển thị dấu hoa thị thay vì chữ cái. 2) là một lỗi cực kỳ ngu ngốc về phía tôi: Tôi đã có chức năng phụ trả lại mật khẩu, khi tôi rõ ràng muốn chức năng chính trả về nó. mainloop() đang chặn, vì vậy mật khẩu sẽ không được trả lại cho đến khi cửa sổ bị phá hủy bởi onokclick() hoặc onpwdentry() – pycoder112358

+0

Cảm ơn, vừa sửa lỗi cuối cùng, đã sửa đổi mật khẩu ngoài phạm vi của nó, điều đó có nghĩa là phương pháp vẫn đang quay lại "". Đã thêm một bản hack không tập trung cho Python 2.x (sử dụng dict), và nó hoạt động thành công! – liamzebedee

12

Bởi vì bạn hỏi cho đơn giản nhất (Python 2.7):

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

Đối với Python 3.3:

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

Điều này sẽ nhận được nhiều phiếu bầu hơn. – palsch

+0

Bạn có thể nói cách làm cho nó hoạt động trong Pyhton 3.x? – Vasily

+0

Đối với Python 3.3: nhập tkinter tkinter.simpledialog.askstring ("Mật khẩu", "Nhập mật khẩu:", show = '*') – ryry1985

3

Bởi vì không phải ai cũng muốn sử dụng TK, đây là một kịch bản sử dụng PyQt:

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

Và, bởi vì bạn sẽ không thường chỉ cần hỏi một người dùng cho một mật khẩu chỉ dành riêng cho các heck của nó:

#!/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() 

Và chức năng bash tương ứng:

#!/bin/bash 

passwordPrompt.py | tee 
2

giải quyết các vấn đề Phạm vi của @ pycoder112358 bài đăng:

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

Mở rộng câu trả lời của Diego với một số dịch vụ tối thiểu (không có điều này tôi đã gặp phải sự cố khi sử dụng ví dụ ngắn gọn của anh ấy):

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! 

Điều này sẽ hoạt động tốt từ chương trình không chỉ là ứng dụng đầu cuối/giao diện điều khiển.

+0

Đối với tôi đây là giải pháp tốt nhất vì tôi đang có ứng dụng giao diện điều khiển. Nhưng làm thế nào để mở cửa sổ hộp thoại trên màn hình chính, khi có nhiều màn hình trên Linux? Giải pháp từ @ pycoder112358 mở hộp thoại trên màn hình chính. – eztam

Các vấn đề liên quan