I would like to use only one function (self.toggle) for all of my buttons in my GUI instead of doing each for every button. I have tried to change name of self.button only without numbers and then I had text changing on just one button not the one required. Is there simple way to do just one function? I'm just starting with Python. Thanks in advance.
from tkinter import *
from tkinter.ttk import Button
class Application(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
self.create_widgets()
self.number = [1, 2, 3]
self.mainloop()
def toggle1(self, number):
if self.button1.config('text')[-1] == f"{number}: ON":
self.button1.config(text=f"{number}: OFF")
print("OFF")
else:
self.button1.config(text=f"{number}: ON")
print("ON")
def toggle2(self, number):
if self.button2.config('text')[-1] == f"{number}: ON":
self.button2.config(text=f"{number}: OFF")
print("OFF")
else:
self.button2.config(text=f"{number}: ON")
print("ON")
def toggle3(self, number):
if self.button3.config('text')[-1] == f"{number}: ON":
self.button3.config(text=f"{number}: OFF")
print("OFF")
else:
self.button3.config(text=f"{number}: ON")
print("ON")
def create_widgets(self):
self.title("application")
width = 200
height = 250
screen_width = self.winfo_screenwidth()
screen_height = self.winfo_screenheight()
x = (screen_width/2) - (width/2)
y = (screen_height/2) - (height/2)
self.geometry("%dx%d %d %d" % (width, height, x, y))
self.button1 = Button(self, text = "1: OFF", command=lambda: self.toggle1(1))
self.button1.grid(
row=3, column=0, sticky="w", columnspan=1, padx=0, pady=10)
self.button2 = Button(self, text = "2: OFF", command=lambda: self.toggle2(2))
self.button2.grid(
row=5, column=0, sticky="w", columnspan=1, padx=0, pady=10)
self.button3 = Button(self, text = "3: OFF", command=lambda: self.toggle3(3))
self.button3.grid(
row=7, column=0, sticky="w", columnspan=1, padx=0, pady=10)
if __name__ == "__main__":
Application()
CodePudding user response:
You can pass the button widget to toggle()
as below:
...
class Application(Tk):
...
def toggle(self, button):
number, state = button['text'].split(': ')
state = 'ON' if state == 'OFF' else 'OFF'
button['text'] = f'{number}: {state}'
print(number, state)
def create_widgets(self):
...
self.button1 = Button(self, text="1: OFF", command=lambda: self.toggle(self.button1))
...
self.button2 = Button(self, text="2: OFF", command=lambda: self.toggle(self.button2))
...
self.button3 = Button(self, text="3: OFF", command=lambda: self.toggle(self.button3))
...