使用 Tkinter 实现密码对话框

2024-01-12

我正在尝试实现一个获取用户密码的对话框。我已经创建了班级PasswordDiaglog继承自tk.Toplevel但这会导致其执行不阻塞父框架的问题。

import Tkinter as tk

class PasswordDialog(tk.Toplevel):
    def __init__(self, parent):
        tk.Toplevel.__init__(self)
        self.password = None
        self.entry = tk.Entry(self, show='*')
        self.entry.pack()
        self.button = tk.Button(self)
        self.button["text"] = "Submit"
        self.button["command"] = self.StorePass
        self.button.pack()

    def StorePass(self):
        self.password = self.entry.get()
        self.destroy()
        print '1: Password was', self.password

class MainApplication(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.button = tk.Button(self)
        self.button["text"] = "Password"
        self.button["command"] = self.GetPassword
        self.button.pack()

    def GetPassword(self):
        passwd = PasswordDialog(self)
        # HALT HERE 
        print '2: Password was', passwd.password

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

通过运行我的代码提交foobar作为密码,终端中会看到以下输出:

2: Password was None
1: Password was foobar

预期输出应该是:

1: Password was foobar
2: Password was foobar

关于如何解决这个问题或如何实现一般密码对话框有什么想法吗?

打电话也很好StoredPass()输入后按回车键entry.


将密码存储为属性MainAplication类并使用传入的parent作为手柄PasswordDialog类意味着你可以使用self.wait_window(PasswordDialog(self))阻止执行直到PasswordDialog被摧毁:

import Tkinter as tk

class PasswordDialog(tk.Toplevel):
    def __init__(self, parent):
        tk.Toplevel.__init__(self)
        self.parent = parent
        self.entry = tk.Entry(self, show='*')
        self.entry.bind("<KeyRelease-Return>", self.StorePassEvent)
        self.entry.pack()
        self.button = tk.Button(self)
        self.button["text"] = "Submit"
        self.button["command"] = self.StorePass
        self.button.pack()

    def StorePassEvent(self, event):
        self.StorePass()

    def StorePass(self):
        self.parent.password = self.entry.get()
        self.destroy()
        print '1: Password was', self.parent.password

class MainApplication(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.password = None
        self.button = tk.Button(self)
        self.button["text"] = "Password"
        self.button["command"] = self.GetPassword
        self.button.pack()

    def GetPassword(self):
        self.wait_window(PasswordDialog(self))
        print '2: Password was', self.password

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

现在的输出符合预期:

1: Password was foobar
2: Password was foobar

要绑定 Return 键,您可以使用:

self.entry.bind("<KeyRelease-Return>", self.StorePassEvent)

使用包装函数:

def StorePassEvent(self, event):
    self.StorePass()

您还可以使用lambda反而:

self.entry.bind("<KeyRelease-Return>", lambda x: self.StorePass())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Tkinter 实现密码对话框 的相关文章

随机推荐

  • Json.Net 无法序列化为流,但可以正常序列化为字符串

    在内部 JsonConvert SerializeObject obj Formatting Indented 归结为 JsonSerializer jsonSerializer JsonSerializer Create null Str
  • 如何向 Firebase 验证服务器?

    我有一个在 Firebase 上编写的应用程序 安全规则和客户端代码不足以使我的应用程序正常工作 我需要连接服务器来执行一些任务 清理难以清理的非规范化数据断开连接时 处理程序 https www firebase com docs web
  • 图像未调整大小(仅限默认 Bootstrap 类)

    我正在使用 Bootstrap 3 0 dist 现在正在学习一些 Bootstrap 教程 试图了解它是如何工作的 我所做的一切都完全按照教程中的方式进行 适用于 v2 所以我将类更改为 v3 并且我不使用任何自定义 CSS 或任何内容
  • 包含非 Mavenized 依赖项,以便与 maven-shade-plugin 一起使用

    我想包括G数据客户端 http code google com p gdata java client 它不使用 Maven 作为我的 Maven 项目的依赖项 它以一堆 JAR 文件的形式提供 另外 我用Maven 阴影插件 http m
  • 如何将数据框列转换为序列

    我有一个数据框如下 LABEL TERM 4 inhibitori effect 4 novel therapeut 4 antiinflammator 4 promis approach 4 cell function 4 cell li
  • 使用 Capistrano 3 部署 Rails 应用程序时跳过数据库迁移

    当我们跑步时cap deploy 它在部署期间运行所有迁移 我们必须将应用程序指向现有数据库 并且不想修改现有数据库 有人可以建议我们如何在部署应用程序时跳过迁移步骤吗 我想你正在使用卡皮斯特拉诺 Rails https github co
  • 使用 Node 或 Express 返回 JSON 的正确方法

    因此 我们可以尝试获取以下 JSON 对象 curl i X GET http echo jsontest com key value anotherKey anotherValue HTTP 1 1 200 OK Access Contr
  • Vue 3:为什么我的可组合项不是响应式的?

    我想在另一个可组合项中使用一个可组合项 我的第一个可组合项基本上是 Vuex 的超轻量级版本 import reactive readonly from vue const state reactive settings loading t
  • 在Python中使用“for”计算索引

    我需要在Python中做同样的事情 for i 0 i lt 5 i cout lt lt i 但我不知道如何在Python中使用FOR来获取列表中元素的索引 如果您有一些给定的列表 并且想要迭代其项目and索引 您可以使用enumerat
  • 捕获与量词正则表达式匹配的组

    我是正则表达式世界的新手 我需要捕获一些不同类型的字符串 顺便说一下 请建议更优雅的方式来捕获此类字符串 n 任意正数 不相同 n 0 0 0 0 n n 0 0 0 n n n 0 0 n n n n 0 n n n n n 我尝试使用这
  • 从剪贴板上传图片到服务器

    我寻找解决方案很长时间 但找不到任何解决方案 是否有可能将图片从剪贴板上传到服务器上的文件 通过按 ctrl v 它可以适用于 Chrome 使用 PHP Javascript jquery 或者其他什么 一些 Chrome 的外部扩展 多
  • cucumber.js 并且不是一个函数

    我正在练习使用 cucumber js 通过 BDD 编写一些单元测试 当我尝试使用 And 语句时 该错误表明 TypeError And is not a function 这是我的代码 feature Feature dataTabl
  • 从 XML 文件获取子节点

    我有一个如下所示的 XML 文件
  • 将多个 csv 文件合并为一个 csv 文件

    我正在尝试将多个 csv 文件合并为一个 并尝试了多种方法 但我很挣扎 我从多个 csv 文件导入数据 当我将它们一起编译成一个 csv 文件时 似乎前几行填充得很好 但随后它开始在行之间随机输入可变数量的空格 并且它永远不会填写完合并的
  • 如何为ant任务创建嵌套元素?

    是否可以为任何 ant 任务创建嵌套元素 例如
  • 解析来自远程网站的 xml 数据

    我想解析来自远程网站的xml数据http services faa gov airport status IAD format xml http services faa gov airport status IAD format xml
  • Visual Studio 2019打开解决方案文件不兼容

    我想我正在使用 Visual Studio 2017 并编写了一个 SSIS 包 现在我安装了Visual Studio 2019 但无法打开解决方案文件 错误 不支持 此版本的 Visual Studio 无法打开 以下项目 项目类型可能
  • Azure Functions 的身份验证

    我花了 24 小时阅读有关如何创建 Azure Functions 的所有内容 并成功将 MVC WebApi 转换为具有多个功能的新 Function App 我的问题是 我没有找到任何关于如何使用它们进行最基本的身份验证的明确文档或教程
  • 为什么没有与 new/delete 系列等价的 realloc?

    正如标题所说 我知道没有与 C 相当的东西realloc in the new delete经营者家族 我已经找到了this https stackoverflow com questions 67225388 implementing c
  • 使用 Tkinter 实现密码对话框

    我正在尝试实现一个获取用户密码的对话框 我已经创建了班级PasswordDiaglog继承自tk Toplevel但这会导致其执行不阻塞父框架的问题 import Tkinter as tk class PasswordDialog tk