for循环中的按钮可更新for循环中的标签?

时间:2020-08-10 02:24:44

标签: python for-loop user-interface button tkinter

尝试获取单个按钮以更新tkinter中的单个标签。

这是我的代码:

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()

运行代码时,一列中有三个按钮,下一列中的三个标签旁边。我想做的就是获取它,以便每个按钮都更改它旁边的标签。

运行代码时会发生什么情况,就是每个按钮都会修改最后一个标签,而其余两个标签都没有被修改。

任何帮助都很棒,谢谢!

1 个答案:

答案 0 :(得分:0)

这将为您工作。我认为您不了解按钮的工作方式。一旦使用.grid()它们就在那里了,但是当您创建一个具有相同名称的按钮时,您将失去对第一个按钮的引用。通过创建关联数组,您可以访问该按钮。您缺少的另一部分是,您必须将一些内容传递给回调函数,以使其知道您要转到哪个播放器。

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()