使Matplotlib按钮回调立即生效,而不是在将鼠标移开按钮后生效

时间:2016-08-10 14:32:53

标签: python matplotlib

我正在尝试使用Matplotlib制作Tic Tac Toe游戏的GUI。到目前为止,我已经制作了一系列按钮,点击时将标签更改为“X”:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

def callback(event, button):
    print button
    button.label.set_text("X")

fig, axarr = plt.subplots(3,3, figsize=(6,6))

buttons = [[None for _ in range(3)] for _ in range(3)]
for i in range(3):
    for j in range(3):
        buttons[i][j] = Button(ax=axarr[i][j], label="")
        buttons[i][j].on_clicked(lambda event, i=i, j=j: callback(event, buttons[i][j]))
        axarr[i][j].set_aspect('equal')

fig.tight_layout(h_pad=0, w_pad=0)

plt.show(block=False)

这会产生如下情节:

https://docs.botframework.com/en-us/skype/chat/#navtitle

我已经点击了除一个按钮之外的所有按钮。然而,当我使用这个GUI时,我注意到新标签只有在我将鼠标从按钮上移开后才会显示,而我希望更改立即发生。任何想法如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

您只需要向draw_idle添加一个调用,该调用要求GUI在下次方便时重新绘制窗口(然后重新绘制图形)。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

def callback(event, button):
    print(button)
    button.label.set_text("X")
    if event.inaxes is not None:
        event.inaxes.figure.canvas.draw_idle()

fig, axarr = plt.subplots(3,3, figsize=(6,6))

buttons = [[None for _ in range(3)] for _ in range(3)]
for i in range(3):
    for j in range(3):
        buttons[i][j] = Button(ax=axarr[i][j], label="")
        buttons[i][j].on_clicked(lambda event, i=i, j=j: callback(event, buttons[i][j]))
        axarr[i][j].set_aspect('equal')

fig.tight_layout(h_pad=0, w_pad=0)

plt.show(block=False)