要求参数可调和有交互式窗口
时间: 2023-11-09 10:04:19 浏览: 95
好的,针对您的需求,可以使用Python的Tkinter库来创建交互式窗口,并使用matplotlib库来绘制图像。下面是一份样例代码,供您参考:
```python
import numpy as np
import matplotlib.pyplot as plt
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
class MichelsonInterferometerSimulator:
def __init__(self, master):
# 初始化参数
self.lambd = tk.DoubleVar(value=632.8e-9)
self.L = tk.DoubleVar(value=1)
self.n = tk.IntVar(value=1000)
self.x_min = tk.DoubleVar(value=-1)
self.x_max = tk.DoubleVar(value=1)
# 创建交互式窗口
self.master = master
self.master.title('Michelson Interferometer Simulator')
self.master.geometry('800x600')
# 创建参数输入框
tk.Label(self.master, text='Wavelength (m)').grid(row=0, column=0)
tk.Entry(self.master, textvariable=self.lambd).grid(row=0, column=1)
tk.Label(self.master, text='Optical Path Difference (m)').grid(row=1, column=0)
tk.Entry(self.master, textvariable=self.L).grid(row=1, column=1)
tk.Label(self.master, text='Number of Sampling Points').grid(row=2, column=0)
tk.Entry(self.master, textvariable=self.n).grid(row=2, column=1)
tk.Label(self.master, text='X Axis Range').grid(row=3, column=0)
tk.Entry(self.master, textvariable=self.x_min).grid(row=3, column=1)
tk.Entry(self.master, textvariable=self.x_max).grid(row=3, column=2)
# 创建绘图区域
self.fig = plt.figure(figsize=(6, 4), dpi=100)
self.canvas = FigureCanvasTkAgg(self.fig, master=self.master)
self.canvas.get_tk_widget().grid(row=4, column=0, columnspan=3)
# 创建绘图按钮
tk.Button(self.master, text='Draw', command=self.draw).grid(row=5, column=1)
def draw(self):
# 读取参数
lambd = self.lambd.get()
L = self.L.get()
n = self.n.get()
x_min = self.x_min.get()
x_max = self.x_max.get()
# 生成x轴的坐标
x = np.linspace(x_min, x_max, n)
# 计算两束光的干涉图
I = 0.5 * (1 + np.cos(2 * np.pi * x / lambd * L))
# 清空原有图像并绘制新图像
self.fig.clf()
ax = self.fig.add_subplot(111)
ax.plot(x, I)
ax.set_xlabel('x')
ax.set_ylabel('Intensity')
ax.set_title('Michelson Interferometer Simulation')
# 更新绘图区域
self.canvas.draw()
if __name__ == '__main__':
root = tk.Tk()
app = MichelsonInterferometerSimulator(root)
root.mainloop()
```
在这个代码中,我们创建了一个名为MichelsonInterferometerSimulator的类,它继承自tk.Frame类,用于创建交互式窗口。我们定义了几个参数,包括波长、光程差、采样点数和x轴范围等,并将它们绑定到Tkinter的变量上。我们使用Tkinter的Label和Entry来创建参数输入框,使用matplotlib的FigureCanvasTkAgg来创建绘图区域,并使用Tkinter的Button来创建绘图按钮。在draw方法中,我们读取输入的参数,计算干涉图并绘制图像,然后更新绘图区域。最后在main函数中,我们创建了一个Tkinter的窗口并运行程序。
您可以根据需要调整代码中的参数和布局,以满足您的需求。希望这个示例对您有所帮助。
阅读全文