Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2461|回复: 2

python电路仿真

[复制链接]

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
发表于 2024-4-10 02:08:26 | 显示全部楼层 |阅读模式
  1. from sympy import symbols, Eq, solve

  2. #定义元器件列表
  3. comp_lists = [
  4.     {'name':'R1', 'type' : 'resistor','value_R':20,'Value_C': 0,'Value_L':0},
  5.     {'name':'R2', 'type' : 'resistor','value_R':10,'Value_C': 0,'Value_L':0},
  6.     {'name':'R3', 'type' : 'resistor','value_R':10,'Value_C': 0,'Value_L':0},
  7.     {'name':'V1', 'type' : 'source_voltage','value_V':12}
  8.     ]
  9. #定义结点列表
  10. pin_nodes_dicts = {'R1_1':'Node1','R1_2':'node_R1_2',
  11.                'R2_1':'node_R1_2','R2_2':'GND',
  12.                 'R3_1':'node_R1_2','R3_2':'GND',
  13.                'V1_1':'Node1','V1_2':'GND'
  14.                }
  15. nodes_pin_dicts = {}
  16. for key, value in pin_nodes_dicts.items():
  17.     nodes_pin_dicts[value] = []
  18. for key, value in pin_nodes_dicts.items():
  19.     print('key:'+key+'    value:'+value)
  20.     nodes_pin_dicts[value].append(key)
  21. print(nodes_pin_dicts)

  22. #----生成变量列表-----
  23. paras =   {}
  24. #1.结点的关键字加i,形成电流变量,其值初始化为0
  25. for key in pin_nodes_dicts.keys():   
  26.     paras['i_'+key]=0;
  27.     paras[pin_nodes_dicts[key]]=0;
  28.    
  29. print(paras)


  30. # 定义符号变量
  31. paras_equation = []
  32. for key in paras.keys():   
  33.     paras_equation.append(symbols(key))
  34. # --------------列出方程------------
  35. # 1.扫描所有元器件
  36. equations = [Eq(symbols('GND'), 0 )]#定义接地端口为0
  37. for comp in comp_lists:
  38.     if comp['type'] == 'resistor':
  39.         i1 = symbols('i_'+ comp['name'] +'_1');
  40.         i2 = symbols( 'i_'+ comp['name'] +'_2');
  41.         v1 = symbols( pin_nodes_dicts[comp['name']+'_1'])
  42.         v2 = symbols( pin_nodes_dicts[comp['name']+'_2'])
  43.         r = comp['value_R']
  44.         equations.append(Eq(v1-v2, i1*r ))
  45.         equations.append(Eq(i1,-i2))  #流入为正,流出为负
  46.     elif comp['type'] == 'source_voltage':
  47.         v1 = symbols( pin_nodes_dicts[comp['name']+'_1'])
  48.         v2 = symbols( pin_nodes_dicts[comp['name']+'_2'])
  49.         equations.append(Eq(v1-v2,comp['value_V'] ))
  50. #2.加入结点电流方程
  51. for  key in nodes_pin_dicts.keys():
  52.     flag_first_time = True
  53.     for pin in nodes_pin_dicts[key]:
  54.         if flag_first_time:
  55.             ee = Eq(symbols('i_'+ pin),0)
  56.             flag_first_time = False
  57.         else:
  58.             ee = Eq(ee.lhs+symbols('i_'+ pin),0)
  59.     equations.append(ee)
  60. print(equations)
  61.   
  62. # 使用solve解方程组  
  63. solutions = solve(equations,  paras_equation, dict=True)  
  64.   
  65. print(solutions)

复制代码
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2024-4-10 12:02:49 | 显示全部楼层
from PIL import Image, ImageTk  
import tkinter as tk  
  
class ImageWithClick(tk.Tk):  
    def __init__(self, image_path):  
        super().__init__()  
        self.title("Click on the Image to Draw Lines")  
        self.image_path = image_path  
        self.image = Image.open(self.image_path)  
        self.photo = ImageTk.PhotoImage(self.image)  
        self.canvas = tk.Canvas(self, width=self.photo.width(), height=self.photo.height())  
        self.canvas.pack()  
        self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)  
        self.lines = []  # 用于存储线条的ID  
        self.canvas.bind("<Button-1>", self.on_click)  
  
    def on_click(self, event):  
        x1, y1 = self.prev_click  
        x2, y2 = event.x, event.y  
        line_id = self.canvas.create_line(x1, y1, x2, y2, fill="red", width=2)  
        self.lines.append(line_id)  
        self.prev_click = x2, y2  # 更新上一次的点击位置  
  
    def run(self):  
        self.prev_click = [0,0]  # 初始化上一次的点击位置  
        self.mainloop()  
  
if __name__ == "__main__":  
    app = ImageWithClick("pic.png")  # 替换为你的图片路径  
    app.run()
回复

使用道具 举报

399

主题

1251

帖子

4020

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4020
 楼主| 发表于 2024-4-10 19:52:31 | 显示全部楼层
import tkinter as tk  
  
class TwoListboxDialog(tk.Toplevel):  
    def __init__(self, master=None):  
        super().__init__(master)  
        self.title("左右两个Listbox示例")  
        self.geometry("500x300")  
  
        # 左侧 Listbox  
        self.listbox_left = tk.Listbox(self, width=15, exportselection=False)  
        self.listbox_left.bind('<<ListboxSelect>>', self.on_listbox_left_select)  
        self.listbox_left.pack(side=tk.LEFT, fill=tk.Y, padx=5, pady=5)  
  
        # 右侧 Listbox  
        self.listbox_right = tk.Listbox(self, width=20, height=5, exportselection=False)  
        self.listbox_right.bind('<<ListboxSelect>>', self.on_listbox_right_select)  
        self.listbox_right_scrollbar = tk.Scrollbar(self, command=self.listbox_right.yview)  
        self.listbox_right.config(yscrollcommand=self.listbox_right_scrollbar.set)  
        self.listbox_right.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5)  
        self.listbox_right_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)  
  
        # 初始化内容字典  
        self.content_dict = {  
            "山东": ["青岛", "济南"],  
            "河南": ["郑州", "开封"]  
        }  
  
        # 初始化左侧列表框内容  
        self.update_left_listbox(["山东", "河南"])  
  
        # 初始化右侧列表框内容  
        self.update_right_listbox([])  
  
        # 跟踪左侧选中的项  
        self.selected_left_item = None  
  
    def update_left_listbox(self, items):  
        # 清除左侧 Listbox 的内容  
        self.listbox_left.delete(0, tk.END)  
        # 插入新的内容  
        for item in items:  
            self.listbox_left.insert(tk.END, item)  
  
    def update_right_listbox(self, items):  
        # 清除右侧 Listbox 的内容  
        self.listbox_right.delete(0, tk.END)  
        # 插入新的内容  
        for item in items:  
            self.listbox_right.insert(tk.END, item)  
  
    def on_listbox_left_select(self, event):  
        # 清除右侧 Listbox 的内容  
        self.update_right_listbox([])  
  
        # 获取选中项的索引  
        selected_index = self.listbox_left.curselection()  
        if selected_index:  
            # 获取选中项的文本  
            self.selected_left_item = self.listbox_left.get(selected_index)  
            # 根据选中的左侧项更新右侧列表框内容  
            content = self.content_dict.get(self.selected_left_item, [])  
            self.update_right_listbox(content)  
  
    def on_listbox_right_select(self, event):  
        # 获取选中项的文本  
        selected_item = self.listbox_right.get(self.listbox_right.curselection())  
        print(f"右侧选中的项是: {selected_item}")  
  
# 创建主窗口  
root = tk.Tk()  
root.title("主窗口")  
  
# 创建对话框  
dialog = TwoListboxDialog(root)  
dialog.transient(root)  # 设置对话框为模态  
dialog.grab_set()  # 阻止用户与主窗口交互,直到对话框被关闭  
  
# 显示对话框  
dialog.mainloop()  
  
# 运行主循环  
root.mainloop()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-6-8 06:48 , Processed in 0.034794 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表