как завершить программу после закрытия сюжета matplotlib / tkinter - PullRequest
0 голосов
/ 14 декабря 2018

Я написал скрипт python3.x для построения графика из matplotlib, а tkinter используется для диалогового окна, чтобы ввести заголовок, а затем просмотреть файлы данных, которые будут использоваться.после многих испытаний все работает, как я хочу, за исключением того, что после закрытия окна графика программа все еще работает.Я должен закрыть окно терминала или сбросить ядро ​​в Ipython / Jupyter.Есть ли простой способ завершить программу, когда pyplot закрыт?

Обратите внимание, я действительно новичок в программировании, и многое из этого собрано воедино из уроков и других вопросов форума.Я думаю, что одна из возможных проблем - это то, как я работаю бэкендом (matplotlib говорит, что использование () не является предпочтительным способом сделать это), и, возможно, можно найти решение, настроив цикл, чтобы спросить, хочу ли я сделать другойсюжет.Еще одна возможность - поместить график в окно tkinter, но, честно говоря, я сегодня научил себя tkinter как открыть браузер для выбора файлов данных.

import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np
import tkinter
from tkinter import Tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename


plot_title = ""  #placeholder variable
wavelength = ""  #placeholder variable

def get_plot_title():
    global plot_title 
    plot_title = title_entry.get()
    title_entry.delete(0, tkinter.END)
    return plot_title

def get_wavelength():
    global wavelength
    wavelength = wavelength_entry.get()
    wavelength_entry.delete(0, tkinter.END)
    return wavelength

root = Tk()
root.geometry('400x400')

rows = 0
while rows < 10:
    root.rowconfigure(rows, weight=1)
    root.columnconfigure(rows,weight=1)
    rows += 1

title_label = ttk.Label(root, text="Enter TeX style name for plot title.\n (e.g., SrTiO3 would be SrTiO_{3})")
title_label.grid(row=1, column=4)

title_entry = ttk.Entry(root)
title_entry.grid(row=2, column=4)
title_entry.insert(0, 'Enter plot title here')

title_button = ttk.Button(root)
title_button.configure(text='Enter Plot Title', command=get_plot_title)
title_button.grid(row=3, column=4)


title_label = ttk.Label(root, text="Enter diffraction wavelength in Angstroms")
title_label.grid(row=5, column=4)

wavelength_entry = ttk.Entry(root)
wavelength_entry.grid(row=6, column=4)
wavelength_entry.insert(0, 'Enter wavelength here')

wavelength_button = ttk.Button(root)
wavelength_button.configure(text='Enter Wavelength', command=get_wavelength)
wavelength_button.grid(row=7, column=4)

root.mainloop()

##############

Tk().withdraw()

obs_file  = askopenfilename(title = "Select the Observed data file.")
calc_file = askopenfilename(title = "Select the Calcualted data file.")
diff_file = askopenfilename(title = "Select the Difference data file.")
hkl_file  = askopenfilename(title = "Select the hkl data file.")

obs_x, obs_y = np.loadtxt(obs_file, unpack=True)
plt.plot(obs_x, obs_y, 'k.', label='Observed', markersize = 3)

plt.yticks([])

calc_x, calc_y = np.loadtxt(calc_file, unpack=True)
plt.plot(calc_x, calc_y, 'r', label='Calculated')

diff_x, diff_y = np.loadtxt(diff_file, unpack=True)
diff_offset = 100
plt.plot(diff_x, diff_y - diff_offset, color='grey', label='Difference')

rslt_h, rslt_k, rslt_l, rslt_m, rslt_d, rslt_Th2, rslt_lp = np.loadtxt(hkl_file, unpack=True)
rslt_Th2_offset = np.full((len(rslt_Th2), 1), (min(diff_y)-150))

plt.plot(rslt_Th2, rslt_Th2_offset, 'k|', label='hkl')


plt.axis([min(obs_x), max(obs_x), None, None])
plot_title = "$" + str(plot_title) + "$"
plt.text(((max(obs_x)-min(obs_x))/2 ), max(obs_y), plot_title, fontsize=12)
x_axis_label = r'$2\theta (\degree), \lambda = $' + wavelength + ' $\AA $'
plt.xlabel(x_axis_label)
plt.ylabel('Intensity (arb. uints)')
plt.legend()
plt.show()

1 Ответ

0 голосов
/ 14 декабря 2018

Я делаю это с помощью команды Linux, она показывает все открытые процессы Python, а затем я убиваю его, используя его PID

ps aux | grep python
kill 1234
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...