如何解决点击另一个按钮后,自动点击另一个
我一直在尝试创建扫雷器,但我不知道如何制作它,因此,如果玩家单击值为0的按钮(周围没有炸弹),则该按钮周围的按钮会自动点击。我遇到了递归错误。这是我的代码:
import tkinter as tk
import random
from tkinter import messagebox
from PIL import Image,ImageTk
from types import FunctionType
from copy import copy
app = tk.Tk()
app.geometry("432x468")
app.title("Minesweeper")
# create lists
def createlists():
global buttonlist
global mylist
global numberlist
global panelist
global rightlist
global flaglist
global rowlist
global columnlist
global abomb
global adic
global secondlist
secondlist = []
abomb = []
adic = {}
buttonlist = []
mylist = [0]
numberlist = []
panelist = []
rightlist = []
flaglist = []
rowlist = []
columnlist = []
for a in range(1,18):
mylist.append(18*a)
for i in range(1,325):
button = "b" + str(i)
flag = 'flag' + str(i)
row = 'row' + str(i)
column = 'column' + str(i)
buttonlist.append(button)
numberlist.append(i)
secondlist.append(i)
flaglist.append(flag)
rowlist.append(row)
columnlist.append(column)
# randomly select bombs
def selectbombs():
for i in range(0,40):
x = "panel" + str(bomblist[i])
panelist.append(x)
for i in bomblist:
n = "a" + str(i)
abomb.append(n)
secondlist.remove(i)
# create function for when a bomb is clicked
def mine():
global bomblist
for i in range(0,40):
panelist[i] = tk.Label(app,image = bomb)
for x in mylist:
for i in range(x,x+18):
if i+1 in bomblist:
thing = bomblist.index(i+1)
panelist[thing].grid(row=mylist.index(x)+1,column=i-x+1,columnspan=1)
MsgBox = tk.messagebox.askquestion ('Game Over','You clicked on a bomb! Game Over. Would you like to play again?')
if MsgBox == 'no':
app.destroy()
else:
createlists()
bomblist = random.sample(numberlist,40)
selectbombs()
buttons()
numbers()
flags()
print(bomblist)
# create grid of buttons
def buttons():
for i in range(0,324):
if i+1 in bomblist:
buttonlist[i] = tk.Button(app,text="",width=2,height=1,command=mine)
else:
buttonlist[i] = tk.Button(app,height=1)
for x in mylist:
for i in range(x,x+18):
buttonlist[i].grid(row=mylist.index(x)+1,columnspan=1)
rowlist[i] = mylist.index(x)+1
columnlist[i] = i-x+1
# determine the number of bombs adjacent to each button
def numbers():
for i in range(1,325):
adic.update({"a"+str(i) : 0})
alist = list(adic)
for i in bomblist:
for x in numberlist:
if rowlist[x-1] in range(rowlist[numberlist.index(i)]-1,rowlist[numberlist.index(i)]+2) and columnlist[x-1] in range(columnlist[numberlist.index(i)]-1,columnlist[numberlist.index(i)]+2):
adic[alist[x-1]] = adic[alist[x-1]] + 1
for i in bomblist:
del adic[alist[numberlist.index(i)]]
alist = list(adic)
for i in adic:
buttonlist[secondlist[alist.index(i)]-1].bind("<Button-1>",lambda event,x=secondlist[alist.index(i)]-1,y=adic[i] : num(x,y))
# number functions
def num(x,y):
if y==0:
buttonlist[x].config(bg = '#FFFFFF')
buttonlist[x]["state"] = "disabled"
for i in numberlist:
if i==x+1:
continue
elif rowlist[i-1] in range(rowlist[x]-1,rowlist[x]+2) and columnlist[i-1] in range(columnlist[x]-1,columnlist[x]+2):
num(i-1,adic["a"+str(i)])
elif y==1:
buttonlist[x].config(text = 1,disabledforeground = '#0000FF')
buttonlist[x]["state"] = "disabled"
elif y==2:
buttonlist[x].config(text = 2,disabledforeground = '#008200')
buttonlist[x]["state"] = "disabled"
elif y==3:
buttonlist[x].config(text = 3,disabledforeground = '#FF0000')
buttonlist[x]["state"] = "disabled"
elif y==4:
buttonlist[x].config(text = 4,disabledforeground = '#000084')
buttonlist[x]["state"] = "disabled"
elif y==5:
buttonlist[x].config(text = 5,disabledforeground = '#840000')
buttonlist[x]["state"] = "disabled"
elif y==6:
buttonlist[x].config(text = 6,disabledforeground = '#008284')
buttonlist[x]["state"] = "disabled"
elif y==7:
buttonlist[x].config(text = 7,disabledforeground = '#840084')
buttonlist[x]["state"] = "disabled"
elif y==8:
buttonlist[x].config(text = 8,disabledforeground = '#000000')
buttonlist[x]["state"] = "disabled"
win()
# create function to place a flag
im = Image.open("flag.png")
im = im.resize((20,20),Image.ANTIALIAS)
flag = ImageTk.PhotoImage(im)
def flags():
for i in range(0,324):
buttonlist[i].bind("<Button-3>",x=i : right(event,x))
def right(event,x):
if buttonlist[x]["state"] == "normal":
flaglist[x] = tk.Button(app,text = "",width=18,height=19,image = flag)
flaglist[x].grid(row=rowlist[x],column=columnlist[x],columnspan=1)
flaglist[x].bind("<Button-1>",lambda event: flaglist[x].destroy())
# check if the game has been won
def win():
disnum = 0
for i in secondlist:
if buttonlist[i-1]["state"] == "disabled":
disnum = disnum + 1
if disnum == 284:
MsgBox = tk.messagebox.askquestion ('Game Won','You have won the game! Would you like to play again?')
if MsgBox == 'no':
app.destroy()
else:
createlists()
bomblist = random.sample(numberlist,40)
selectbombs()
buttons()
numbers()
flags()
print(bomblist)
# open images
img = Image.open("bomb.png")
img = img.resize((20,Image.ANTIALIAS)
bomb = ImageTk.PhotoImage(img)
createlists()
bomblist = random.sample(numberlist,40)
selectbombs()
buttons()
numbers()
flags()
print(bomblist)
app.mainloop()
我关注的部分是:
def num(x,y):
if y==0:
buttonlist[x].config(text = 0)
for i in numberlist:
if i==x+1:
continue
elif rowlist[i-1] in range(rowlist[x]-1,adic["a"+str(i)])
elif y==1:
buttonlist[x].config(text = 1)
elif y==2:
buttonlist[x].config(text = 2)
elif y==3:
buttonlist[x].config(text = 3)
elif y==4:
buttonlist[x].config(text = 4)
elif y==5:
buttonlist[x].config(text = 5)
elif y==6:
buttonlist[x].config(text = 6)
elif y==7:
buttonlist[x].config(text = 7)
elif y==8:
buttonlist[x].config(text = 8)
我得到的错误是
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py",line 1705,in __call__
return self.func(*args)
File "<ipython-input-173-2b5d0f411f0f>",line 115,in <lambda>
buttonlist[secondlist[alist.index(i)]-1].bind("<Button-1>",y))
File "<ipython-input-173-2b5d0f411f0f>",line 127,in num
num(i-1,adic["a"+str(i)])
File "<ipython-input-173-2b5d0f411f0f>",adic["a"+str(i)])
[Previous line repeated 2947 more times]
File "<ipython-input-173-2b5d0f411f0f>",line 130,in num
buttonlist[x]["state"] = "disabled"
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py",line 1492,in __setitem__
self.configure({key: value})
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py",line 1485,in configure
return self._configure('configure',cnf,kw)
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py",line 1476,in _configure
self.tk.call(_flatten((self._w,cmd)) + self._options(cnf))
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py",line 1320,in _options
cnf = _cnfmerge(cnf)
File "C:\ProgramData\Anaconda3\lib\tkinter\__init__.py",line 98,in _cnfmerge
if isinstance(cnfs,dict):
RecursionError: maximum recursion depth exceeded while calling a Python object
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。