Python Tkinter Entry validate

寵の児 提交于 2019-12-24 19:36:51

问题


I am writing a program in Python 3.6 using Tkinter where a customer has multiple(11) entry fields. I want these entry fields to only accept integers and also be able to define the maximum amount of characters.

I already have a function that does this. But this function only works for one entry field. I have tried entering variables with calling the function so it changes another entry field for example. I was not able to do this.

This is the function I have that works with 1 entry field.

    def limitMuntgeld(self, *args):
        value = self.invoerM.get()
        if len(value) > 5:
            self.invoerM.set(value[:5])
        if value.lower() in "abcdefghijklmnopqrstuvwxyz-=[];/":
            self.invoerM.set(value[:0])

This is the example entry field code that works with the function

self.invoerMuntgeld = Entry(self, font=('Arial', 14), textvariable=self.invoerM)

This is combined with a trace on the entry field posted below.

self.invoerM = StringVar()
self.invoerM.trace('w', self.limitMuntgeld)

I have also tried it with vcmd and validatecommand. However, no good results. My endresult would be one function working with all entry fields. If anyone has any suggestions, I am all ears!


回答1:


The proper way to do entry validation is with the validatecommand option rather than using trace. With the validation feature built into the widget you don't need a reference to the widget itself (though you can use it if you want).

When the validatecommand is run, you can have it pass in what the new value will be if the input is valid. You only need to check this value and then return True or False, without having to know which widget it applies to.

For example:

import tkinter as tk

def validate_input(new_value):
    valid = new_value .isdigit() and len(new_value) <= 5
    return valid

root = tk.Tk()

validate = root.register(validate_input)
for i in range(10):
    entry = tk.Entry(root, validate="key", validatecommand=(validate, "%P"))
    entry.pack(side="top", fill="x")

root.mainloop()

For information about what %P represents, and what else can be used as arguments to the command, see this question: Interactively validating Entry widget content in tkinter



来源:https://stackoverflow.com/questions/49068813/python-tkinter-entry-validate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!