In sir Bryan Oakley's detailed answer for validating Entry widget in the post Interactively validating Entry widget content in tkinter, the vcmd is defined as:
vcmd = (self.register(self.onValidate),
'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
self.entry = tk.Entry(self, validate="key", validatecommand=vcmd)
with 'self' being (presumably) the class object. So I'm just wondering if it is possible to have different type of validatecommand for different entry widgets, because what I'm doing now:
vcmd = (self.register(self.onValidate), '%P', '%S')
vcmd1 = (self.register(self.onValidate1), '%P', '%S')
vcmd2 = (self.register(self.onValidate2), '%P', '%S')
is just redefining instead creating new validatecommand, and the first onValidate is just ignored. What could I do?
EDIT: What I've tried so far
from tkinter import *
import math
from tkinter import messagebox
class TimeGenerator:
def __init__(self,master):
frame = Frame(master)
frame.grid()
label_iso = Label(root, text="Isotope A, Element")
label_vol = Label(root, text="Voltage")
label_range = Label(root, text="Charge Range")
def _register(self, func, subst=None, needcleanup=1):
f = CallWrapper(func, subst, self).__call__
name = repr(id(f))
try:
func = func.im_func
except AttributeError:
pass
try:
name = name + func.__name__
except AttributeError:
pass
self.tk.createcommand(name,f)
if needcleanup:
if self._tclCommands is None:
self._tclCommands = []
self.tclCommands.append(name)
return name
register = _register
vcmd = (self.register(self.onValidate), '%P', '%S')
vcmd1 = (self.register(self.onValidate1), '%P', '%S')
vcmd2 = (self.register(self.onValidate2), '%P', '%S')
entry_iso = Entry(self,validate="key", validatecommand=vcmd)
entry_vol = Entry(self,validate="key", validatecommand=vcmd1)
entry_range = Entry(self,validate="key",validatecommand=vcmd2)
def onValidate(self, P, S):
validString = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM,1234567890'
if not S in validString:
return False
if str.__contains__(',', P):
if len(P.split(",")) >= 2:
return False
messagebox.showinfo("Error", "Expected Form: ex. 133,Cs")
return True
label_iso.grid(row=0, sticky=E)
label_vol.grid(row=1, sticky=E)
label_range.grid(row=2, sticky=E)
entry_iso.grid(row=0, column=1)
entry_vol.grid(row=1, column=1)
entry_range.grid(row=2,column=1)
button = Button(root, text='Time Range', command=self.calculateTime)
button.grid(row=3, columnspan=2)
self.text = Text(root)
self.iso = entry_iso
self.vol = entry_vol
self.r = entry_range
def calculateTime(self):
x = 5
if self.r.get() == "" or self.iso.get() == "" or self.vol.get() == "":
messagebox.showinfo("Error", "No field can be empty")
self.iso = self.iso.get().replace(" ", "")
list = []
for e in self.iso.split(","):
list.append(e)
f = open("/Users/LazyLinh/PycharmProjects/mass.mas12.txt", "r")
i = 0
while (i < 40):
header = f.readline()
i += 1
self.mass = 0
for line in f:
line = line.strip()
columns = line.split()
if (list[0] == columns[3]):
if (list[1].lower() == columns[4].lower()):
if (len(columns) == 16):
self.mass = float(columns[13].replace("#","")) + float(columns[14].replace("#",""))
else:
self.mass = float(columns[12].replace("#","")) + float(columns[13].replace("#",""))
self.r = self.r.get().replace(" ", "")
tup = tuple(int(x) for x in self.r.split(","))
list = []
for q in range(tup[0], tup[1] + 1):
y = x * math.sqrt(self.mass / (2 * q * float(self.vol.get())))
list.append(y)
i = tup[0]
for time in list:
self.text.insert("end", "%d: %s\n" % (i, time))
i = i + 1
self.text.pack()
root = Tk()
b = TimeGenerator(root)
root.mainloop()