为什么 tkinter 输入验证需要调用 register() ?

2024-06-24

def check_the_input_only_allows_digits_only(inp):
    # A function for validating the input, the purpose of this is to let
    # the user enter only digits.
    if inp.isdigit() or inp is "" or inp == "\b" or inp is None:
        return True
    else:
        return False


reg = creditor.register(check_the_input_only_allows_digits_only)
amount.config(validate = "key",validatecommand =  (reg,"%P"))

我已经理解了这个功能check_the_input_only_allows_digits_only已注册,并且对于用户输入的每个字符,都会调用该函数并验证输入。但为什么是.register必需的,如果没有则无法调用该函数.register每次用户输入内容时?幕后究竟发生了什么?


需要了解的重要一点是,Tkinter 只是嵌入式 Tcl 解释器的一个薄包装。这意味着由于两种语言的根本差异,有时会出现一些小的妥协。

TCL之道

在 Tcl 中进行输入验证时,您指定一个 Tcl 脚本而不仅仅是一个可调用函数。 Tcl 将扫描代码中的特殊字符序列(例如%P, %S等),并将它们替换为有关要验证的数据的信息。

当用 Tcl 编写时,您的代码可能如下所示:

entry .amount -validate key -validatecommand {
    expr {[string is int %P] || [string length %P]==0}
}

或者,使用 Tcl 函数:

proc check_the_input_only_allows_digits_only {P} {
    expr {[string is int P] || [string length P] == 0}
}
entry .amount \
    -validate key \
    -validatecommand {check_the_input_only_allows_digits_only %P}

Python 方式

Python 没有一种简单的方法来将代码作为字符串传递,即使有,Tcl 也无法理解它。相反,在 python 中,您必须传递对callable https://stackoverflow.com/questions/111234/what-is-a-callable-in-python-- 通常是对函数或方法的引用。

为了传递 python 需要可调用的特殊替换字符,您必须创建一个 Tcl 过程来充当 python 函数的代理。当您调用register功能。

proc = creditor.register(check_the_input_only_allows_digits_only)
amount.config(validate = "key", validatecommand =  (proc,"%P"))

如果不使用这些字符,则无需注册该命令。例如,以下代码是调用不带参数的函数的有效方法:

def check_the_input_only_allows_digits_only():
    ...
amount.config(validate = "key",validatecommand = check_the_input_only_allows_digits_only)

当然,传递的值是%P而其他特殊字符序列使得验证功能如此强大。

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

为什么 tkinter 输入验证需要调用 register() ? 的相关文章

随机推荐

  • 如何在不同的消息元素中显示相同输入字段的 ValidatorException 和 required="true"

    我采取了以下BalusC 启动示例 https stackoverflow com a 7493527 617373并通过添加提交按钮和附加 h messages 并删除f ajax来自h inputSecret s 删除了f ajax由于
  • Gmail REST API - 将邮件标记为已读

    我正在尝试使用 Gmail REST API 将邮件标记为已读 markGmailRead click function var request ajax type POST dataType json headers Authorizat
  • Jetpack Compose MutableLiveData 不更新 UI 组件

    我试图通过包含下载 ID 和进度值的数据对象列表一次显示多个下载进度条 此对象列表的值正在正确更新 通过日志记录显示 但 UI 组件在其初始值从 null 更改为第一个进度值后将不会更新 请帮忙 我看到有类似的问题 但他们的解决方案对我不起
  • 运动结构,根据 2D 图像点对应关系重建 3D 点云

    Use case 物体绕其中心以不同的速度旋转 固定摄像机正在观察物体 给定 2D 图像点对应关系重建 3D 点云 当物体旋转时 相机可以看到它的不同部分 从而检测到不同的点和对应关系 Scene A N 张图片b N 1 图像对C N 1
  • 从图形创建图像

    在 VB NET 中 我需要创建一个Image基于一个Graphics我有对象 但是 没有诸如此类的方法Image fromGraphics 等等 那我该怎么办 尝试这样的事情MSDN 文章 http msdn microsoft com
  • Web 服务器何时清除 PHP 会话标识符?

    背景 我正在尝试编写一个脚本 定期连接到网络服务器并检查特定页面上的某些信息是否已更改 我已经使用 bash 用于脚本 curl 用于实际连接 和 crontab 用于调度 的组合来完成这项工作 由于服务器需要身份验证 我首先使用curl
  • Rails Heroku 服务器回形针 Amazon S3 - AWS::S3::Errors::RequestTimeout

    当我使用附加图像保存 konkurrencer 模型时 我在 Heroku 上收到错误 但在本地服务器上却没有 我的 Heroku 日志 36m2012 04 01T17 45 37 00 00 app web 1 0m Started P
  • 更改将 HTML 标签名称扩展为元素的键

    我最近开始使用 PyCharm 编辑 HTML 文件 作为一个更大的 Python 项目的一部分 因此 我可能缺乏必要的经验来了解此功能所适应的更大前景 PyCharm 的 HTML 模式有一个很酷的功能 它将 CSS 选择器扩展为一个完整
  • 制作 pacman 时遇到一些问题?

    编辑 完全忘记提及我正在用 Java 编码 我真的很难制作某种检测系统或某种方法来使我的吃豆人精灵 角色在游戏中的棋盘上顺利移动 我没有把黑板做成图像 我首先尝试过颜色检测 效果最好 但一点也不平滑 而且相当不稳定 然后我尝试手动输入不允许
  • 如何始终在 ActionBar 上显示 Android 设置按钮?

    如何始终在 ActionBar 上显示 Android 设置按钮 4 0 即使设备有用于设置的硬件按钮 我也想显示它 因此带有和不带有硬件按钮的设备都是相同的 这就是我要说的 http oi48 tinypic com 2j104l0 jp
  • WPF 位图到图像的转换仅显示黑色图像

    我确实在以 wpf Image 形式显示图像 uEye Cam 时遇到一些问题 显示的 图像全黑 下面是我使用的代码 Get Cam Bitmap Image var cam new uEye Camera cam Init cam Mem
  • Netlify NodeJS 函数始终返回“对预检请求的响应未通过”

    我正在尝试使用创建一个 API 端点Netlify Lambda 函数 该代码在我的本地运行完美 但总是返回Access to XMLHttpRequest at https
  • ViewPager2 具有不同的项目高度和 WRAP_CONTENT

    有一些关于让 ViewPager 处理以扩展为中心的不同高度项目的帖子ViewPager自己修改它的onMeasure支持这一点 然而 鉴于ViewPager2被标记为最终类 扩展它不是我们可以做的事情 有谁知道是否有办法解决这个问题 例如
  • 如何在WCF请求和响应的soap标头中添加MessageID?

    企业移动设备管理协议在HTTP POST 请求中显示以下soap xml 如何将我的 Web 服务定义为要包含的肥皂头Action MessageID ReplyTo 和 To在请求和响应中 我尝试在 MessageCOntract 中定义
  • CSS 边框干扰绝对定位

    编辑 澄清 box sizing border box 似乎不适用 因为我使用的是绝对定位 下面的代码说明了我的问题 我使用绝对定位 因为我发现这对于基于流的布局来说更加棘手 但我愿意接受建议 我想要的是任意元素的边界 without影响节
  • platform.linux_distribution() 已弃用 - 有哪些替代方案?

    从 Python 3 5 开始platform linux distribution https docs python org 3 5 library platform html platform linux distribution已弃
  • 使用tensorflow和keras的不同训练结果

    Intro 我随机创建训练数据X形状为 1000 10 对于标签Y 它总是等于第一个元素X特征 例如 认为x1 0 1 0 2 0 3 0 9 theny 0 1 使用以下代码创建的数据集 from numpy random import
  • 是我的问题还是 Rails 和 Django 在 Windows 上安装困难?

    我尝试让这些框架在 Windows Vista 上运行几天 但没有成功 每次我认为我让它们工作时 我都会遇到一些涉及 PostgreSQL 或 MySQL 设置的随机错误 或者路径被搞砸了 或者一些其他命令行错误 未识别为内部或外部命令 或
  • 在 Java 中将希腊语转换为大写

    我想做的事情相当简单 String example Mary Had A Little Lamb String upper example toUpperCase 在希腊语中 只有大写单词的第一个字母才应包含重音字符 upper conta
  • 为什么 tkinter 输入验证需要调用 register() ?

    def check the input only allows digits only inp A function for validating the input the purpose of this is to let the us