def perform_move(self): # ruch owiec self.sheep_list_object.sheep_move() # obliczenie indeksu najblizszej owcy i wartosci tej odleglosci index_of_sheep_with_nearest_distance, nearest_distance \ = self.sheep_list_object.find_nearest_distance(self.wolf) # ruch wilkiem (zmiana wspolrzednych na liscie) self.wolf.wolf_move(index_of_sheep_with_nearest_distance, nearest_distance, self.sheep_list_gui, self.points_list_gui, self.wolf, self.meadow) # ruch wilkiem na lace (narysowanie kropki w innym miejscu) self.meadow.delete(self.drawn_wolf) # rysowanie owiec po ruchu self.sheep_list_object.sheep_draw_all(self.meadow, self.scale_variable) # rysowanie wilka po ruchu owiec self.drawn_wolf = draw_wolf(self.meadow, self.wolf.x, self.wolf.y, self.wolf.wolf_color, self.scale_variable) # aktualizacja do etykiety wyswietlajacej zywe owce self.variable_sheep_number.set( str(self.sheep_list_object.count_alive_sheeps()))
def zooming(self, event): # metoda do zoomowania (wzgledem srodka) # przyblizanie if float(event) > float(self.default_value): print(self.meadow.winfo_id()) while float(event) > float(self.default_value): # self.meadow.scale("all", self.meadow.winfo_width() / 2, self.meadow.winfo_height() / 2, # 1.25, 1.25) for point in self.points_list_gui: self.meadow.delete(point) # pętla, w której ponownie rysujemy owce for sheep in self.sheep_list_gui: if sheep.status == 'alive': point = draw_sheep(self.meadow, sheep.x, sheep.y, sheep.sheep_color, self.scale_variable) self.sheep_list_object.point_add(point) self.meadow.delete(self.drawn_wolf) self.drawn_wolf = draw_wolf(self.meadow, self.wolf.x, self.wolf.y, self.wolf.wolf_color, self.scale_variable) self.default_value = self.default_value + 1.0 # oddalanie elif float(event) < float(self.default_value): while float(event) < float(self.default_value): # self.meadow.scale("all", self.meadow.winfo_width() / 2, self.meadow.winfo_height() / 2, # 0.8, 0.8) for point in self.points_list_gui: self.meadow.delete(point) # pętla, w której ponownie rysujemy owce for sheep in self.sheep_list_gui: if sheep.status == 'alive': point = draw_sheep(self.meadow, sheep.x, sheep.y, sheep.sheep_color, self.scale_variable) self.sheep_list_object.point_add(point) self.meadow.delete(self.drawn_wolf) self.drawn_wolf = draw_wolf(self.meadow, self.wolf.x, self.wolf.y, self.wolf.wolf_color, self.scale_variable) self.default_value = self.default_value - 1.0 self.default_value = float(event)
def move_wolf(self, event): x1, y1 = event.x, event.y # usuwany jest istniejacy wilk self.meadow.delete(self.drawn_wolf) # i rysowany nowy na podstawie wspolrzednych pobranych z klikniecia uzytkownika self.drawn_wolf = draw_wolf(self.meadow, x1, y1, self.wolf.wolf_color, self.scale_variable) # zmiana wartosci wspolrzednych wilka w logice aplikacji self.wolf.x = x1 self.wolf.y = y1
def import_from_json(f, meadow, scale, sheep_list_sheeps, points_list): meadow.delete("all") sheep_list_sheeps.clear() points_list.clear() scale.set(0) # zapis danych z pliku do zmiennej with open(f) as json_file: data = json.load(json_file) # zapis poszczegolnych fragmentow do zmiennych bg_color = data['bg_color'] wolf_color = data['wolf_color'] wolf_pos = data['wolf_pos'] sheep_color = data['sheep_color'] sheep_pos = data['sheep_pos'] # podzial zmiennej wolf_pos na liste z wspolrzednymi wilka wolf_after = wolf_pos.split(',') wolf_x = wolf_after[0] wolf_y = wolf_after[1] # przypisanie wszystkich atrybutow do wilka wolf = Wolf() wolf.x = float(wolf_x) wolf.y = float(wolf_y) wolf.wolf_color = wolf_color drawn_wolf = draw_wolf(meadow, wolf.x, wolf.y, wolf.wolf_color, scale) # ilosc owiec zapisanych w pliku length = len(sheep_pos) # stworzenie listy owiec, do ktorej zapisze sie dane z pliku sheep_list_sheeps = SheepList() for i in range(0, length): # dzielimy kazdy element listy na mniejsza tablice, ktorej pierwszy element to x, a drugi to y pom = sheep_pos[i].split(',') # konwertujemy elementy tablicy na float x = float(pom[0]) y = float(pom[1]) # dodajemy owce o wspolrzednych z pliku do stworzonej listy sheep_list_sheeps.sheep_add(Sheep(i, x, y)) # rysujemy te owce na lace point = draw_sheep(meadow, x, y, sheep_color, scale) # dodajemy narysowane punkty do listy sheep_list_sheeps.point_add(point) # każdej owcy z listy ustawiamy kolor wczytany z pliku for sheep in sheep_list_sheeps.sheep_list: sheep.sheep_color = sheep_color # zwracamy te elementy, ktore sa istotne przy kolejnych krokach symulacji return sheep_color, wolf, drawn_wolf, bg_color
def reset(self): # usuniecie wszytskich owiec z listy self.sheep_list_gui.clear() # usuniecie wszytkich punktow z listy self.points_list_gui.clear() # czyszczenie laki ze wszystkich elementow self.meadow.delete("all") # ustawienie wilka na srodku self.drawn_wolf = draw_wolf(self.meadow, 145, 145, self.wolf.wolf_color, self.scale_variable) # ustawienie ponownie wspolrzednych wilka na srodek laki self.wolf.x = 145 self.wolf.y = 145 # ustawienie liczby zywych owiec na zero self.variable_sheep_number.set("0")
def __init__(self): # tworzenie okna: self.window = Tk() self.window.title("Python 3 Simulation") self.window.geometry('500x420') self.window.resizable(False, False) self.window.configure(background="grey") # atrybuty instancyjne: # zmienna z kolorem tła: self.bg_color = "chartreuse2" self.init_pos_limit = 200.0 # tworzymy obszar, ktory bedzie łaką (meadow) self.meadow = Canvas(self.window, bg=self.bg_color, height=1.5 * self.init_pos_limit, width=1.5 * self.init_pos_limit) # suwak do przyblizania / oddalania self.scale_variable = DoubleVar() self.scale = Scale(self.window, variable=self.scale_variable, command=self.zooming, activebackground="green", bg="white", from_=0, to=5, label="ZOOM") # wartosc domyslna dla suwaka self.default_value = 0 # ustawiamy na początku na 0 self.scale.set(self.default_value) # tworzymy wilka na start na srodku laki self.wolf = Wolf() self.drawn_wolf = draw_wolf(self.meadow, 145, 145, self.wolf.wolf_color, self.scale_variable) # owca, ktora nie jest pokazywana na lace self.sheep = Sheep(0, 100, 100) self.sheep_color = "light blue" # utworzenie obiektu lista owiec self.sheep_list_object = sheepsList.SheepList() self.sheep_list_gui = self.sheep_list_object.sheep_list self.points_list_gui = self.sheep_list_object.points_list # etykieta z liczba zywych owiec i zmienna do zmiany wartosci self.variable_sheep_number = StringVar() self.variable_sheep_number.set("0") self.label_how_many_sheep = Label( self.window, textvariable=self.variable_sheep_number, bg="grey", font="calibri 20 bold") # menu self.menu_bar = Menu(self.window) # przycisk step self.step = Button(self.window, text="STEP", height=2, width=15, justify=CENTER, bg="white", font="calibri 10 bold", command=self.step) # przycisk Reset self.reset = Button(self.window, text="RESET", height=2, width=15, justify=CENTER, bg="white", font="calibri 10 bold", command=self.reset) # przycisk start/stop self.var = StringVar() self.var.set("START") self.start_stop = Button(self.window, textvariable=self.var, height=2, width=15, justify=CENTER, bg="white", font="calibri 10 bold", command=self.start_stop_click) # zmienna dla czasu pojedynczego ruchu self.interval = 1.0 # flaga do tego czy ruch ma trwać self.perform_flag = False