class StringEntry: """String class for entry added colour, change state Parameters ---------- parent : str parent handle lf_text : str text on LabelFrame mess_text : str message def_text : str default text colour : str frame colour mod : str enable or disable state switch Returns ------- string """ def __init__(self, parent, lf_text, mess_text, def_text="", colour='brown', mod=False): self.parent = parent self.lf_text = lf_text self.mess_text = mess_text self.mod = mod self.out_var = StringVar() self.out_var.set(def_text) self.farbe = farbe = { 'blue': 'light blue', 'brown': '#EDEF77', 'green': 'light green', 'pink': '#EAAFBF' } colour = colour if colour in farbe else 'brown' self.colour = colour st1 = Style() st1.theme_use('default') st1.configure(colour + '.TLabelframe', background='#C9B99B') st1.configure(colour + '.TLabelframe.Label', background=farbe[colour]) st1.configure(colour + '.TCheckbutton', background=farbe[colour]) st1.configure('brown.TLabel', background='#EDEF77') self.construct() def construct(self): """construct of LabelFrame and message Parameters ---------- None Returns ------- None """ self.lf1 = Labelframe(self.parent, text=self.lf_text, style=self.colour + '.TLabelframe') self.lf1.grid(column=0, row=0, padx=10, pady=10) self.messlbl = Label(self.lf1, text=self.mess_text, style='brown.TLabel') self.messlbl.grid(row=2, column=0, pady=10, padx=10) self.make_entry() def make_entry(self): """construct of Entry Parameters ---------- None Returns ------- None """ vcmd = self.lf1.register(self.is_okay) self.ent1 = ent1 = Entry(self.lf1, validate='key', validatecommand=(vcmd, '%P', '%S', '%i'), textvariable=self.out_var) ent1.bind("<Return>", self.end_input) ent1.grid(row=1, column=0, padx=10) ent1.focus() if self.mod in (True, False): self.modify() def modify(self): """construct of state switch Parameters ---------- None Returns ------- None """ lf_text = self.lf_text # entry disabled until checkbox is ticked self.cb_opt = Checkbutton(self.lf1, command=self.toggle_opt, style=self.colour + '.TCheckbutton') self.lf1['labelwidget'] = self.cb_opt if self.mod: self.ent1.state(['!disabled']) self.cb_opt.state(['!selected']) self.cb_opt['text'] = lf_text + ' Check to prevent editing ' self.ent1.focus() else: self.ent1.state(['disabled']) self.cb_opt.state(['selected']) self.cb_opt['text'] = lf_text + ' Check to modify ' def toggle_opt(self): """state switch logic Parameters ---------- None Returns ------- None """ lf_text = self.lf_text # state of entry controlled # by the state of the check button in Option frame label widget if self.cb_opt.instate(['selected']): print('selected state') self.ent1.state(['disabled']) self.cb_opt['text'] = lf_text + ' Check to modify ' else: print('unselected state') self.ent1.state(['!disabled']) # enable option self.cb_opt['text'] = lf_text + ' Check to prevent editing ' self.ent1.focus() def end_input(self, _evt): """limit on string Parameters ---------- evt : str bind handle Returns ------- None """ if len(self.out_var.get()) > 5: self.messlbl['text'] = "That's OK" else: self.messlbl['text'] = "Should be at least 6 characters long" def is_okay(self, text, inp, ind): """ validation function Parameters ---------- text : str text if allowed inp : str current input Returns ------- boolean """ ind = int(ind) print(ind) if (inp.isalnum() or inp in (",", ".", "'", " ")) and ind > 0: return True else: return bool((text.isupper() or text == "") and ind == 0)
class StringEntry: """String class for entry 06layout_string converted to a class Parameters ---------- parent : str parent handle lf_text : str text on LabelFrame mess_text : str message outVar : float tkvar handle Returns ------- string """ def __init__(self, parent, lf_text, mess_text): self.parent = parent self.lf_text = lf_text self.mess_text = mess_text self.out_var = StringVar() st1 = Style() st1.theme_use('default') st1.configure('brown.TLabelframe', background='#C9B99B') st1.configure('brown.TLabelframe.Label', background='#EDEF77') st1.configure('brown.TLabel', background='#EDEF77') self.construct() def construct(self): """construct of LabelFrame and message Parameters ---------- None Returns ------- None """ self.lf0 = Labelframe(self.parent, text=self.lf_text, style='brown.TLabelframe') self.lf0.grid(column=0, row=0, padx=10, pady=10) self.mee_lbl = Label(self.lf0, text=self.mess_text, style='brown.TLabel') self.mee_lbl.grid(row=2, column=0, pady=10, padx=10) self.make_entry() def make_entry(self): """construct of Entry Parameters ---------- None Returns ------- None """ vcmd = self.lf0.register(self.is_okay) ent0 = Entry(self.lf0, validatecommand=(vcmd, '%P', '%S', '%i'), validate='key', textvariable=self.out_var) ent0.bind("<Return>", self.end_input) ent0.grid(row=1, column=0, padx=10) ent0.focus() def end_input(self, _evt): """limit on string Parameters ---------- evt : str bind handle Returns ------- None """ if len(self.out_var.get()) > 5: self.mee_lbl['text'] = "That's OK" else: self.mee_lbl['text'] = "Should be at least 6 characters long" def is_okay(self, text, input, index): """ validation function Parameters ---------- text : str text if allowed input : str current input Returns ------- boolean """ #print(text) index = int(index) print(index) if (input.isalnum() or input in (",", ".", "'", " ")) and index > 0: return True else: return bool((text.isupper() or text == "") and index == 0)
def entry_float(parent, lf_text, l_limit, u_limit, mess_text, out_var): """Float layout for entry Parameters ---------- parent : str parent handle lf_text : str text on LabelFrame l_limit : float lower limit u_limit : float upper limit mess_text : str message out_var : float tkvar handle Returns ------- float """ st1 = Style() st1.theme_use('default') st1.configure('brown.TLabelframe', background='#C9B99B') st1.configure('brown.TLabelframe.Label', background='#EDEF77') st1.configure('brown.TLabel', background='#EDEF77') st1.configure('lowr.TLabel', background='lightblue') st1.configure('upr.TLabel', background='red') lf0 = Labelframe(parent, text=lf_text, style='brown.TLabelframe') lf0.grid(row=0, column=0, padx=10, pady=10) ulab = Label(lf0, text=str(u_limit) + " upper limit", style='brown.TLabel') ulab.grid(row=0, column=1, padx=10) llab = Label(lf0, text=str(l_limit) + " lower limit", style='brown.TLabel') llab.grid(row=2, column=1, padx=10) def end_input(_evt): """limit on float Parameters ---------- evt : str bind handle Returns ------- None """ ulab['style'] = 'brown.TLabel' llab['style'] = 'brown.TLabel' if l_limit < entsv.get() < u_limit: messlbl['text'] = "That's OK" out_var.set(entsv.get()) elif l_limit >= entsv.get(): messlbl['text'] = "Input below lower limit" llab['style'] = 'lowr.TLabel' else: messlbl['text'] = "Input above upper limit" ulab['style'] = 'upr.TLabel' def is_okay(text): """ validation function Parameters ---------- text : str text if allowed Returns ------- boolean """ if text in ("", "-", ".", "-."): return True try: float(text) except ValueError: return False return True vcmd = lf0.register(is_okay) entsv = DoubleVar() ent0 = Entry(lf0, validate='key', validatecommand=(vcmd, '%P'), textvariable=entsv) ent0.bind("<Return>", end_input) ent0.grid(row=1, column=0, padx=10) ent0.focus() messlbl = Label(lf0, text=mess_text, style='brown.TLabel') messlbl.grid(row=2, column=0, pady=10, padx=10)
def entry_string(parent, lf_text, mess_text, out_var): """String layout for entry 06layout_string converted to a function Parameters ---------- parent : str parent handle lf_text : str text on LabelFrame mess_text : str message out_var : float tkvar handle Returns ------- string """ st1 = Style() st1.theme_use('default') st1.configure('brown.TLabelframe', background='#C9B99B') st1.configure('brown.TLabelframe.Label', background='#EDEF77') st1.configure('brown.TLabel', background='#EDEF77') lf0 = Labelframe(parent, text=lf_text, style='brown.TLabelframe') lf0.grid(column=0, row=0, padx=10, pady=10) def end_input(_evt): """limit on string Parameters ---------- evt : str bind handle Returns ------- None """ if len(entsv.get()) > 5: mee_lbl['text'] = "That's OK" out_var.set(entsv.get()) else: mee_lbl['text'] = "Should be at least 6 characters long" def is_okay(text, input, index): """ validation function Parameters ---------- text : str text if allowed input : str current inputut index : str indexex Returns ------- boolean """ index = int(index) print(index) if (input.isalnum() or input in (",", ".", "'", " ")) and index > 0: return True else: return bool((text.isupper() or text == "") and index == 0) vcmd = lf0.register(is_okay) entsv = StringVar() ent0 = Entry(lf0, validate='key', textvariable=entsv, validatecommand=(vcmd, '%P', '%S', '%i')) ent0.bind("<Return>", end_input) ent0.grid(row=1, column=0, padx=10) ent0.focus() mee_lbl = Label(lf0, text=mess_text, style='brown.TLabel') mee_lbl.grid(row=2, column=0, pady=10, padx=10)