IndexError in Python Tkinter Poject



我正在尝试用Python Tkinter创建一个内存游戏。我是个新手。我使用嵌套的for循环创建了16个按钮来显示卡片,并将每个按钮添加到列表中。我的问题是用公主图像替换卡片图像(这是迪士尼公主记忆游戏(。它说列表索引超出了范围,尽管它不应该超出范围。有人能帮我修复它吗?我试过用多种方法解决它,但都没有成功。到目前为止,这是我的代码。我还没有完成游戏,所以这就是为什么有些变量没有真正使用的原因。

代码:

from tkinter import *
from random import choice
screen = Tk()
screen.title("Disney Princesses Memory Game")
width = screen.winfo_screenwidth()
height = screen.winfo_screenheight()
screen.geometry("%dx%d" % (width, height))
screen.configure(bg="#e0bce5")
title = Label(screen, text="Memory Game", font=("David", 50, "underline", "bold"), bg="#e0bce5")
title.place(x=400, y=20)
images_list = [
PhotoImage(file="images/aurora.png"),
PhotoImage(file="images/belle.png"),
PhotoImage(file="images/cinderella.png"),
PhotoImage(file="images/jasmine.png"),
PhotoImage(file="images/mulan.png"),
PhotoImage(file="images/rapunzel.png"),
PhotoImage(file="images/snow white.png"),
PhotoImage(file="images/tiana.png")
]
buttons_list = []
num_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

def replace_card(c, d):
chosen_image = choice(images_list)
check = num_list[images_list.index(chosen_image)]
check += 1
buttons_list[c][d].configure(image=chosen_image)
if check > 2:
num_list.remove(num_list[check])

card = PhotoImage(file="images/card.png")
x = 100
y = 250
for i in range(2):
for j in range(8):
a = Button(screen, image=card, command=replace_card(i, j))
x += 100
a.place(x=x, y=y)
buttons_list.append([a])
y += 100
x = 100
screen.mainloop()

以下是错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:UsersMeiromAppDataLocalProgramsPythonPython39libtkinter__init__.py", line 1892, in __call__
return self.func(*args)
File "C:UsersMeiromPycharmProjectsmemorygamemain.py", line 46, in <lambda>
a = Button(screen, image=card, command=lambda: replace_card(i, j))
File "C:UsersMeiromPycharmProjectsmemorygamemain.py", line 35, in replace_card
buttons_list[c][d].configure(image=chosen_image)
IndexError: list index out of range

我期望的输出需要在点击时显示卡片的按钮上显示生成的图像

非常感谢Shoaib Ahmed和其他所有人的帮助!这是一个完整的程序(我需要添加更多的功能,所以它还没有完全完成,但最初的错误已经解决(:

from tkinter import *
from random import choice
screen = Tk()
screen.title("Disney Princesses Memory Game")
width = screen.winfo_screenwidth()
height = screen.winfo_screenheight()
screen.geometry("%dx%d" % (width, height))
screen.configure(bg="#e0bce5")
title = Label(screen, text="Memory Game", font=("David", 50, "underline", "bold"), bg="#e0bce5")
title.place(x=400, y=20)
images_list = [
PhotoImage(file="images/aurora.png"),
PhotoImage(file="images/belle.png"),
PhotoImage(file="images/cinderella.png"),
PhotoImage(file="images/jasmine.png"),
PhotoImage(file="images/mulan.png"),
PhotoImage(file="images/rapunzel.png"),
PhotoImage(file="images/snow white.png"),
PhotoImage(file="images/tiana.png")
]
buttons_list = []
chosen_images = []
flipped = []
num_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
card = PhotoImage(file="images/card.png")

def choose_images():
count = 0
for num in range(16):
chosen_image = choice(images_list)
count += 1
if count > 2:
count = 0
reset()
else:
chosen_images.append(chosen_image)

def replace_card(c, d):
global flipped
buttons_list[c][d].configure(image=chosen_images[d])
flipped.append(buttons_list[c][d])

def reset():
global card
for element in flipped:
element.configure(image=card)

choose_images()
x = 100
y = 250
for i in range(2):
buttons_list.append([])
for j in range(8):
a = Button(screen, image=card, command=lambda i=i, j=j: replace_card(i, j))
x += 100
a.place(x=x, y=y)
buttons_list[i].append(a)
y += 100
x = 100
screen.mainloop()

我没有图像来尝试代码,但这应该可以工作。您需要一个Lambda函数来将参数传递给replace_card函数

来源:https://www.pythontutorial.net/tkinter/tkinter-command/

from tkinter import *
from random import choice
screen = Tk()
screen.title("Disney Princesses Memory Game")
width = screen.winfo_screenwidth()
height = screen.winfo_screenheight()
screen.geometry("%dx%d" % (width, height))
screen.configure(bg="#e0bce5")
title = Label(screen, text="Memory Game", font=("David", 50, "underline", "bold"), bg="#e0bce5")
title.place(x=400, y=20)
images_list = [
PhotoImage(file="images/aurora.png"),
PhotoImage(file="images/belle.png"),
PhotoImage(file="images/cinderella.png"),
PhotoImage(file="images/jasmine.png"),
PhotoImage(file="images/mulan.png"),
PhotoImage(file="images/rapunzel.png"),
PhotoImage(file="images/snow white.png"),
PhotoImage(file="images/tiana.png")
]
buttons_list = []
num_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

def replace_card(c, d):
chosen_image = choice(images_list)
check = num_list[images_list.index(chosen_image)]
check += 1
buttons_list[c][d].configure(image=chosen_image)
if check > 2:
num_list.remove(num_list[check])

card = PhotoImage(file="images/card.png")
x = 100
y = 250
for i in range(2):
buttons_list.append([])
for j in range(8):
a = Button(screen, image=card, command=lambda i=i, j=j: replace_card(i, j))
x += 100
a.place(x=x, y=y)
buttons_list[i].append(a)
y += 100
x = 100
screen.mainloop()

最新更新