Python Forum
Can't get tkinter button to change color based on changes in data
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Can't get tkinter button to change color based on changes in data
#1
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()
pymn likes this post
Reply
#2
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()
Reply
#3
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()
Reply
#4
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()
BashBedlam likes this post
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#5
(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.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  [Tkinter] TKinter Remove Button Frame Nu2Python 9 1,744 Yesterday, 09:21 AM
Last Post: robinsmith
  tkinter - touchscreen, push the button like click the mouse John64 5 1,237 Jan-06-2024, 03:45 PM
Last Post: deanhystad
  Centering and adding a push button to a grid window, TKinter Edward_ 15 6,502 May-25-2023, 07:37 PM
Last Post: deanhystad
  [Tkinter] Trying to add data into a shelf from a submit button TWB 8 2,152 Jan-06-2023, 11:30 PM
Last Post: TWB
  Can't change the colour of Tk button text Pilover 6 15,744 Nov-15-2022, 10:11 PM
Last Post: woooee
  [PyQt] [Solved]Change text color of one line in TextBrowser Extra 2 5,391 Aug-23-2022, 09:11 PM
Last Post: Extra
  [Tkinter] Tkinter don't change the image DQT 2 1,956 Jul-22-2022, 10:26 AM
Last Post: menator01
  [WxPython] [SOLVED] How to change button label? Winfried 3 2,345 May-31-2022, 06:37 PM
Last Post: Winfried
  Tkinter - How can I change the default Notebook border color? TurboC 5 15,332 May-23-2022, 03:44 PM
Last Post: bigmac
Question [Tkinter] Change Treeview column color? water 3 10,349 Mar-04-2022, 11:20 AM
Last Post: Larz60+

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020