Python Tkinter mousePressed事件的执行顺序

Python Tkinter mousePressed事件的执行顺序,python,canvas,tkinter,Python,Canvas,Tkinter,我最近一直在努力完成一个几年前开始的项目,在重新审视这个问题时,我最终决定寻求帮助,因为我无法确切地了解到底发生了什么 这个场景是一个名为Reversi的游戏,我为计算机创建了一个算法(尽管不是很好的算法)。现在,当玩家A对计算机进行游戏时,我将鼠标点击事件的执行顺序写为: makeMove(canvas, row_clicked, column_clicked) if canvas.data["computer"] and not canvas.data["noMove"]:

我最近一直在努力完成一个几年前开始的项目,在重新审视这个问题时,我最终决定寻求帮助,因为我无法确切地了解到底发生了什么

这个场景是一个名为Reversi的游戏,我为计算机创建了一个算法(尽管不是很好的算法)。现在,当玩家A对计算机进行游戏时,我将鼠标点击事件的执行顺序写为:

makeMove(canvas, row_clicked, column_clicked)
if canvas.data["computer"] and not canvas.data["noMove"]:
            #time.sleep(2)
            computerAI2(canvas)
makeMove移动并更新主板(更新:在tkinter中,我删除整个画布[my board],然后重新创建整个主板)。这对玩家来说效果非常好,但是当我包括计算机时,它似乎一次就完成了所有更新,即使makeMove(据说)在计算机2开始调用之前就完成了。computerAI2也调用makeMove,所以它应该在我的鼠标单击后更新,然后在computerAI2完成其算法后再次更新

但事实并非如此。我希望线程化(注意,我没有“实际”尝试过这个,因为我以前从未线程化过,而且似乎很难实现和集成),增加time.sleep(),在两者之间添加更多的暂停和阶段,以便在电路板到达计算机之前尝试更新电路板2

为了绝对相信排序是个问题,我通过包括

        makeMove(canvas, row_clicked, column_clicked)
        canvas.delete(ALL)

        if canvas.data["computer"] and not canvas.data["noMove"]:
            computerAI2(canvas)
并且没有响应(如果在if之后放置在computerAI2上方,则相同)。它只需一次更新所有内容。与之相比:

        makeMove(canvas, row_clicked, column_clicked)

        if canvas.data["computer"] and not canvas.data["noMove"]:
            computerAI2(canvas)
            canvas.delete(ALL)
然后,在所有问题都解决后,这确实会删除所有内容,而我只剩下一张白板(正如预期的那样)。所以事实上,它并没有抹去这两者之间的一切。。。事实上,在鼠标点击和画布/电路板的最终完成和更新之间,我有一些额外的调试,显示计算机AI2正在运行(打印反馈)。所以,这并不是说它不能运行,并且在两者之间拖延时间,只是出于一些奇怪的原因,在两者之间拒绝重新更新董事会

def mousePressed(event):

    (... set up etc)

    makeMove(canvas, row_clicked, column_clicked)

        if canvas.data["computer"] and not canvas.data["noMove"]:
            computerAI2(canvas)
我的问题是,这里的顺序到底发生了什么?这与这是一个鼠标按下的事件有关吗

这几乎可以肯定,只要上述信息还不够,就需要查看源代码,看看我是如何通过tkinter和调用的函数构建电路板的。然而,这是相当全面的。如果有人能胜任这项任务,我很高兴与大家分享(如果你知道哪些部分可以忽略,并跳到重要部分,这一点很清楚)。我将告诉您正在使用的相关功能

非常感谢您的见解

编辑:简化逻辑功能:

def makeMove(canvas, row, col):
    flipCounters(canvas, row, col)
    redrawAll(canvas)

def redrawAll(canvas): 
    canvas.delete(ALL)
    drawBoard(canvas)

def ComputerAI2(canvas)
    (the source of issue may be originating here, ie it may be nothing to do with order of execution, rather some error in the behaviour. However I have checked extensively here)
    algorithm --> makeMove(canvas, row, col)
编辑2:

100%确定问题与计算机无关。它只能起源于makeMove,或者实际上是一些与mousePressed事件相关的排序问题

makeMove(canvas, row_clicked, column_clicked)
if canvas.data["computer"] and not canvas.data["noMove"]:
        time.sleep(2)
        makeMove(canvas, 1,1)
上述情况仍在拖延。也就是说,它一次更新两个移动,而不是更新一个移动,等待2秒钟,然后更新另一个移动。 然而,95%的人确信makeMove不是问题所在。如果有人在tkinter中创建一个快速鼠标按下事件并测试“print 1,2,3,4,5,time.sleep(5),print ok”(打印1,2,3,4,5,time.sleep(5),print ok),如果这不会延迟,并且一次可以作为1,2,3,4,5 ok工作,那么问题的根源在于鼠标按下(事件)问题。但是如何通过线程来解决这个问题呢

编辑3:仍然没有进展,还没有找到问题。如果有人能帮上忙,我会非常感激,很遗憾没有让这么好的项目运作起来


edit4:由于运气,谷歌成功地搜索到了解决方案,包括使用“更新”,但尚未实现,但来自BryanOakley回答的另一个线程,与在帧之前运行函数有关,“frame.update()”是解决方案。

你真的只是问“我如何让计算机在未来两秒钟内移动?”?@BryanOakley我想让我的动作结束,然后是他的动作,而不是同时两个动作。我在我的代码中看不到问题,它是按执行顺序编写的,但它并不是这样运行的。计算机在未来两秒钟内确实会移动,但它也会随之移动。这是一个美学问题;整个游戏运行得非常好,但看到两个移动增量感觉不太好。你真的只是问“我怎么能让电脑在未来两秒钟内移动”@BryanOakley我希望我的移动结束,然后是他的移动,而不是同时两个移动。我在我的代码中看不到问题,它是按执行顺序编写的,但它并不是这样运行的。计算机在未来两秒钟内确实会移动,但它也会随之移动。这是一个美学问题;整个比赛进行得很好,但看到两次移动增量感觉不太好。