我最近一直试图完成一个我几年前开始的项目,并且在重新审视问题时,最终决定寻求帮助,因为我无法弄清楚到底发生了什么。
该场景是一款名为Reversi的游戏,我为计算机创建了一种算法(尽管不是很好)。现在,当玩家A玩电脑时,我在鼠标点击事件中写下了执行顺序如下:
makeMove(canvas, row_clicked, column_clicked)
if canvas.data["computer"] and not canvas.data["noMove"]:
#time.sleep(2)
computerAI2(canvas)
makeMove进行移动并更新主板(更新:在tkinter中,我删除整个画布[我的板]然后重新创建整个板)。这对玩家来说非常精细,但是当我包含计算机时,它似乎可以一次性完成更新,即使makeMove(计划)在computerAI2开始其调用之前完成。 computerAI2也调用makeMove,所以它应该在我的鼠标点击之后更新,然后在computerAI2完成其算法之后再次更新。
但事实并非如此。我已经看过线程(注意我没有“实际上”试过这个,因为我之前没有线程,似乎很难实现和集成),添加time.sleep(),在中间添加更多的暂停和阶段来尝试并在它到达computerAI2之前更新板。
对于绝对的信念,即排序是问题,我通过包括
来测试 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)
所以我的查询是,这里的订单究竟发生了什么?它是否与mousePressed事件有关?
这几乎可以肯定,只要上述信息不够,就需要查看源代码,看看我是如何通过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)
EDIT2:
100%确定的问题与computerAI2无关。它只能来自makeMove,或者实际上是与mousePressed事件有关的一些排序问题。
makeMove(canvas, row_clicked, column_clicked)
if canvas.data["computer"] and not canvas.data["noMove"]:
time.sleep(2)
makeMove(canvas, 1,1)
上述STILL延迟。即,它立即更新两个动作,不更新一个动作,等待2秒,然后更新另一个动作。 但是,95%肯定makeMove不是问题。如果有人在tkinter中创建一个快速的mousePressed事件并测试“print 1,2,3,4,5,time.sleep(5),print ok”,如果这没有延迟,则作为1,2,3工作,4,5ok一下子,然后解决问题的根源是mousePressed(事件)问题。但是如何通过线程来修复?
edit3:仍然没有进展,没有设法找到问题。如果有人可以提供帮助,我会非常感激,很遗憾不能让这样一个好项目工作。
edit4:管理谷歌解决方案运气不好,涉及使用“更新”还没有实现但是来自BryanOakley回答的另一个线程在框架之前运行一个函数,“frame.update()”是解决方案。