Python Forum
Problem with buttons
Thread Rating:
  • 1 Vote(s) - 2 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Problem with buttons
#1
Hi there, i have a problem, I hope you can help me, my problem:
I'm gridding some buttons with for, then i add a value and some command to do, but when i do the command, always give me the last value, the code:

from tkinter import *
import tkinter as tk

def write_slogan(v):
    print(v)

root = tk.Tk()
frame = tk.Frame(root)
frame.pack()

for k in range(0,11,1):
    btn = tk.Button(frame, text=str(k), command=lambda: write_slogan(k))
    btn.pack(side=tk.LEFT)

root.mainloop()
What i'm doing wrong?
Reply
#2
You need to bind the buttons to an event and call the command differently.
Here is the code as I have altered it.
from tkinter import *
import tkinter as tk
 
def write_slogan(event):
    v= event.widget['text']
    print(v)
 
root = tk.Tk()
frame = tk.Frame(root)
frame.pack()

for k in range(0,11,1):
    btn = tk.Button(frame, text=str(k))
    btn.bind("<Button-1>", write_slogan)
    btn.pack(side=tk.LEFT)
 
root.mainloop()
Reply
#3
btn is overwritten on each pass through the for, so btn contains the last button after the loop is finished. Use partial to send the button number to the function. See my post at https://python-forum.io/Thread-Tkinter-T...ht=tkinter for an example of how it is done. You can ignore/remove the class (self.) in your program, but you will have to use a list or dictionary to store the button instances if you want to use them in the function to modify the buttons. Modify your code and post back if you have problems.
Reply
#4
write it this way:
from tkinter import *
import tkinter as tk


def write_slogan(v):
    print(v)


root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
btns = []

for k in range(0, 11, 1):
    btns.append(tk.Button(frame, text=str(k), command=lambda: write_slogan(k)))
    btns[k].pack(side=tk.LEFT)

root.mainloop()
Reply
#5
(May-12-2018, 06:05 PM)Larz60+ Wrote: write it this way:
from tkinter import *
import tkinter as tk


def write_slogan(v):
    print(v)


root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
btns = []

for k in range(0, 11, 1):
    btns.append(tk.Button(frame, text=str(k), command=lambda: write_slogan(k)))
    btns[k].pack(side=tk.LEFT)

root.mainloop()
Sorry but it has the same problem as Epilepsy had. He needs to bind the buttons to an event. See post #2
Reply
#6
Barrowman, yes, so a combination of both:
from tkinter import *
import tkinter as tk


def write_slogan(event):
    item = event.widget
    t = item.cget('text')
    print(t)


root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
btns = []

for k in range(0, 11, 1):
    btns.append(tk.Button(frame, text=str(k)))
    btns[k].pack(side=tk.LEFT)
    btns[k].bind("<Button-1>", write_slogan)

root.mainloop()
or cleaner:
import tkinter as tk

root = tk.Tk()

def write_slogan(event):
    btn = event.widget
    print(btn.cget('text'))

for i in range(10):
    b = tk.Button(root, text='{}'.format(i))
    b.grid(row=0, column=i)
    b.bind("<Button-1>", write_slogan)

root.mainloop()
Reply


Forum Jump:

User Panel Messages

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