当前位置: 首页 > 知识库问答 >
问题:

如何验证tkinter条目

李明贤
2023-03-14

我正在开发一个tkinter应用程序,它有一个入口小部件和一个方法,当用户在其中输入一些东西时,就可以对其进行验证。问题是 绑定在 self.entry_str更新之前运行validate方法,因此它测试条目中以前的内容。我想让它做的是在 self.entry_str更新后运行validate方法,有人知道我怎么做吗?以下是简化程序:

import sys
import tkinter as tk


class GUI:
    def __init__(self, master):
        # frame
        self.frame = tk.Frame(master)
        self.frame.pack()
        # StringVars
        self.error = tk.StringVar()
        self.error.set('')
        self.entry_str = tk.StringVar()
        self.entry_str.set('')
        # widgets
        self.entry = tk.Entry(self.frame, textvariable=self.entry_str)
        self.entry.bind('<Key>', lambda _: self.validate_entry())
        self.entry.grid(row=0, column=0)
        self.error_label = tk.Label(self.frame, textvariable=self.error, fg='red')
        self.error_label.grid(row=1, column=0)
        self.bttn = tk.Button(self.frame, text='continue', command=sys.exit)
        self.bttn.grid(row=2, column=0)

    def validate_entry(self):
        try:
            _ = int(self.entry_str.get())
        except ValueError:# entry is not valid: disable button and show error
            self.error.set('entry has to be an integer')
            self.bttn.config(state='disabled')
        else:# entry is valid: enable button and hide error
            self.error.set('')
            self.bttn.config(state='normal')


root = tk.Tk()
gui = GUI(root)
root.wm_title('entry validation test')
root.mainloop()

共有2个答案

楚健
2023-03-14

你有两个选择。第一个:在用户输入数据之前保存输入数据,如果需要的话可以恢复数据,如下所示:

import sys
import tkinter as tk


class GUI:
    def __init__(self, master):
        # frame
        self.frame = tk.Frame(master)
        self.frame.pack()
        # StringVars
        self.error = tk.StringVar()
        self.error.set('')
        self.entry_str = tk.StringVar()
        self.entry_str.set('')
        # widgets
        self.entry = tk.Entry(self.frame, textvariable=self.entry_str)
        self.entry.bind('<Key>', self.validate_entry)
        self.entry.grid(row=0, column=0)
        self.error_label = tk.Label(self.frame, textvariable=self.error, fg='red')
        self.error_label.grid(row=1, column=0)
        self.bttn = tk.Button(self.frame, text='continue', command=sys.exit)
        self.bttn.grid(row=2, column=0)

        self.current_entry_state = ""
        self.error_occured = False

    def validate_entry(self, event):
        current_entry_state = self.entry_str.get()
        # Save the state only if there are no invalid characters:
        try:
            _ = int(self.entry_str.get())
            self.current_entry_state = current_entry_state
            self.error_occured = False
        except:
            self.error_occured = True
        # Wait for tkinter to display the character
        self.entry.after(1, self._validate_entry)

    def _validate_entry(self):
        try:
            _ = int(self.entry_str.get())
        except ValueError:# entry is not valid: disable button and show error
            self.error.set('entry has to be an integer')
            # Restore the entry's text:
            self.entry.delete("0", "end")
            self.entry.insert("end", self.current_entry_state)
        else:
            if not self.error_occured:# entry is valid: enable button and hide error
                self.error.set('')


root = tk.Tk()
gui = GUI(root)
root.wm_title('entry validation test')
root.mainloop()

使用该方法,您还必须检查用户何时按下Ctrl-V

还有另一种方法(没有很好地记录),但看看这个和这个。

鲜于煜祺
2023-03-14

使用 代替

更好的方法是使用.trace

self.entry_str = tk.StringVar()
self.entry_str.set('')
self.entry_str.trace('w', self.validate_entry)

...

def validate_entry(self, *event):
        try:
            _ = int(self.entry_str.get())
         ...

另一种方法是禁止用户输入除整数以外的任何东西。

self.entry = tk.Entry(self.frame, textvariable=self.entry_str, validate='key', validatecommand=(master.register(self.validate), "%P"))
...
def validate(self, char):  # this function must return only True or False
        return char.isdigit() or char==''

注意self.entry_str始终是最新的

 类似资料:
  • 问题内容: 我在我的JSF项目中使用Bean验证。现在,我遇到了一种情况,在这种情况下,仅当验证先前的方法时,我才想验证方法。 我举一个例子: 由于我将收到每个参数的激活码,因此我想先对其进行验证。如果无效,将导致违规。如果是这样,我什至无法检查它是否已被激活(因为代码无效)。因此,是否有可能实现如上所述的任何功能(if语句的功能,我确实知道这是行不通的,但是它表明了我要完成的工作)。 提前致谢

  • 问题内容: 如何验证文本字段以仅在Swing中的小数点后输入4位数字? 问题答案: 可以使用进行Swing中的任何验证。 1.首先创建自己的输入验证器: 2.然后将该类的实例分配给您的文本字段。(实际上任何都可以验证) 当然,您也可以使用匿名内部类,但是如果将验证器也用于其他组件,则普通类会更好。 还可以查看SDK文档:JComponent#setInputVerifier。

  • 问题内容: 用PHP验证crontab条目的最佳方法是什么?我应该使用正则表达式还是外部库?我有一个PHP脚本,可以从crontab文件中添加/删除条目,但是想要某种方法来验证时间间隔部分的格式是否正确。 问题答案: 嗯,有趣的问题。 如果您要真正对其进行验证,那么正则表达式还不够,您必须实际解析该条目并验证每个调度位。这是因为每一位可以是数字,一周中的月/日字符串,范围(2-7),集合(3、4,

  • 本文向大家介绍Java如何实现验证码验证功能,包括了Java如何实现验证码验证功能的使用技巧和注意事项,需要的朋友参考一下 Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢? Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线。 首先,

  • 在尝试使用JSR-303(hibernate Validator)验证模型时,我在将

  • 问题内容: 我的应用程序采用这样的字符串:“ 2002-10-15 10:55:01.000000”。我需要验证该字符串对于db2时间戳有效。 我怎样才能做到这一点? 编辑:这主要工作 问题是,如果我以毫秒为单位传递了格式错误的格式(例如“ 2011-05-02 10:10:01.0av”),则会通过验证。我假设由于第一个毫秒字符是有效的,所以它只会截断字符串的其余部分。 问题答案: 我不确定格式