2012-12-01 88 views
2

我不知道這是一個matplotlib/python的錯誤,但從emacs運行以下內容可以通過單擊數字窗口上的[x]來消除我殺死matplotlib進程的能力,它沒有影響。是否有命令(我Google搜索,沒有運氣)終止emacs啓動的特定進程?我可以通過查找緩衝區並執行C-x k來終止進程,但這有點麻煩,有什麼方法可以終止所有正在運行的python進程?Emacs:殺死運行python腳本

#Simple circular box simulator, part of part_sim 
#Restructure to import into gravity() or coloumb() or wind() or pressure() 
#Or to use all forces: sim_full() 
#Note: Implement crashing as backbone to all forces 
import numpy as np 
import matplotlib.pyplot as plt 
from scipy.spatial.distance import pdist, squareform 

N = 100            #Number of particles 
R = 10000           #Box width 
pR= 5            #Particle radius 

r = np.random.randint(0, R, (N,2))     #Position vector 
v = np.random.randint(-R/100,R/100,(N,2))   #velocity vector 
a = np.array([0,-10])        #Forces 
v_limit = R/2          #Speedlimit 


plt.ion() 
line, = plt.plot([],'o') 
line2, = plt.plot([],'o')       #Track a particle 
plt.axis([0,R+pR,0,R+pR] 


while True: 

    v=v+a           #Advance 
    r=r+v 

    #Collision tests 
    r_hit_x0 = np.where(r[:,0]<0)     #Hit floor? 
    r_hit_x1 = np.where(r[:,0]>R)     #Hit roof? 
    r_hit_LR = np.where(r[:,1]<0)     #Left wall? 
    r_hit_RR = np.where(r[:,1]>R)     #Right wall? 


    #Stop at walls 
    r[r_hit_x0,0] = 0 
    r[r_hit_x1,0] = R 
    r[r_hit_LR,1] = 0 
    r[r_hit_RR,1] = R 

    #Reverse velocities 
    v[r_hit_x0,0] = -0.9*v[r_hit_x0,0] 
    v[r_hit_x1,0] = -v[r_hit_x1,0] 
    v[r_hit_LR,1] = -0.95*v[r_hit_LR,1] 
    v[r_hit_RR,1] = -0.99*v[r_hit_RR,1] 

    #Collisions 
    D = squareform(pdist(r)) 
    ind1, ind2 = np.where(D < pR) 
    unique = (ind1 < ind2) 
    ind1 = ind1[unique] 
    ind2 = ind2[unique] 

    for i1, i2 in zip(ind1, ind2): 
     eps = np.random.rand() 
     vtot= v[i1,:]+v[i2,:] 
     v[i1,:] = -(1-eps)*vtot 
     v[i2,:] = -eps*vtot 

    line.set_ydata(r[:,1]) 
    line.set_xdata(r[:,0]) 
    line2.set_ydata(r[:N/5,1]) 
    line2.set_xdata(r[:N/5,0]) 
    plt.draw() 

回答

2

C-c C-\會殺了SIGQUIT程序,但是這是不是一個優雅的方式 結束程序。

或者,如果將後端更改爲TkAggC-c C-c也會終止該程序(再次不正常),但嘗試關閉該窗口仍然不起作用。

import numpy as np 
    import matplotlib as mpl 
    mpl.use('TkAgg') # do this before importing pyplot 
    import matplotlib.pyplot as plt 

全,可靠的解決方案需要去除plt.ion(),使用如TK,pygtk的,wxPython的或PyQt的一個GUI框架,和嵌入在matplotlib FigureCanvas GUI窗口。


下面是一個使用Tk的一個例子:

""" 
http://stackoverflow.com/q/13660042/190597 
Simple circular box simulator, part of part_sim 
Restructure to import into gravity() or coloumb() or wind() or pressure() 
Or to use all forces: sim_full() 
Note: Implement crashing as backbone to all forces 
""" 

import Tkinter as tk 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.figure as mplfig 
import scipy.spatial.distance as dist 
import matplotlib.backends.backend_tkagg as tkagg 

class App(object): 
    def __init__(self, master): 
     self.master = master 
     self.fig = mplfig.Figure(figsize = (5, 4), dpi = 100) 
     self.ax = self.fig.add_subplot(111) 
     self.canvas = canvas = tkagg.FigureCanvasTkAgg(self.fig, master) 
     canvas.get_tk_widget().pack(side = tk.TOP, fill = tk.BOTH, expand = 1) 
     self.toolbar = toolbar = tkagg.NavigationToolbar2TkAgg(canvas, master) 
     self.button = button = tk.Button(master, text = 'Quit', command = master.quit) 
     button.pack(side = tk.BOTTOM) 
     toolbar.update() 
     self.update = self.animate().next 
     master.after(10, self.update) 
     canvas.show() 

    def animate(self): 
     N = 100            #Number of particles 
     R = 10000           #Box width 
     pR= 5            #Particle radius 

     r = np.random.randint(0, R, (N,2))     #Position vector 
     v = np.random.randint(-R/100,R/100,(N,2))   #velocity vector 
     a = np.array([0,-10])        #Forces 
     v_limit = R/2          #Speedlimit 

     line, = self.ax.plot([],'o') 
     line2, = self.ax.plot([],'o')       #Track a particle 
     self.ax.set_xlim(0, R+pR) 
     self.ax.set_ylim(0, R+pR)   

     while True: 
      v=v+a           #Advance 
      r=r+v 

      #Collision tests 
      r_hit_x0 = np.where(r[:,0]<0)     #Hit floor? 
      r_hit_x1 = np.where(r[:,0]>R)     #Hit roof? 
      r_hit_LR = np.where(r[:,1]<0)     #Left wall? 
      r_hit_RR = np.where(r[:,1]>R)     #Right wall? 

      #Stop at walls 
      r[r_hit_x0,0] = 0 
      r[r_hit_x1,0] = R 
      r[r_hit_LR,1] = 0 
      r[r_hit_RR,1] = R 

      #Reverse velocities 
      v[r_hit_x0,0] = -0.9*v[r_hit_x0,0] 
      v[r_hit_x1,0] = -v[r_hit_x1,0] 
      v[r_hit_LR,1] = -0.95*v[r_hit_LR,1] 
      v[r_hit_RR,1] = -0.99*v[r_hit_RR,1] 

      #Collisions 
      D = dist.squareform(dist.pdist(r)) 
      ind1, ind2 = np.where(D < pR) 
      unique = (ind1 < ind2) 
      ind1 = ind1[unique] 
      ind2 = ind2[unique] 

      for i1, i2 in zip(ind1, ind2): 
       eps = np.random.rand() 
       vtot= v[i1,:]+v[i2,:] 
       v[i1,:] = -(1-eps)*vtot 
       v[i2,:] = -eps*vtot 

      line.set_ydata(r[:,1]) 
      line.set_xdata(r[:,0]) 
      line2.set_ydata(r[:N/5,1]) 
      line2.set_xdata(r[:N/5,0]) 
      self.canvas.draw() 
      self.master.after(1, self.update) 
      yield 

def main(): 
    root = tk.Tk() 
    app = App(root) 
    tk.mainloop() 

if __name__ == '__main__': 
    main() 
+0

給它以這樣一來就給我比我問:)可愛,這教我這麼多,謝謝! – arynaq