![]() |
Can't get tkinter button to change color based on changes in data - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: GUI (https://python-forum.io/forum-10.html) +--- Thread: Can't get tkinter button to change color based on changes in data (/thread-36372.html) |
Can't get tkinter button to change color based on changes in data - dford - Feb-12-2022 I'm trying to get a "Save" button color to change color if any form data has been changed. I got this to work once before but misplaced my flash drive with it on there. Current attempts are failing. Any pointers? There's an unseen module which talks to the database which I don't think will make a difference here. The code I'm referring to is down towards the bottom. Thanks in advance: from tkinter import * from tkinter import ttk import tkinter as tk import dbConnect as db db.ssConnect() rowspacer=40 colspacer=40 class demoForm(): def fillDemoForm(): root = Tk() fName = tk.StringVar().trace_add('write',demoForm.changeButton) lName = tk.StringVar().trace_add('write',demoForm.changeButton) fName = db.getFlds.getFld(index=0,fldName='Fname',tblName='Name2') lName = db.getFlds.getFld(index=0,fldName='Lname',tblName='Name2') btnSave = ttk.Button(text="Save") btnSave.place(x=colspacer*6, y=rowspacer*1) lblFname= tk.Label(text='fName').place(x=10, y=10) fldFname = Entry(root,textvariable=fName ) fldFname.place(x=60, y= 10) fldFname.delete(0,END) fldFname.insert(0,fName) lblLname= tk.Label(text='lName').place(x=10, y=rowspacer) fldLname= tk.Entry(root, textvariable=lName) fldLname.place(x=60, y= rowspacer) fldLname.delete(0,END) fldLname.insert(0,lName) root.geometry('325x250') root.configure(background = "lightgray") root.mainloop() def changeButton(): btnSave=Button(root, text="Save",bg="red") demoForm.fillDemoForm() RE: Can't get tkinter button to change color based on changes in data - Larz60+ - Feb-13-2022 Here's an example class that uses trace_add: from tkinter import * from tkinter import ttk class TryTraceBack: def __init__(self, parent): self.parent = parent self.parent.geometry("200x130") self.parent.grid_rowconfigure(0, weight=1) self.parent.grid_columnconfigure(0, weight=1) self.var = StringVar() def validate(self, var, index, mode): print(f"Traced variable {self.var.get()}") def CreateWidgets(self): # registering the observer self.var.trace_add('write', self.validate) frame = Frame(self.parent) frame.grid(row=0, column=0, sticky="NESW") frame.grid_rowconfigure(0, weight=1) frame.grid_columnconfigure(0, weight=1) label = Label(frame, textvariable = self.var).grid(row=0, column=0, sticky='EW') entry = Entry(frame, textvariable = self.var).grid(row=1, column=0, sticky='EW') def main(): root = Tk() ttb = TryTraceBack(root) ttb.CreateWidgets() root.mainloop() if __name__ == '__main__': main() RE: Can't get tkinter button to change color based on changes in data - BashBedlam - Feb-13-2022 Here is one way to go about it. import tkinter as tk rowspacer=40 colspacer=40 class demoForm(): def __init__ (self) : self.root = tk.Tk () self.fName = tk.StringVar () self.fName.trace_add ('write', self.changeButton) def fillDemoForm(self): self.btnSave = tk.Button(text="Save") self.btnSave.place(x=colspacer*6, y=rowspacer*1) blFname= tk.Label(text='fName').place(x=10, y=10) fldFname = tk.Entry(self.root,textvariable=self.fName ) fldFname.place(x=60, y= 10) fldFname.delete(0,tk.END) fldFname.insert(0,self.fName) self.root.geometry('325x250') self.root.configure(background = "lightgray") self.btnSave.config (bg = 'lightgray') self.root.mainloop() def changeButton(self, *args): self.btnSave.config (bg="red") test = demoForm () test.fillDemoForm() RE: Can't get tkinter button to change color based on changes in data - menator01 - Feb-13-2022 import tkinter as tk root = tk.Tk() root['padx'] = 8 root['pady'] = 5 my_var = tk.StringVar() my_var2 = tk.StringVar() label = tk.Label(root, text='fName') label.grid(column=0, row=0, sticky='new', pady=2) entry = tk.Entry(root, textvariable=my_var) entry.grid(column=1, row=0, sticky='new', pady=2) entry.insert(0, 'john') label2 = tk.Label(root, text='lName') label2.grid(column=0, row=1, sticky='new', pady=2) entry2 = tk.Entry(root, textvariable=my_var2) entry2.grid(column=1, row=1, sticky='new', pady=2) entry2.insert(0, 'doe') btn = tk.Button(root, text='Save') btn.grid(column=0, row=2, columnspan=2, sticky='ew', pady=2) def callback(var, index, mode): btn.configure(bg='red') my_var.trace_add('write', callback) my_var2.trace_add('write', callback) root.mainloop() RE: Can't get tkinter button to change color based on changes in data - dford - Feb-13-2022 (Feb-13-2022, 04:08 AM)BashBedlam Wrote:test = demoForm () test.fillDemoForm() This worked. Thank you very much. Thank you everyone for your input. Much appreciated. |