Python 在特定键盘按键上等待Matplotlib图中的用户输入

Python 在特定键盘按键上等待Matplotlib图中的用户输入,python,matplotlib,figure,Python,Matplotlib,Figure,我需要用户输入,然后用特定的键盘键停止循环 from __future__ import print_function import sys import numpy as np import matplotlib.pyplot as plt def press(event): print('press', event.key) sys.stdout.flush() if event.key == 'x': visible = xl.get_visibl

我需要用户输入,然后用特定的键盘键停止循环

from __future__ import print_function
import sys
import numpy as np
import matplotlib.pyplot as plt


def press(event):
    print('press', event.key)
    sys.stdout.flush()
    if event.key == 'x':
       visible = xl.get_visible()
       xl.set_visible(not visible)
       fig.canvas.draw()
    if event.key == 'enter':
       cnt.append(1)

cnt=[]
List=[]
fig, ax = plt.subplots()

fig.canvas.mpl_connect('key_press_event', press)

ax.plot(np.random.rand(12), np.random.rand(12), 'go')
xl = ax.set_xlabel('easy come, easy go')
ax.set_title('Press a key')
plt.show()
plt.waitforbuttonpress() #non specific key press!!!

result=cnt[0]+cnt[1]

我想停止循环,等待用户按enter键,然后在之后使用cnt继续代码。但是,如果我不放置
plt.waitforbuttonpress()
,代码将运行并完成,但是如果我放置
plt.waitforbuttonpress()
任何键盘或鼠标按键都将运行并结束整个代码。

代码对我来说是正常工作的(matplotlib版本2.0.0和TkAgg后端)您可以创建一个图形,该图形应在
plt.show
命令处阻塞

如果没有,请尝试
matplotlib。使用(“TkAgg”)
更改后端(请参见订单)

然后你有几个选择

1) 包括您想要在事件处理循环中运行的代码,可以是在您拥有的事件之后,也可以是在特殊键下

import numpy as np
import matplotlib.pyplot as plt

def press(event):
    print('press', event.key)
    if event.key == 'enter':
        cnt.append(1)
    if event.key == 'a':
        result = sum(cnt)
        print(result, cnt)

cnt=[]
fig, ax = plt.subplots()
fig.canvas.mpl_connect('key_press_event', press)
ax.plot(np.random.rand(12), np.random.rand(12), 'go')
plt.show()
当您按a时,您会假定在按a时已按了8次enter键。 (8、[1,1,1,1,1,1,1,1])

2) 添加一个退出命令以退出图形(您可能需要找出优雅退出的最佳方式)

然后应运行
plt.show()
之后的命令

3) 为事件循环设置一个超时,代码将在此时间之后运行

import numpy as np
import matplotlib.pyplot as plt

def press(event):
    print('press', event.key)
    if event.key == 'enter':
        cnt.append(1)

cnt=[]
fig, ax = plt.subplots()
fig.canvas.mpl_connect('key_press_event', press)
ax.plot(np.random.rand(12), np.random.rand(12), 'go')
plt.show(block=False)
plt.waitforbuttonpress()
plt.pause(5.)
result = sum(cnt)
print(result, cnt)

它看起来像是
plt.waitforbuttonpress(time=5.)
应该执行类似的操作,但我无法使其工作。

您希望停止哪个循环?您是指允许用户输入的事件循环还是上面未显示的外部循环?您的示例为我运行,使用x打开和关闭轴。enter不会发生任何事情,因为它应该是小写的
enter
interval
也没有定义)。我想使用用户输入,并在输入后执行一些代码:result=cnt[0]+cnt[1]代码对我来说工作正常,您可以创建一个图形,该图形应该在
plt.show
命令处阻塞。我不需要
plt.waitforbuttonpress()
,因为
mpl\u connect('key\u press\u event')
已启动事件句柄。这可能是matplotlib或后端的问题。是否使用
plt.show(block=True)
帮助?还添加
plt.ioff()
(关闭交互模式)。由于某些原因,
key\u press\u事件
似乎不允许我执行
ax.imshow
,如果我在处理程序中有可用的
ax
。图中没有任何变化。Hi@cmcdragokai,可能值得一提matplotlib版本的新问题,等等
import numpy as np
import matplotlib.pyplot as plt

def press(event):
    print('press', event.key)
    if event.key == 'enter':
        cnt.append(1)

cnt=[]
fig, ax = plt.subplots()
fig.canvas.mpl_connect('key_press_event', press)
ax.plot(np.random.rand(12), np.random.rand(12), 'go')
plt.show(block=False)
plt.waitforbuttonpress()
plt.pause(5.)
result = sum(cnt)
print(result, cnt)