0

Trying to get individual buttons to update individual labels in tkinter.

Here's my code:

from tkinter import *

root = Tk()

class bballPlayer:
    def __init__(self, preName, lastName):
        self.preName = preName
        self.lastName = lastName
        self.points = 0
    
    def incrementOnePoint(self):
        self.points += 1
    
    def getPoints(self):
        return self.points

players = []
player = bballPlayer('Tyler','Herro')
players.append(player)
player = bballPlayer('Duncan','Robinson')
players.append(player)
player = bballPlayer('Jimmy','Buckets')
players.append(player)
    
def addOnePoint():
    p.incrementOnePoint()
    global pointslabel
    pointslabel.config(text=str(p.points))

rowNumber = 0
for p in players:
    pointslabel = Label(root, text=str(p.points))
    pointslabel.grid(row=rowNumber, column=1)
    rowNumber += 1

rowNumber = 0
for p in players:
    btn = Button(root, text='Add Point', command=addOnePoint)
    btn.grid(row=rowNumber, column=0)
    rowNumber += 1

root.mainloop()

When you run the code there are three buttons in a column next to three labels in the next column over. What I'm trying to do is get it so that each button changes the label next to it.

What happens when I run the code is every button modifies the last label and the other two labels are untouched.

Any help is awesome, thanks!

  • There are _lots_ of questions on this site related to creating buttons or other widgets in a loop. Can you update your question to show what research you've done? – Bryan Oakley Aug 10 '20 at 02:27
  • Does this answer your question? [tkinter creating buttons in for loop passing command arguments](https://stackoverflow.com/questions/10865116/tkinter-creating-buttons-in-for-loop-passing-command-arguments) – acw1668 Aug 10 '20 at 03:25

1 Answers1

0

This will work for you. I don't think you understand how the buttons work. Once you .grid() them they are there but when you create a button with the same name you lose reference to the first button. By creating an associative array you have access to the button. The other part you are missing is that you have to pass something to your call back function to let it know which player you are reffering to.

from tkinter import *
from functools import partial

root = Tk()


class bballPlayer:
    def __init__(self, preName, lastName):
        self.preName = preName
        self.lastName = lastName
        self.points = 0

    def incrementOnePoint(self):
        self.points += 1

    def getPoints(self):
        return self.points


players = []
player = bballPlayer('Tyler', 'Herro')
players.append(player)
player = bballPlayer('Duncan', 'Robinson')
players.append(player)
player = bballPlayer('Jimmy', 'Buckets')
players.append(player)


def addOnePoint(num):
    global points_labels
    players[num].incrementOnePoint()
    points_labels[num].config(text=str(players[num].points))


points_buttons = []
points_labels = []
for x in range(len(players)):
    points_buttons.append(Button(root, text='Add Point', command=partial(addOnePoint, x)))
    points_buttons[x].grid(row=x, column=0)
    points_labels.append(Label(root, text=str(players[x].points)))
    points_labels[x].grid(row=x, column=1)


root.mainloop()
ShayneLoyd
  • 633
  • 1
  • 4
  • 9
  • man I cannot thank you enough. You have just solved something I've been working on for more than I week now. Thank you so much man!! – vintagesteam Aug 11 '20 at 21:26