steve wrote: > for determine the maximum number of characters in an entry > > I have read several interpretations for the solution of the problem, but > I wanted to find an alternative way (for convenience of the code) > > I kindly ask for an opinion on the use of validation in this way. > > ----- > > problem: limit number of characters in different entries of a form. > > code: > > #!/usr/bin/python > # -*- coding: utf-8 -* > > from Tkinter import * > > > class View(): > > def __init__(self, parent): > self.parent = parent > self.make_ui() > > def make_ui(self): > ''' create user interface ''' > self.id_entry = Entry(self.parent, width=6) > # take out the properties for understanding > > vcmd = (self.parent.register(self.maxlength_validate), '%P', 4) > # 4 is my question > > self.id_entry.configure(validate="key", validatecommand=vcmd) > self.id_entry.pack() > > self.name_entry = Entry(self.parent, width=30) > # take out the properties for understanding > > vcmd = (self.parent.register(self.maxlength_validate), '%P', 20) > # 20 is my question > > self.name_entry.configure(validate="key", validatecommand=vcmd) > self.name_entry.pack() > > def maxlength_validate(self, value, maxlength): > ''' function validated for maximum number of characters ''' > maxlength = int(maxlength) > if len(value) > maxlength: > value = value[:maxlength] > return (value == ' ') > return True > > > def run(): > root = Tk() > root.title('test') > View(root) > root.mainloop() > > if __name__ == "__main__": > run() > > The code works well :-) but... > > in vcmd i use this: > > vcmd = (self.parent.register(self.maxlength_validate), '%P', 20) > # '20' argument is my question, is not default value (is max length of > char, different for each entry... very comfortable for me) > > is it all right, according to you, to pass a non-default argument? (no > error from the interpreter) > > Without this way I would not know how to pass the maximum number of > characters to the validation function, I can not use one variable > self.--- for each entry ... it would become aesthetically unattractive. > > I would not even like to add a textvariable variable because anyway then > > I should always pass the comparison value. > > thank you in advance
A viable alternative may be to use functools.partial() to pass the maxlength: from Tkinter import * from functools import partial class View(): def __init__(self, parent): self.parent = parent self.make_ui() def make_ui(self): ''' create user interface ''' def vcmd(maxlength): return self.parent.register( partial(self.maxlength_validate, maxlength=maxlength) ), "%P" self.id_entry = Entry(self.parent, width=6) # take out the properties for understanding self.id_entry.configure(validate="key", validatecommand=vcmd(4)) self.id_entry.pack() self.name_entry = Entry(self.parent, width=30) # take out the properties for understanding self.name_entry.configure(validate="key", validatecommand=vcmd(20)) self.name_entry.pack() def maxlength_validate(self, value, maxlength): return len(value) <= maxlength -- https://mail.python.org/mailman/listinfo/python-list