Tkinter mousePressed事件

时间:2016-06-01 04:10:15

标签: python canvas tkinter

我最近一直试图完成一个我几年前开始的项目,并且在重新审视问题时,最终决定寻求帮助,因为我无法弄清楚到底发生了什么。

该场景是一款名为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()”是解决方案。

0 个答案:

没有答案