2010-08-12 10 views
3

Je voudrais combiner le traçage interactif dans Matplotlib et l'interface de ligne de commande Cmd en python. Comment puis-je faire ceci? Puis-je utiliser le filetage? J'ai essayé ce qui suit:Comment combiner Cmd et Matplotlib en python

from cmd import Cmd 
import matplotlib.pylab as plt 
from threading import Thread 

class MyCmd(Cmd): 

    def __init__(self): 
     Cmd.__init__(self) 
     self.fig = plt.figure() 
     self.ax = self.fig.add_subplot(1,1,1) 

    def do_foo(self, arg): 
     self.ax.plot(range(10)) 
     self.fig.canvas.draw() 

if __name__=='__main__': 
    c = MyCmd() 
    Thread(target=c.cmdloop).start() 
    plt.show() 

Il ouvre une fenêtre graphique et je peux taper des commandes dans la console qui sont réellement exécutées. Lorsque la commande "foo" est exécutée, elle dessine dans la fenêtre graphique. Jusqu'à présent, tout va bien. Quand je rentre dans la console, cependant, la console semble être bloquée et il y a maintenant une nouvelle fenêtre de commande. Mais lorsque je clique dans la fenêtre graphique, la console affiche une nouvelle invite de commande et je peux entrer une nouvelle commande. Il semble que les deux boucles ne sont pas vraiment entrelacées ou quelque chose comme ça. Y a-t-il une meilleure façon, plus commune?

+0

Veuillez éditer votre question. Lors de l'édition, veuillez lire les instructions pour le formatage sur le côté droit de la page. S'il vous plaît modifier votre code pour ressembler à du code. –

+0

Comment ça ne marche pas? Quelle version de Python utilisez-vous? Quelle plateforme? Comment est défini Thread (vous ne semblez pas l'importer)? – robert

+0

J'utilise Python 2.6 sous Linux. – Christian

Répondre

2

J'ai trouvé quelque chose qui fonctionne, mais est plutôt laid

from cmd import Cmd 
import matplotlib.pylab as plt 
from threading import Thread 
import time 

class MyCmd(Cmd): 

    def __init__(self): 
     Cmd.__init__(self) 
     self.fig = plt.figure() 
     self.ax = self.fig.add_subplot(1,1,1) 

    def do_foo(self, arg): 
     self.ax.plot(range(10)) 
     self.fig.canvas.draw() 

if __name__=='__main__': 
    plt.ion() 
    c = MyCmd() 
    def loop(): 
     while True: 
      c.fig.canvas.draw() 
      time.sleep(0.1) 
    Thread(target=loop).start() 
    c.cmdloop() 

Cela appelle simplement la méthode de tirage de la figure périodiquement. Si je ne fais pas cela, la figure n'est pas redessinée, quand elle était occluse et revient à l'avant.

Mais cela semble moche. Y a-t-il un meilleur moyen?

Questions connexes