Nov-18-2021, 03:02 PM
I have developed a GUI using tkinter with python 3.9. It works but I am facing the following problem. When I activate/deactivate one of the defined checkbox, in addition to activate/deactivate the related second entry, I want also activate/deactivate the last single entry ((unit_3 in the attached picture)
# main that calls the modules as md
# main that calls the modules as md
for index, (key, values) in enumerate(dictionary.items()):
obj = md.CreateEntry(input_data_frame, values, index)
if md.arenumbers(values[-2], values[-1]):
pass
obj.double_entry()
elif md.arenumbers(values[-1]):
print(values)
obj.single_entry()
else:
print(values)
obj.labels_entry()and here the class I am usingclass CreateEntry(tk.Frame):
def __init__(self, parent, values, row, bg=None, **kwargs):
if bg is None:
bg = parent['bg']
super().__init__(parent, bg=bg, **kwargs)
self.parent = parent
self.values = values
self.row = row
self.nac = tk.IntVar(self.parent)
self.sim_steps = None
self.entry_step_state = None
@property
def sim_steps(self):
"""I'm the 'var_second_entry' property."""
return self._sim_steps
@sim_steps.setter
def sim_steps(self, value):
self._sim_steps = tk.StringVar(self.parent, value=value)
@sim_steps.deleter
def sim_steps(self):
del self._sim_steps
@property
def entry_step_state(self):
"""I'm the 'var_second_entry' property."""
return self._entry_step_state
@entry_step_state.setter
def entry_step_state(self, value='disabled'):
self._entry_step_state = value
def double_entry(self):
self.variable1 = tk.StringVar(self.parent, value=self.values[-2])
self.variable2 = tk.StringVar(self.parent, value=self.values[-1])
tk.Checkbutton(self.parent, variable=self.nac, command=lambda: self.naccheck()).\
grid(row=self.row, column=0, sticky='ns')
label = self.values[0] + ' (' + self.values[1] + ') '
tk.Label(self.parent, text=label, padx=10, pady=5).\
grid(row=self.row, column=1, sticky='nw')
self.entry_c1 = tk.Entry(self.parent, textvariable=self.variable1, width=10, state=CreateEntry.entry_step_state)
self.entry_c1.grid(row=self.row, column=2)
self.entry_c2 = tk.Entry(self.parent, textvariable=self.variable2, width=10, state='disabled')
self.entry_c2.grid(row=self.row, column=3)
self.entry_c1.bind("<KeyRelease>", self._accept)
self.entry_c2.bind("<KeyRelease>", self._accept)
def single_entry(self):
CreateEntry.sim_steps = self.values[-1]
entry = tk.Entry(self.parent, textvariable=CreateEntry.sim_steps, width=10, state='normal')
entry.grid(row=self.row + 1, column=2, columnspan=2)
entry.bind("<KeyRelease>", self._accept)
tk.Label(self.parent, text='SIMULATION PARAMETERS', padx=10, pady=5).\
grid(row=self.row, columnspan=4, sticky='ns')
tk.Label(self.parent, text=self.values[0], padx=10, pady=5).\
grid(row=self.row + 1, column=0, columnspan=2, sticky='ns')
def labels_entry(self):
tk.Label(self.parent, text=self.values[0], padx=10, pady=5).grid(row=self.row, column=1, sticky='ns')
tk.Label(self.parent, text=self.values[1], padx=10, pady=5).grid(row=self.row, column=2, sticky='ns')
tk.Label(self.parent, text=self.values[2], padx=10, pady=5).grid(row=self.row, column=3, sticky='ns')
def naccheck(self):
if self.nac.get() == 0:
self.variable2.set(self.variable1.get())
self.entry_c2.configure(state='disabled')
del CreateEntry.sim_steps
CreateEntry.sim_steps = '0'
CreateEntry.entry_step_state = 'disabled'
else:
self.entry_c2.configure(state='normal')
CreateEntry.entry_step_state = 'normal'
def _accept(self, event):
"""Accept value change when a key is released"""
try:
if self.entry_c1.get():
float(self.entry_c1.get()) or int(self.entry_c1.get())
else:
self.variable1.set('0')
except ValueError:
self.bell()
showerror(title='Title', message='Initial value not numeric!')
try:
if self.entry_c2.get():
float(self.entry_c2.get()) or int(self.entry_c2.get())
if self.nac.get() == 0:
self.values[-1] = self.entry_c1.get()
else:
self.values[-1] = self.entry_c2.get()
if self.entry_c2.get() <= self.entry_c1.get():
showerror(title='Title', message='Final value not greater than initial value!')
else:
self.variable2.set('0')
except ValueError:
showerror(title='Title', message='Final value not numeric!')But the last entry is always deactivated
