带有键处理程序的matplotlib图只在鼠标移动时更新

时间:2018-04-21 13:59:01

标签: python macos matplotlib

我有一个交互式matplotlib窗口,当焦点在窗口上时,它由命令行和键盘输入驱动。

问题是焦点在窗口上的关键事件在鼠标移动到屏幕上的任何位置之前都不会被触发。

要运行下面的示例代码:运行脚本,然后在打开的命令行上键入plot。这绘制了一个带有随机彩色圆点的窗口。每次发布绘图时,它都会重新绘制下一种颜色的随机点。在焦点位于matplotlib窗口时按下'c'时的键盘事件也是如此,但在移动鼠标之前它不会被触发。

如果这对您有用,请报告您正在使用的后端(它在启动时绘制)。

所以这是最小的工作示例。除非你使用macports python在mac上,否则你需要删除第一行,以便运行/ usr / bin / python:

#!/opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
#!/usr/bin/python
import time, os, sys
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
import cmd

colors = [ 'red', 'green', 'blue' ]
colorindex = 0

def key_handler(event):
  global colors
  global colorindex
  print('Key pressed:', event.key)
  sys.stdout.flush()
  if event.key == 'x':
    print "Exiting..."
    sys.exit(0)
  elif event.key == 'c':
    print "changing color"
    colorindex += 1
    if colorindex >= len(colors):
      colorindex = 0
    plotfig()


def plotfig():
  global fig
  global ax1
  global colors
  global colorindex
  ax1.clear()
  someX = range(1,1000)
  someY = []
  for i in someX:
    someY.append(random.randrange(0, 1000))
  ax1.plot(someX, someY, '.', color=colors[colorindex], markersize=8, label="Some Values")
  plt.show()

class someShell(cmd.Cmd):
  intro = 'some shell.   Type help or ? to list commands.\n'
  prompt = 'ss> '

  def do_plot(self, arg):
    global colorindex
    colorindex += 1
    if colorindex >= len(colors):
      colorindex = 0
    plotfig()

  def do_exit(self, arg):
    'Exits SomeShell'
    return True

fig = plt.figure(figsize=(12, 7))
fig.canvas.mpl_connect('key_press_event', key_handler)
ax1 = fig.add_subplot(1,1,1)

print "Using plotting backend: %s" % plt.get_backend()
plt.ion()
someShell().cmdloop()

0 个答案:

没有答案