python模拟杨氏双缝干涉实验,GUI界面化

1、设计说明

理论部分参考:杨氏双缝干涉实验

为了实现GUI,需要使用tkinter库。使用Tkinter创建一个GUI窗口,其中包括用于输入值的输入字段、一个计算按钮和两个用于显示干涉条纹强度和图案的子图。

另外设置calculate_intensity函数执行计算并相应地更新图,在每次点击calculate的时候都会运行这个函数,从而实现每一次都创建新的画布和图形。

2、代码

import tkinter as tk
from tkinter import ttk
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

def calculate_intensity():
    d = float(edit1.get())
    D = float(edit2.get())
    wavelength = float(edit3.get())
    frequency = float(edit4.get())
    I0 = 1.0

    delta_x = D * wavelength / d

    # To refresh and redraw the plot window 
    # when new parameters are entered and the "Calculate" button is clicked,
    # just add following codes and delete similar codes in GUI part.
    figure = plt.figure(figsize=(6,4), dpi=100)
    axes1 = figure.add_subplot(121)
    axes2 = figure.add_subplot(122)
    canvas = FigureCanvasTkAgg(figure, master=root)
    canvas.get_tk_widget().grid(column=0,row=1,columnspan=4,rowspan=4,padx=10,pady=10)

    x = np.arange(-4*delta_x, 4*delta_x, delta_x/frequency)
    intensity1 = 4 * I0 * np.cos(np.pi * d * x / (wavelength * D)) * np.cos(np.pi * d * x / (wavelength * D))

    axes1.clear()
    axes1.plot(x, intensity1)
    axes1.set(xlabel='x/m', ylabel='Intensity', title='Interference Fringe Intensity')
    canvas.draw()

    x, y = np.meshgrid(x, x)
    intensity2 = 4 * I0 * np.cos(np.pi * d * x / (wavelength * D)) * np.cos(np.pi * d * x / (wavelength * D))

    axes2.clear()
    axes2.imshow(intensity2, cmap='gray')
    axes2.set(xticks=[], yticks=[], title='Interference Fringe Pattern')
    colorbar = plt.colorbar(axes2.imshow(intensity2, cmap='gray'), ax=axes2)
    colorbar.set_label('Intensity')
    canvas.draw()

root = tk.Tk()
root.title('Interference Fringe Calculator')

mainframe = ttk.Frame(root, padding='3 3 12 12')
mainframe.grid(column=0, row=0, sticky=(tk.N, tk.W, tk.E, tk.S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

edit1 = ttk.Entry(mainframe, width=7)
edit1.grid(column=2, row=1, sticky=(tk.W, tk.E))

edit2 = ttk.Entry(mainframe, width=7)
edit2.grid(column=2, row=2, sticky=(tk.W, tk.E))

edit3 = ttk.Entry(mainframe, width=7)
edit3.grid(column=2, row=3, sticky=(tk.W, tk.E))

edit4 = ttk.Entry(mainframe, width=7)
edit4.grid(column=2, row=4, sticky=(tk.W, tk.E))

ttk.Label(mainframe, text='Distance (d):').grid(column=1, row=1, sticky=tk.W)
ttk.Label(mainframe, text='Screen Distance (D):').grid(column=1, row=2, sticky=tk.W)
ttk.Label(mainframe, text='Wavelength (\u03BB):').grid(column=1, row=3, sticky=tk.W)
ttk.Label(mainframe, text='Frequency:').grid(column=1, row=4, sticky=tk.W)

ttk.Button(mainframe, text='Calculate', command=calculate_intensity).grid(column=3, row=1, sticky=tk.W)

for child in mainframe.winfo_children():
    child.grid_configure(padx=5, pady=5)

root.mainloop()

3、演示效果

运行代码:
在这里插入图片描述
输入参数后点击calculate:

在这里插入图片描述
重新输入参数,点击calculate:

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值