如何使用 Tkinter 创建密码输入字段

Posted

技术标签:

【中文标题】如何使用 Tkinter 创建密码输入字段【英文标题】:How to create a password entry field using Tkinter 【发布时间】:2011-01-25 20:48:06 【问题描述】:

我正在尝试使用 Tkinter 编写登录窗口,但无法隐藏星号格式的密码文本。这意味着密码输入是纯文本,必须避免。知道怎么做吗?

【问题讨论】:

【参考方案1】:

快速谷歌搜索得到了这个

widget = Entry(parent, show="*", width=15)

其中widget 是文本字段,parent 是父窗口小部件(窗口、框架等),show 是要回显的字符(即Entry 中显示的字符)和width 是小部件的宽度。

【讨论】:

这很有帮助。虽然 OP 没有提到这一点,但您能否谈谈 show='*' 是否也阻止复制/粘贴? 无论如何,我都可以在使用 Python 3.7 的 Mac 上讨论这个问题:复制只复制 *,因此安全性似乎足以满足大多数用途。 你知道,已经有一段时间了,所以当我写这个答案时,我什至不确定这是针对 python 3 的。我想这取决于操作系统如何呈现密码字段,如果它本身有它们。 真正准确明确的答案! @Hick 请将此标记为正确答案。 我可以使用 Python 3.8 在 Linux (Ubuntu) 上对此进行讨论。现在我们只需要一个 Windows 用户的证词 :-)。【参考方案2】:

如果您不想创建全新的 Entry 小部件,可以这样做:

myEntry.config(show="*");

要使其再次恢复正常,请执行以下操作:

myEntry.config(show="");

我通过检查先前的答案发现了这一点,并在导入后使用 Python 解释器中的帮助功能(例如 help(tkinter.Entry) (通过扫描那里的文档)。我承认我只是猜想弄清楚如何制作又正常了。

【讨论】:

【参考方案3】:
widget-name = Entry(parent,show="*")

您也可以使用项目符号:

bullet = "\u2022" #specifies bullet character
widget-name = Entry(parent,show=bullet)#shows the character bullet

【讨论】:

这对我不起作用;不知道我做错了什么,或者它是否不起作用 如果您使用的是 Python 3.x,您实际上可以只输入项目符号而不是 Unicode 代码。但是,请确保您的文件是 UTF-8 编码的。 @CaptainFantastic 在 Linux 上,您有时可以通过键入 Ctrl+shift+m​​ 然后键入代码来键入 Unicode 字符。或从字符映射中复制,或使用组合键序列。 在 python 中不应该使用破折号 (-) 来命名变量 你也可以使用“黑圈”:,至少对于某些 Linux 系统来说这是典型的。例如:bullet = "\u25CF".【参考方案4】:

这是一个非常简单的小型演示应用程序,使用 Tkinter 隐藏和获取密码。

#Python 3.4 (For 2.7 change tkinter to Tkinter)
    
from tkinter import * 
        
def show():
    p = password.get() #get password from entry
    print(p)
        
    
app = Tk()   
password = StringVar() #Password variable
passEntry = Entry(app, textvariable=password, show='*')
submit = Button(app, text='Show Console',command=show)

passEntry.pack() 
submit.pack()      

app.mainloop() 

希望有帮助!

【讨论】:

passEntrysubmit在调用pack()后都包含None,需要先赋值变量再调用pack管理器。【参考方案5】:

我自己也在寻找这种可能性。但是条目的立即“隐藏”并没有让我满意。我在修改 tk.Entry 中找到的解决方案,从而可以延迟隐藏输入:

基本上有延迟的输入被删除替换

        def hide(index: int, lchar: int):
            i = self.index(INSERT)
            for j in range(lchar):
                self._delete(index + j, index + 1 + j)
                self._insert(index + j, self.show)
            self.icursor(i)

并且击键被写入一个单独的变量中。

    def _char(self, event) -> str:
        def del_mkey():
            i = self.index(INSERT)
            self._delete(i - 1, i)

        if event.keysym in ('Delete', 'BackSpace'):
            return ""
        elif event.keysym == "Multi_key" and len(event.char) == 2:  # windows stuff
            if event.char[0] == event.char[1]:
                self.after(10, del_mkey)
                return event.char[0]
            return event.char
        elif event.char != '\\' and '\\' in f"event.char=":
            return ""
        elif event.num in (1, 2, 3):
            return ""
        elif event.state in self._states:
            return event.char
        return ""

如果此方法适合您,请查找PassEntry.py。

【讨论】:

以上是关于如何使用 Tkinter 创建密码输入字段的主要内容,如果未能解决你的问题,请参考以下文章

如何通过按下按钮从 tkinter 输入字段返回变量以在另一个函数中使用?

如何使用 tkinter 创建多行条目?

如何修复此密码生成器代码以打印所需的结果

如何弹出屏幕键盘以在 tkinter 的输入小工具中输入一些数据

如何在 tkinter 中更新由 matplotlib 创建的图形

如何确保将 Tkinter 表单中的值输入 MySQL 表而不是收到错误消息?