2017-10-13 4 views
0

J'ai un script python où je veux afficher une nouvelle matrice aléatoire, dans la fenêtre présente comme un flux vidéo, chaque fois qu'un utilisateur entre le caractère « p »Matrice affichage changeant à chaque cycle avec l'entrée d'utilisateur

import pylab as plt 
plt.figure() 

matrix = np.zeros((size[0],size[1])) 
plt.matshow(matrix) 
plt.show() 

while(1): 
cmd = raw_input('...') 

if(raw_input == 'p'): 
    matrix = get_rand_mat() 

plt.matshow(matrix) 
plt.show() 

get_rand_mat est une fonction arbitraire qui renvoie une matrice des dimensions correctes

Mais le gros problème ici est que je dois fermer la fenêtre de la figure chaque fois que je veux obtenir de nouvelles entrées utilisateur et puis afficher la matrice mise à jour.

Comment mettre à jour la matrice affichée par itération d'entrée de l'utilisateur et sans avoir à fermer une fenêtre pour que le programme progresse?

Répondre

0

Étant donné que la fenêtre de traçage matplotlib prend en charge la boucle d'événements, l'entrée de la console n'est pas possible lorsque la fenêtre est ouverte.

Bien qu'il soit possible d'utiliser le mode interactif (plt.ion()), cela peut entraîner d'autres problèmes. Donc, ma suggestion serait de travailler complètement dans une figure existante et de connecter un événement à la touche de p.

import matplotlib.pyplot as plt 
import numpy as np 

size= (25,25) 
get_rand_mat = lambda : np.random.rand(*size) 

fig = plt.figure() 

matrix = np.zeros((size[0],size[1])) 
mat = plt.matshow(matrix, fignum=0, vmin=0, vmax=1) 

def update(event): 
    if event.key == "p": 
     matrix = get_rand_mat() 
     mat.set_data(matrix) 
     fig.canvas.draw_idle() 

fig.canvas.mpl_connect("key_press_event", update) 

plt.show() 

Si vous exécutez ci-dessus et appuyez sur p, une nouvelle matrice aléatoire est montré dans la figure existante.