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)