Программа python не заканчивается, когда окно tkinter закрыто - PullRequest
1 голос
/ 16 марта 2019

Я работаю над проектом, чтобы сделать осциллограф похожим на GUI. Хотя GUI еще не готов, но у меня возникла проблема, что программа не закрывается, когда я закрываю окно TKinter. Он все еще работает в оболочке Python. Я подумал, что это может быть способ закрыть программы, связанные с Tkinter. Но я нашел программы, в которых просто закрывая окно tkinter, он убивает программу. В моем случае программа работает в оболочке python даже после закрытия окна tkinter. Я размещаю свой код здесь, пожалуйста, посмотрите, в чем проблема?

from tkinter import *
from matplotlib import pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np

root = Tk()
root.geometry("800x500+100+100")
root.title('root window')

frame = Frame(root, borderwidth=1,bg="#0DBDAB") ## This is the frame in which plot will be shown
frame.place(relx=1.0/3,rely=0.5, anchor="center", relwidth=0.60,relheight=0.8)
xar = [0]
yar = [0]
k=0.2  ### This is just a constant to make plot smoother
style.use('ggplot')
fig = plt.figure(figsize=(20,20), dpi=100)
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_ylim(-1, 1)
line, = ax1.plot(xar, yar, 'r')

## It will not plot regularly instead add line for new data
def animate(i):
    ax1.set_xlim(left=max(0,i-20), right=i+1)
    yar.append(np.sin(i*k))
    xar.append(i)
    line.set_data(xar,yar)
    return line,

plotcanvas = FigureCanvasTkAgg(fig, frame)
plotcanvas.get_tk_widget().pack(side=BOTTOM,fill=BOTH,expand=True)
ani = animation.FuncAnimation(fig, animate, interval=1000, blit=False)

root.mainloop()

1 Ответ

0 голосов
/ 17 марта 2019

Я сделал небольшое изменение, в любом случае вы должны использовать это

root.protocol ("WM_DELETE_WINDOW", quit_me)

см. Ниже, на моем debian, запуск скрипта из терминала и закрытие окна tkinter, оно работает.

from tkinter import *
from matplotlib import pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np

def quit_me():
    print('quit')
    root.quit()
    root.destroy()

root = Tk() 
root.protocol("WM_DELETE_WINDOW", quit_me)
root.geometry("800x500+100+100")
root.title('root window')
...