gpt4 book ai didi

python - 索引超出 tkinter 按钮列表范围

转载 作者:行者123 更新时间:2023-12-01 08:18:08 28 4
gpt4 key购买 nike

我正在尝试将我用 python 编写的代码改编为使用 tkinter 的程序。我为面板中的每个字符(X 和 O)制作了一个列表以及一个按钮列表。每个按钮按下时应根据情况将其文本从“”更新为“X”或“O”。其余代码尚未编写,但这不是问题。

我使用 marcar(i,j,texto) 作为更新按钮文本的函数,并使用按钮列表中的按钮位置作为引用。但在第 25 行,出现“列表索引超出范围”的错误。我在第 31 行中使用了相同的命令。我想这是因为在我创建按钮的第 29 行中,用于创建它们的方法之一是方法 marcar(),并且它尚未在列表中创建任何其他内容,我无法引用它。

我找不到任何解决方案来制作一个按钮,当按下该按钮时,它会使用引用同一按钮的方法,因为要创建它,我需要该函数。

from tkinter import *

lista = [[" ", " ", " "],
[" ", " ", " "],
[" ", " ", " "]]

buttons = [[], [], []]

vitx = 0
vito = 0

root = Tk()

turno = Label(root, text="Turno de X",font=("Arial",15))
turno.grid(row = 1,column = 1)

vitoriasx = Label(root, text="Vitórias de X:"+str(vitx), font=("Arial",8))
vitoriasx.grid(row = 1,column = 0)

vitoriaso = Label(root, text="Vitórias de O:"+str(vito), font=("Arial",8))
vitoriaso.grid(row = 1,column = 2)

def marcar(i,j,texto):
lista[i][j] = texto
buttons[i][j].config(text= texto)

for i in range(0,3):
for j in range(0,3):
buttons[i].append(Button(root,text=lista[i][j],command = marcar(i,j,"x")))
buttons[i][j].grid(row = i+2,column = j)
buttons[i][j].config(height=6, width=13)


root.mainloop()

最佳答案

您需要为这组循环构建适当的 lambda 函数,以便按钮将正确的信息发送到函数,并且不会导致命令在初始化时执行。

在Python中,当你需要保存对函数的引用时,你有两个选择。

对于不接受参数的函数,您可以省略括号 () 以保存对函数的引用,或者如果您需要传递参数,则可以使用 lambda 表达式。

如果您确实使用了 lambda 表达式,并且您在循环中更改了变量,就像您在此处所做的那样,那么您需要定义每个循环的每个参数是什么,否则这些值将全部等于最后一个循环的值。

例如,如果您简单地使用 lambda 而不定义每个循环的变量,那么您最终会得到所有发送相同数据的按钮。

这是一个例子:

import tkinter as tk


root = tk.Tk()

def marcar(i, j, texto):
print(i, j, texto)

for i in range(0, 3):
for j in range(0, 3):
tk.Button(root, text='button {}.{}'.format(i, j), command=lambda: marcar(i, j, "x")).grid(row=i, column=j)

root.mainloop()

结果:

enter image description here

但是,如果您在每个循环的 lambda 中定义值,您将获得每个按钮的正确值。

示例:

import tkinter as tk


root = tk.Tk()

def marcar(i, j, texto):
print(i, j, texto)

for i in range(0, 3):
for j in range(0, 3):
tk.Button(root, text='button {}.{}'.format(i, j), command=lambda i=i, j=j: marcar(i, j, "x")).grid(row=i, column=j)

root.mainloop()

结果:

enter image description here

关于python - 索引超出 tkinter 按钮列表范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54859593/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com