Jake Levi
Jake Levi

Reputation: 399

Tkinter button calling method on an object

I have some objects which are all instances of the same class; each object has (as one of its attributes) a tkinter button, and I want each tkinter button to perform a method on the object to which it belongs. I'm not really sure how to go about doing this. I've tried tinkering with lambda functions, and replacing "self" with "self_" in case tkinter was already passing "self" to the button's command, but none of this worked; I'm new to classes and hadn't come across lambda functions before today so it didn't surprise me. Example code is below - please could someone explain how to make it work in a way which is both simple, concise and pythonic, or if such a solution does not exist then provide a work around? Thanks in advance

import tkinter as tk
from tkinter import ttk

class SpecialButton():

    def __init__(self, row):

        self.button = ttk.Button(root, text="button", command=self.delete)
        self.button.grid(row=row, column=1)

        self.label = ttk.Label(root, text="label")
        self.label.grid(row=row, column=2)

    def delete(self):

        self.button.forget()
        self.label.forget()
        #some other stuff

root = tk.Tk()

for row in range(3):
    SpecialButton(row)

root.mainloop()

Upvotes: 1

Views: 1703

Answers (1)

Bryan Oakley
Bryan Oakley

Reputation: 385870

The only problem with your code is that you need to be calling grid_forget instead of forget.

Also, the code is a bit misleading -- the delete method doesn't actually delete anything, it just removes it from view. The widgets still exist and take up memory. Are you aware of that? If you truly want to delete the widgets, call the destroy method.

Upvotes: 2

Related Questions