首页 > 解决方案 > .after 方法 Python 似乎可以立即调用

问题描述

def __show_square_left(square):
square.pack(anchor = "nw", padx = (100,0), pady = (200,0))
print("square shown")
self.__SimonTask.after(ms_visible, __Clear_Square(square))
return

def __show_square_right(square):
square.pack(anchor = "ne", padx = (0,100), pady = (200,0))
print("square shown")
self.__SimonTask.after(ms_visible, __Clear_Square(square))
return

def __Clear_Square(square):
square.pack_forget()
print("square deleted")
print()
self.__SimonTask.after(ms_between, __show_square)

我的问题是我的代码似乎完全忽略了 __show_square_left 和 __show_square_right 之后的内容,因为它会立即运行 __Clear_Square 任何为 ms_visible 填写的数字。另一方面,__Clear_Square 中的 after 确实有效。

我正在创建一个程序,在其中显示正方形(随机显示红色或蓝色),并且随机向左或向右显示

为了做到这一点,我让它们出现给定数量的 ms(ms_visible,我正在填写 2000),当它消失时,另一个应该在给定数量的 ms(ms_between,我也设置为 2000 到测试一下)

为了显示和隐藏方块,程序通过函数 __show_square 运行,这导致函数 __show_square_left 或 __show_square_right 被运行。这些函数执行相同的操作:

  1. 收拾广场(展示它)
  2. 在 ms_visible 之后,它应该运行命令 __Clear_Square(从窗口中移除正方形)(gewijzigd)

这就是我的问题所在

它在时间过去之前已经运行了__Clear_Square,所以正方形恰好同时显示和删除,导致正方形永远不会显示

标签: pythontkinter

解决方案


立即调用它是因为您实际上在执行时立即调用了它__Clear_Square(square)。立即调用__Clear_Square,然后使用它的返回值作为回调(因为它返回None,这意味着没有执行回调)。

你要:

self.__SimonTask.after(ms_visible, __Clear_Square, square)

它将对函数的引用__Clear_Square作为回调(调用它)传递,并square作为调用它的参数。


推荐阅读