Python 我是否将其作为递归函数?

Python 我是否将其作为递归函数?,python,tkinter,Python,Tkinter,我有三个游戏功能,如下所示: def round(): global board board_copy = [[x for x in row] for row in board] for row in range(n): for col in range(n): if countNeighbors(row,col) == 3: board_copy[row][col] = LIVE

我有三个游戏功能,如下所示:

def round():
    global board
    board_copy = [[x for x in row] for row in board]
    for row in range(n):
        for col in range(n):
            if countNeighbors(row,col) == 3:
                board_copy[row][col] = LIVE
                canvas.itemconfigure(rect[row][col],fill='red')
            elif countNeighbors(row,col) > 3 or countNeighbors(row,col) < 2:
                board_copy[row][col] = DEAD
                canvas.itemconfigure(rect[row][col],fill='black')
    board = board_copy

def start():
    round()
    global alarm
    alarm = window.after(500,round)

def stop():
    global alarm
    window.after.cancel(alarm)
def round():
全球董事会
线路板_copy=[[x代表线路板中的x]代表线路板中的x]
对于范围(n)中的行:
对于范围(n)中的列:
如果countneights(行、列)==3:
董事会副本[行][列]=现场
canvas.itemconfigure(rect[row][col],fill='red')
elif CountNeighbories(行,列)>3或CountNeighbories(行,列)<2:
董事会副本[行][列]=无效
canvas.itemconfigure(rect[row][col],fill='black')
董事会
def start():
第(轮)
全球警报
报警=窗后(500,圆形)
def stop():
全球警报
window.after.cancel(报警)
我希望
start()
函数每500毫秒运行一次
round()
,直到用户调用
stop()
(使用按钮)。但是,调用
start()
只会让我在完全停止之前重复两次
round()

您可以尝试以下方法:

game_active = True

def round():
    global board, alarm, game_active

    if not game_active:
      return

    board_copy = [[x for x in row] for row in board]
    for row in range(n):
        for col in range(n):
            if countNeighbors(row,col) == 3:
                board_copy[row][col] = LIVE
                canvas.itemconfigure(rect[row][col],fill='red')
            elif countNeighbors(row,col) > 3 or countNeighbors(row,col) < 2:
                board_copy[row][col] = DEAD
                canvas.itemconfigure(rect[row][col],fill='black')
    board = board_copy

    alarm = window.after(500, round)

def start():
    global game_active
    game_active = True
    round()

def stop():
    global alarm, game_active
    window.after.cancel(alarm)
    game_active = False
game\u active=True
def round():
全局板,警报,游戏激活
如果游戏未激活:
返回
线路板_copy=[[x代表线路板中的x]代表线路板中的x]
对于范围(n)中的行:
对于范围(n)中的列:
如果countneights(行、列)==3:
董事会副本[行][列]=现场
canvas.itemconfigure(rect[row][col],fill='red')
elif CountNeighbories(行,列)>3或CountNeighbories(行,列)<2:
董事会副本[行][列]=无效
canvas.itemconfigure(rect[row][col],fill='black')
董事会
报警=窗后(500,圆形)
def start():
全球游戏联盟活动
game_active=True
第(轮)
def stop():
全球警报,游戏启动
window.after.cancel(报警)
game_active=False
基本上,我们一次又一次地调用round函数本身。

您可以尝试以下方法:

game_active = True

def round():
    global board, alarm, game_active

    if not game_active:
      return

    board_copy = [[x for x in row] for row in board]
    for row in range(n):
        for col in range(n):
            if countNeighbors(row,col) == 3:
                board_copy[row][col] = LIVE
                canvas.itemconfigure(rect[row][col],fill='red')
            elif countNeighbors(row,col) > 3 or countNeighbors(row,col) < 2:
                board_copy[row][col] = DEAD
                canvas.itemconfigure(rect[row][col],fill='black')
    board = board_copy

    alarm = window.after(500, round)

def start():
    global game_active
    game_active = True
    round()

def stop():
    global alarm, game_active
    window.after.cancel(alarm)
    game_active = False
game\u active=True
def round():
全局板,警报,游戏激活
如果游戏未激活:
返回
线路板_copy=[[x代表线路板中的x]代表线路板中的x]
对于范围(n)中的行:
对于范围(n)中的列:
如果countneights(行、列)==3:
董事会副本[行][列]=现场
canvas.itemconfigure(rect[row][col],fill='red')
elif CountNeighbories(行,列)>3或CountNeighbories(行,列)<2:
董事会副本[行][列]=无效
canvas.itemconfigure(rect[row][col],fill='black')
董事会
报警=窗后(500,圆形)
def start():
全球游戏联盟活动
game_active=True
第(轮)
def stop():
全球警报,游戏启动
window.after.cancel(报警)
game_active=False

基本上,我们会一次又一次地调用round函数本身。

尝试从window.after语句而不是round函数调用start函数。尝试从window.after语句而不是round函数调用start函数。谢谢!您是否也知道为什么
stop()
没有结束调用?您好,请检查新版本,我已经编辑了代码。希望它是你所需要的,还没有测试过,我在用我的平板电脑写。没有骰子。不确定以下错误是什么意思:“AttributeError:‘function’对象没有属性‘cancel’,‘删除行’窗口。after.cancel(alarm)”应该可以做到这一点。只需将“game_active”变量设置为False,函数“round”就不会再次调用自身。谢谢!您是否也知道为什么
stop()
没有结束调用?您好,请检查新版本,我已经编辑了代码。希望它是你所需要的,还没有测试过,我在用我的平板电脑写。没有骰子。不确定以下错误是什么意思:“AttributeError:‘function’对象没有属性‘cancel’,‘删除行’窗口。after.cancel(alarm)”应该可以做到这一点。只需将“game_active”变量设置为False,函数“round”就不会再次调用自身。