Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- from collections import Counter
- import tkinter as tk
- from tkinter import ttk
- import matplotlib.pyplot as plt
- from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
- # Класс для гена
- class Gene:
- def __init__(self, allele1, allele2):
- self.allele1 = allele1
- self.allele2 = allele2
- def get_random_allele(self):
- return random.choice([self.allele1, self.allele2])
- # Класс для растения гороха
- class PeaPlant:
- def __init__(self, seed_shape_gene, seed_color_gene):
- self.seed_shape_gene = seed_shape_gene
- self.seed_color_gene = seed_color_gene
- def get_phenotype(self):
- shape = 'Гладкие' if 'R' in [self.seed_shape_gene.allele1, self.seed_shape_gene.allele2] else 'Морщинистые'
- color = 'Желтые' if 'Y' in [self.seed_color_gene.allele1, self.seed_color_gene.allele2] else 'Зеленые'
- return f"{shape}, {color}"
- def create_gamete(self):
- shape_allele = self.seed_shape_gene.get_random_allele()
- color_allele = self.seed_color_gene.get_random_allele()
- return shape_allele, color_allele
- # Функция для скрещивания двух растений
- def cross_plants(plant1, plant2):
- gamete1 = plant1.create_gamete()
- gamete2 = plant2.create_gamete()
- new_shape_gene = Gene(gamete1[0], gamete2[0])
- new_color_gene = Gene(gamete1[1], gamete2[1])
- return PeaPlant(new_shape_gene, new_color_gene)
- # Функция для моделирования множества скрещиваний
- def simulate_cross(plant1, plant2, num_offspring):
- phenotypes = []
- for _ in range(num_offspring):
- child = cross_plants(plant1, plant2)
- phenotypes.append(child.get_phenotype())
- return phenotypes
- # Функция для отображения результатов
- def show_results():
- num_offspring = int(entry_offspring.get())
- offspring_phenotypes = simulate_cross(parent1, parent2, num_offspring)
- phenotype_counts = Counter(offspring_phenotypes)
- # Очистка предыдущих результатов
- for row in result_tree.get_children():
- result_tree.delete(row)
- # Добавление новых результатов в таблицу
- for phenotype, count in phenotype_counts.items():
- result_tree.insert("", "end", values=(phenotype, count, f"{count / num_offspring * 100:.2f}%"))
- # Построение графика
- fig, ax = plt.subplots()
- phenotypes = ['Гладкие, Желтые', 'Гладкие, Зеленые', 'Морщинистые, Желтые', 'Морщинистые, Зеленые']
- counts = [phenotype_counts.get(phenotype, 0) for phenotype in phenotypes]
- ax.bar(phenotypes, counts, color=['yellow', 'green', 'orange', 'red'])
- ax.set_xlabel('Фенотипы')
- ax.set_ylabel('Количество растений')
- ax.set_title('Распределение фенотипов в поколении F2')
- # Встраивание графика в интерфейс
- if hasattr(show_results, 'canvas'):
- show_results.canvas.get_tk_widget().destroy()
- show_results.canvas = FigureCanvasTkAgg(fig, master=graph_frame)
- show_results.canvas.draw()
- show_results.canvas.get_tk_widget().pack()
- # Создаем два гетерозиготных растения F1 (RrYy)
- parent1 = PeaPlant(Gene('R', 'r'), Gene('Y', 'y'))
- parent2 = PeaPlant(Gene('R', 'r'), Gene('Y', 'y'))
- # Создание графического интерфейса
- root = tk.Tk()
- root.title("Дигибридное скрещивание гороха")
- # Основной фрейм
- main_frame = ttk.Frame(root, padding="10")
- main_frame.pack(fill=tk.BOTH, expand=True)
- # Поле для ввода количества потомков
- ttk.Label(main_frame, text="Количество потомков:").grid(row=0, column=0, sticky=tk.W)
- entry_offspring = ttk.Entry(main_frame)
- entry_offspring.insert(0, "1600")
- entry_offspring.grid(row=0, column=1, sticky=tk.W)
- # Кнопка для запуска симуляции
- btn_simulate = ttk.Button(main_frame, text="Симулировать", command=show_results)
- btn_simulate.grid(row=0, column=2, sticky=tk.W)
- # Таблица для отображения результатов
- result_tree = ttk.Treeview(main_frame, columns=("Фенотип", "Количество", "Процент"), show="headings")
- result_tree.heading("Фенотип", text="Фенотип")
- result_tree.heading("Количество", text="Количество")
- result_tree.heading("Процент", text="Процент")
- result_tree.grid(row=1, column=0, columnspan=3, sticky=tk.W+tk.E)
- # Фрейм для графика
- graph_frame = ttk.Frame(main_frame)
- graph_frame.grid(row=2, column=0, columnspan=3, sticky=tk.W+tk.E)
- # Запуск основного цикла
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement