【发布时间】:2019-05-15 10:16:33
【问题描述】:
我已经编写了一个 python3.x 脚本来从 matplotlib 绘制一个绘图,并且 tkinter 用于一个对话框窗口以输入标题,然后浏览要使用的数据文件。经过大量测试后,一切都按我的意愿工作,除了在我关闭绘图窗口后程序仍在运行。我必须关闭终端窗口或重置 Ipython/jupyter 中的内核。当pyplot关闭时,有没有一种简单的方法来终止程序?
注意,我真的是编程新手,其中很多都是从教程和其他论坛问题拼接在一起的。我在想一个可能的问题是我后端的方式(matplotlib 说 use() 不是首选的方法),也许可以通过设置一个循环来询问我是否要制作另一个解决方案阴谋。另一种可能性是将绘图放入 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()
【问题讨论】:
-
试试
Tk().withdraw(),而不是root.withdraw()。 -
...完成文件对话框后,请致电
root.destroy()、see here。 -
我已经尝试按照建议替换
Tk().withdraw(),但是当我这样做时出现错误:“TclError:无法调用“wm”命令:应用程序已被破坏”;无论如何,我认为这不是问题,因为我可以简单地将撤回线移到同一个终点。如果我在askopenfilename行之后添加root.destroy(),我会收到以下错误:“TclError:无法调用“destroy”命令:应用程序已被销毁” -
好吧,这只是一个猜测。我并不是 tkinter 的真正专家,也没有像你那样将它与 matplotlib 一起使用。到目前为止,我所做的是在 tkinter 窗口中嵌入一个 matplotlib 图形,就像在 this question 中所做的那样,并且一直有效。也许,如果没有更好的办法出现,您可以尝试以这种方式调整您的程序...
标签: python-3.x matplotlib tkinter