点击另一个按钮后,自动点击另一个

如何解决点击另一个按钮后,自动点击另一个

我一直在尝试创建扫雷器,但我不知道如何制作它,因此,如果玩家单击值为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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res