当前位置: 首页 > 面试题库 >

Python -在Tkinter中交互式验证Entry小部件内容

华誉
2023-03-14
问题内容

交互验证tkinter Entry小部件中的内容的推荐技术是什么?

我已经阅读了有关使用validate=True和的文章validatecommand=command,并且看来这些功能受到以下事实的限制:如果validatecommand命令更新了Entry小部件的值,这些功能将被清除。

鉴于这种行为,我们应该绑定的KeyPress,Cut以及Paste事件和监视/更新我们的Entry小部件的价值,通过这件事情?(还有我可能错过的其他相关事件?)

还是我们应该完全忘记交互式验证,而只对FocusOut事件进行验证?


问题答案:

正确的答案是,使用validatecommand小部件的属性。不幸的是,尽管在Tkinter中有足够的文档记录,但该功能在Tkinter领域中的记录不足。即使没有很好地记录下来,它也具有验证所需的一切,而无需求助于绑定或跟踪变量,或在验证过程中修改小部件。

诀窍是要知道您可以让Tkinter将特殊值传递给validate命令。这些值为您提供了决定数据是否有效所需的所有信息:编辑之前的值,编辑之后的值(如果编辑有效)以及其他几位信息。但是,要使用这些命令,您需要做一点巫术,以使此信息传递到您的validate命令。

注意:验证命令返回True或至关重要False。任何其他情况都会导致该小部件的验证被关闭。

这是一个仅允许小写的示例(并显示所有这些时髦的值):

import tkinter as tk  # python 3.x
# import Tkinter as tk # python 2.x

class Example(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        # valid percent substitutions (from the Tk entry man page)
        # note: you only have to register the ones you need; this
        # example registers them all for illustrative purposes
        #
        # %d = Type of action (1=insert, 0=delete, -1 for others)
        # %i = index of char string to be inserted/deleted, or -1
        # %P = value of the entry if the edit is allowed
        # %s = value of entry prior to editing
        # %S = the text string being inserted or deleted, if any
        # %v = the type of validation that is currently set
        # %V = the type of validation that triggered the callback
        #      (key, focusin, focusout, forced)
        # %W = the tk name of the widget

        vcmd = (self.register(self.onValidate),
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.entry = tk.Entry(self, validate="key", validatecommand=vcmd)
        self.text = tk.Text(self, height=10, width=40)
        self.entry.pack(side="top", fill="x")
        self.text.pack(side="bottom", fill="both", expand=True)

    def onValidate(self, d, i, P, s, S, v, V, W):
        self.text.delete("1.0", "end")
        self.text.insert("end","OnValidate:\n")
        self.text.insert("end","d='%s'\n" % d)
        self.text.insert("end","i='%s'\n" % i)
        self.text.insert("end","P='%s'\n" % P)
        self.text.insert("end","s='%s'\n" % s)
        self.text.insert("end","S='%s'\n" % S)
        self.text.insert("end","v='%s'\n" % v)
        self.text.insert("end","V='%s'\n" % V)
        self.text.insert("end","W='%s'\n" % W)

        # Disallow anything but lowercase letters
        if S == S.lower():
            return True
        else:
            self.bell()
            return False

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

有关调用register方法时幕后情况的更多信息,请参见输入验证tkinter



 类似资料:
  • 问题内容: 我正在使用Kivy做proyect,但复选框有问题。起初,我试图像python编码那样做程序(我知道它不是很干净,但是我理解得更多),并且我有了使用此编码的第一个屏幕: 例如,我想选择两个或三个选项,然后像选择类型一样保存到下一个屏幕。如果有人知道该怎么做并为下一个屏幕保存信息,那将对我有很大帮助,因为我拥有所有选项的下一个屏幕代码,但是我想在第一个屏幕中进行预选择,然后仅使用选择了。

  • 问题内容: 我在尝试使用Paramiko(Python)创建SFTP客户端时遇到了困难。 码: 错误: 打印运输对象显示: Paramiko日志文件: 但是SFTP可在FileZilla中使用: 当尝试使用而不是通过对象创建SFTP客户端时,出现了相同的错误。在创建我的传输对象时也尝试添加,没有帮助。 请问对此有何想法? 问题答案: 您的服务器正在使用键盘交互式身份验证,而不是简单的密码身份验证。

  • 我正在尝试使用Python创建一个简单的Tkinter GUI。用户界面有3个不同的按钮:是、否和打印。 如果用户单击“是”,然后单击“打印”,将出现一行“是1”。 如果用户取消单击“是”,然后单击“否”,然后单击“打印”,则会出现一行“否为0”。 但是程序怎么能够跟踪用户点击哪个按钮呢?我可以用哪个功能来找到这两个相关按钮之间的联系?代码是如何执行的? 太感谢你了!

  • 主要内容:基本属性,常用方法,Entry控件验证功能,实例演示,Spinbox 高级输入框Entry 控件是 Tkinter GUI 编程中的基础控件之一,它的作用就是允许用户输入内容,从而实现 GUI 程序与用户的交互,比如当用户登录软件时,输入用户名和密码,此时就需要使用 Entry 控件。 Entry 控件使用起来非常简单,下面对该控件做简单的介绍。基本语法格式如下: 基本属性 Entry 控件除了具备一些共有属性之外,还有一些自身的特殊属性,如下表所示: 属性名称 说明 exp

  • 但SFTP在Filezilla中工作: 当尝试使用而不是通过对象创建SFTP客户端时,我得到了同样的错误。创建传输对象时也尝试添加,但没有帮助。 对此有什么想法吗?

  • 我对编程比较陌生,我注意到,随着代码的增长,在2个文件(设置和主文件)中对所有内容进行编码会变得非常混乱。然而,当我将代码拆分成许多文件时,我遇到了无法导入fileB的问题。py简介文件a。py并在我的文件B中使用文件A中的变量或小部件(我得到未定义的名称错误)。 我将tkinter用于UI,因此我的主文件是tk循环(main.py)。每个按钮都引用不同文件中的函数。它运行良好,直到我的函数包含按