TypeError:列表索引必须是整数或切片,而不是按钮索引

2024-10-02 00:31:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一个记忆游戏。这就是我目前所拥有的。我如何解决这个问题?如果有任何提示可以帮助你使用Tkinter制作记忆游戏,那将不胜感激

我的代码:

from tkinter import *
from tkinter import messagebox
import time
import random

difficulty = 16
rowsize= 4
columnsize = 4
numcount = 0
lastnum = 0
gotitcorrect = False

root = Tk()
root.title("MEMORY GAME!!")
root.configure(bg='gray')

def GameStart():
    menuFrame.pack_forget()
    gameFrame.pack()

def Timer(tim):
    time.sleep(tim)

def GetRandomNumber():
    lst1 = [i for i in range(1,9)]
    lst2 = [i for i in range(1,9)]
    random.shuffle(lst1),random.shuffle(lst2)
    numlst = lst1+lst2
    return numlst

def WrongOrRight(card, number):
    if numcount == 0:
        lastnum = number
        numcount+=1
        card.configure(text=str(number))
    elif numcount == 1:
        if number == lastnum:
            gotitcorrect = True
            card.configure(text=str(number))
        else:
            gotitcorrect = False
            card.configure(text='')
        numcount -= 1

menuFrame = Frame(root, bg='gray')
menu = [Label(menuFrame,text='MEMORY GAME', bg = 'gray'), Button(menuFrame,command = GameStart,text = 'Start', bg='gray')]
for i in menu:
    i.pack()
menuFrame.pack()

numlst = GetRandomNumber()
print(numlst)
gameFrame = Frame(root, bg='gray')
cards = [[Button(gameFrame) for j in range(4)] for i in range(4)]
index = 1
card_dict = {}
for x in range(rowsize):
    for y in range(columnsize):
        print(index)
        cards[x][y].grid(row = y, column = x, padx=20,pady=20)
        cards[x][y].configure(text = str(numlst[index-1]))
        cards[x][y].configure(command = lambda: WrongOrRight(cards[x][y],numlst[cards[x][y]]))
        card_dict[cards[x][y]] = numlst[index-1]
        index+=1
Timer(5)
for x in range(rowsize):
    for y in range(columnsize):
        cards[x][y].configure(text = '')


root.grid_rowconfigure(0,weight=1)
root.grid_columnconfigure(0,weight=1)
root.grid_rowconfigure(rowsize,weight=1)
root.grid_columnconfigure(columnsize,weight=1)

root.mainloop()

这是我的错误:

Exception in Tkinter callback
Traceback (most recent call last):   File
"/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)   File "memorygame.py", line 62, in <lambda>
    cards[x][y].configure(command = lambda: WrongOrRight(cards[x][y],numlst[cards[x][y]])) TypeError: list indices
must be integers or slices, not Button

Tags: textinnumberforindexconfigurerangeroot
2条回答

卡片是按钮列表:

cards = [[Button(gameFrame) for j in range(4)] for i in range(4)]

在代码的后面,我们有:

cards[x][y].configure(command = lambda: WrongOrRight(cards[x][y],numlst[cards[x][y]]))

上面的代码在使用按钮作为索引时尝试访问numlst

这是您的代码的一个版本,其中有一些更改。它修复了TypeError并去掉了card_dict。它实际上并不需要,因为分配给每张卡的数字可以通过向表示该卡的Button小部件添加属性来轻松存储。这样做还意味着您只需将卡传递给WrongOrRight()函数

所有重要的变化都用# ALL CAPS COMMENTS表示。我还对代码进行了表面性修改,因此它遵循了PEP 8 - Style Guide for Python Code以使其更具可读性,我强烈建议您以后自己阅读并遵循指南

from tkinter import *
from tkinter import messagebox
import time
import random

difficulty = 16
rowsize= 4
columnsize = 4
numcount = 0
lastnum = 0
gotitcorrect = False

root = Tk()
root.title("MEMORY GAME!!")
root.configure(bg='gray')

def GameStart():
    menuFrame.pack_forget()
    gameFrame.pack()

def Timer(tim):
    time.sleep(tim)

def GetRandomNumber():
    lst1 = [i for i in range(1,9)]
    lst2 = [i for i in range(1,9)]
    random.shuffle(lst1), random.shuffle(lst2)
    numlst = lst1+lst2
    return numlst

def WrongOrRight(card): # REMOVED NO LONGER NEEDED SECOND ARGUMENT.
    global lastnum, numcount, gotitcorrect  # ADDED

    number = card.number  # ADDED
    if numcount == 0:
        lastnum = number
        numcount += 1
        card.configure(text=str(number))
    elif numcount == 1:
        if number == lastnum:
            gotitcorrect = True
            card.configure(text=str(number))
        else:
            gotitcorrect = False
            card.configure(text='')
        numcount -= 1

menuFrame = Frame(root, bg='gray')
menu = [Label(menuFrame, text='MEMORY GAME', bg='gray'),
        Button(menuFrame, command=GameStart, text='Start', bg='gray')]
for i in menu:
    i.pack()
menuFrame.pack()

numlst = GetRandomNumber()
print(numlst)
gameFrame = Frame(root, bg='gray')
cards = [[Button(gameFrame) for j in range(4)] for i in range(4)]
index = 1
#card_dict = {}  # NOT NEEDED
for x in range(rowsize):
    for y in range(columnsize):
        print(index)
        cards[x][y].grid(row=y, column=x, padx=20, pady=20)
        cards[x][y].configure(text=str(numlst[index-1]))
        # ADDED DEFAULT ARGUMENTS TO LAMBDA FUNCTION TO MAKE IT WORK PROPERLY
        cards[x][y].configure(command=lambda x=x, y=y: WrongOrRight(cards[x][y]))
        cards[x][y].number = numlst[index-1]  # ADD ATTRIBUTE TO BUTTON WIDGET
#        card_dict[cards[x][y]] = numlst[index-1]  # NOT NEEDED
        index += 1

#Timer(5)  # DISABLED FOR TESTING
for x in range(rowsize):
    for y in range(columnsize):
        cards[x][y].configure(text='')

root.grid_rowconfigure(0,weight=1)
root.grid_columnconfigure(0,weight=1)
root.grid_rowconfigure(rowsize,weight=1)
root.grid_columnconfigure(columnsize,weight=1)

root.mainloop()

相关问题 更多 >

    热门问题