Advertisement
Chl_Snt

mendel

Feb 19th, 2025
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.95 KB | None | 0 0
  1. import random
  2. from collections import Counter
  3. import tkinter as tk
  4. from tkinter import ttk
  5. import matplotlib.pyplot as plt
  6. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
  7.  
  8. # Класс для гена
  9. class Gene:
  10.     def __init__(self, allele1, allele2):
  11.         self.allele1 = allele1
  12.         self.allele2 = allele2
  13.  
  14.     def get_random_allele(self):
  15.         return random.choice([self.allele1, self.allele2])
  16.  
  17. # Класс для растения гороха
  18. class PeaPlant:
  19.     def __init__(self, seed_shape_gene, seed_color_gene):
  20.         self.seed_shape_gene = seed_shape_gene
  21.         self.seed_color_gene = seed_color_gene
  22.  
  23.     def get_phenotype(self):
  24.         shape = 'Гладкие' if 'R' in [self.seed_shape_gene.allele1, self.seed_shape_gene.allele2] else 'Морщинистые'
  25.         color = 'Желтые' if 'Y' in [self.seed_color_gene.allele1, self.seed_color_gene.allele2] else 'Зеленые'
  26.         return f"{shape}, {color}"
  27.  
  28.     def create_gamete(self):
  29.         shape_allele = self.seed_shape_gene.get_random_allele()
  30.         color_allele = self.seed_color_gene.get_random_allele()
  31.         return shape_allele, color_allele
  32.  
  33. # Функция для скрещивания двух растений
  34. def cross_plants(plant1, plant2):
  35.     gamete1 = plant1.create_gamete()
  36.     gamete2 = plant2.create_gamete()
  37.  
  38.     new_shape_gene = Gene(gamete1[0], gamete2[0])
  39.     new_color_gene = Gene(gamete1[1], gamete2[1])
  40.     return PeaPlant(new_shape_gene, new_color_gene)
  41.  
  42.  
  43. # Функция для моделирования множества скрещиваний
  44. def simulate_cross(plant1, plant2, num_offspring):
  45.     phenotypes = []
  46.     for _ in range(num_offspring):
  47.         child = cross_plants(plant1, plant2)
  48.         phenotypes.append(child.get_phenotype())
  49.     return phenotypes
  50.  
  51. # Функция для отображения результатов
  52. def show_results():
  53.     num_offspring = int(entry_offspring.get())
  54.     offspring_phenotypes = simulate_cross(parent1, parent2, num_offspring)
  55.     phenotype_counts = Counter(offspring_phenotypes)
  56.  
  57.     # Очистка предыдущих результатов
  58.     for row in result_tree.get_children():
  59.         result_tree.delete(row)
  60.  
  61.     # Добавление новых результатов в таблицу
  62.     for phenotype, count in phenotype_counts.items():
  63.         result_tree.insert("", "end", values=(phenotype, count, f"{count / num_offspring * 100:.2f}%"))
  64.  
  65.     # Построение графика
  66.     fig, ax = plt.subplots()
  67.     phenotypes = ['Гладкие, Желтые', 'Гладкие, Зеленые', 'Морщинистые, Желтые', 'Морщинистые, Зеленые']
  68.     counts = [phenotype_counts.get(phenotype, 0) for phenotype in phenotypes]
  69.     ax.bar(phenotypes, counts, color=['yellow', 'green', 'orange', 'red'])
  70.     ax.set_xlabel('Фенотипы')
  71.     ax.set_ylabel('Количество растений')
  72.     ax.set_title('Распределение фенотипов в поколении F2')
  73.  
  74.     # Встраивание графика в интерфейс
  75.     if hasattr(show_results, 'canvas'):
  76.         show_results.canvas.get_tk_widget().destroy()
  77.     show_results.canvas = FigureCanvasTkAgg(fig, master=graph_frame)
  78.     show_results.canvas.draw()
  79.     show_results.canvas.get_tk_widget().pack()
  80.  
  81. # Создаем два гетерозиготных растения F1 (RrYy)
  82. parent1 = PeaPlant(Gene('R', 'r'), Gene('Y', 'y'))
  83. parent2 = PeaPlant(Gene('R', 'r'), Gene('Y', 'y'))
  84.  
  85. # Создание графического интерфейса
  86. root = tk.Tk()
  87. root.title("Дигибридное скрещивание гороха")
  88.  
  89. # Основной фрейм
  90. main_frame = ttk.Frame(root, padding="10")
  91. main_frame.pack(fill=tk.BOTH, expand=True)
  92.  
  93. # Поле для ввода количества потомков
  94. ttk.Label(main_frame, text="Количество потомков:").grid(row=0, column=0, sticky=tk.W)
  95. entry_offspring = ttk.Entry(main_frame)
  96. entry_offspring.insert(0, "1600")
  97. entry_offspring.grid(row=0, column=1, sticky=tk.W)
  98.  
  99. # Кнопка для запуска симуляции
  100. btn_simulate = ttk.Button(main_frame, text="Симулировать", command=show_results)
  101. btn_simulate.grid(row=0, column=2, sticky=tk.W)
  102.  
  103. # Таблица для отображения результатов
  104. result_tree = ttk.Treeview(main_frame, columns=("Фенотип", "Количество", "Процент"), show="headings")
  105. result_tree.heading("Фенотип", text="Фенотип")
  106. result_tree.heading("Количество", text="Количество")
  107. result_tree.heading("Процент", text="Процент")
  108. result_tree.grid(row=1, column=0, columnspan=3, sticky=tk.W+tk.E)
  109.  
  110. # Фрейм для графика
  111. graph_frame = ttk.Frame(main_frame)
  112. graph_frame.grid(row=2, column=0, columnspan=3, sticky=tk.W+tk.E)
  113.  
  114. # Запуск основного цикла
  115. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement