Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from kivy.app import App
- from kivy.app import Widget
- from kivy.core.window import Window
- from kivy.graphics import *
- from kivy.graphics.instructions import *
- from kivy.clock import *
- from kivy.uix.boxlayout import BoxLayout
- from kivy.properties import OptionProperty
- from random import uniform as uniform
- from random import randint
- from kivy.uix.label import Label
- from kivy.uix.button import Button
- from kivy.uix.pagelayout import PageLayout
- from kivy.uix.scrollview import ScrollView
- from kivy.animation import *
- import math
- import sys
- angles_list = []
- small_elipse_list = []
- elipse_list = []
- ellipses = 0
- class SpinningCircles(Widget):
- direction = OptionProperty('CW', options=['CW', 'CCW'])
- def __init__(self, **kwargs):
- super().__init__(**kwargs)
- self.elipses = []
- self.colors = []
- self.color = [uniform(0, 1), uniform(0, 1), uniform(0, 1), .4]
- self.colors.append(self.color)
- self.multi_angle = round(uniform(0.6, 1),2)
- self.multi_distance = round(uniform(0.8,1.8),2)
- Clock.schedule_interval(self.update, 1 / 60)
- # Clock.schedule_interval(self.create_circle, 3)
- self.create_circle()
- with self.canvas.before:
- PushMatrix()
- self.rotation = Rotate(angle=randint(0, 360), origin=(Window.size[0] / 2, Window.size[1] / 2))
- with self.canvas.after:
- PopMatrix()
- def create_circle(self, *dt):
- global ellipses
- with self.canvas:
- Color(1, 0, 0, 0)
- self.rec1 = Rectangle(size=(Window.size[0] / self.multi_distance, Window.size[1] / 6))
- self.rec1.pos = (Window.size[0] / 2 - self.rec1.size[0] / 2, Window.size[1] / 2 - self.rec1.size[1] / 2)
- Color(*self.color)
- self.ellipse = Ellipse(size=(Window.size[0] / 10, Window.size[0] / 10))
- self.ellipse.pos = (self.rec1.pos[0], self.rec1.pos[1] + (self.rec1.size[1] - self.ellipse.size[1]) / 2)
- small_elipse_list.append(self.ellipse)
- ellipses += 1
- Color(self.color[0], self.color[1], self.color[2], self.color[3] + 0.4)
- self.ellipse3 = Ellipse(size=(Window.size[0] / 8, Window.size[0] / 8))
- self.ellipse3.pos = (self.rec1.pos[0], self.rec1.pos[1] + (self.rec1.size[1] - self.ellipse3.size[1]) / 2)
- elipse_list.append(self.ellipse3)
- self.line = Line(points=(Window.size[0] / 2, Window.size[1] / 2,
- self.ellipse3.pos[0] + self.ellipse3.size[0],
- self.ellipse3.pos[1] + self.ellipse3.size[1] / 2),
- width=1.4)
- self.label = Label(text=str(self.multi_angle), font_size = f"{Window.size[0]/40}dp")
- self.label.size = (self.ellipse3.size[0],self.ellipse3.size[1])
- self.label.pos = (self.ellipse3.pos[0],self.ellipse3.pos[1])
- def update(self, dt):
- self.rotation.angle += {'CW': -1, 'CCW': 1}[self.direction] * self.multi_angle
- self.rec1.size = (self.rec1.size[0] / 2, self.rec1.size[1] / 2)
- if self.ellipse3 in elipse_list and len(elipse_list) == len(angles_list): angles_list[elipse_list.index(self.ellipse3)] = self.rotation.angle
- elif self.ellipse3 in elipse_list: angles_list.append(self.rotation.angle)
- # print(self.color)
- def on_size(self, *args):
- self.rotation.origin = Window.size[0] / 2, Window.size[1] / 2
- self.rec1.size = (Window.size[0] / self.multi_distance, Window.size[0] / 6)
- self.rec1.pos = (Window.size[0] / 2 - self.rec1.size[0] / 2, Window.size[1] / 2 - self.rec1.size[1] / 2)
- self.ellipse.size = (Window.size[0] / 10, Window.size[0] / 10)
- self.ellipse.pos = (self.rec1.pos[0], self.rec1.pos[1] + (self.rec1.size[1] - self.ellipse.size[1]) / 2)
- self.ellipse3.size = (Window.size[0] / 8, Window.size[0] / 8)
- self.ellipse3.pos = (self.rec1.pos[0], self.rec1.pos[1] + (self.rec1.size[1] - self.ellipse3.size[1]) / 2)
- self.label.size = (self.ellipse3.size[0],self.ellipse3.size[1])
- self.label.pos = (self.ellipse3.pos[0],self.ellipse3.pos[1])
- self.line.points = (Window.size[0] / 2, Window.size[1] / 2,
- self.ellipse3.pos[0] + self.ellipse3.size[0],
- self.ellipse3.pos[1] + self.ellipse3.size[1] / 2)
- self.label.font_size = f"{Window.size[0]/40}dp"
- class MyAnimation(Widget):
- def __init__(self, **kwargs):
- super().__init__(**kwargs)
- self.spinning_widgets = []
- self.layout = BoxLayout()
- self.add_rect()
- Clock.schedule_interval(self.add_rect, randint(1,2))
- self.add_widget(self.layout)
- def add_rect(self, *dt):
- if randint(0,1):
- self.widget = SpinningCircles(direction='CW')
- StartPage.label1_text_update()
- self.spinning_widgets.append(self.widget)
- self.layout.add_widget(self.widget)
- else:
- self.widget = SpinningCircles(direction='CCW')
- StartPage.label1_text_update()
- self.spinning_widgets.append(self.widget)
- self.layout.add_widget(self.widget)
- class StartPage(PageLayout):
- label1 = Label(text=f"{ellipses}", font_size='20sp')
- def __init__(self, **kwargs):
- super().__init__(**kwargs)
- # First Page: MyAnimation
- self.group1 = InstructionGroup()
- self.group2 = InstructionGroup()
- self.my_animation = MyAnimation()
- self.add_widget(self.my_animation)
- #Clock.schedule_interval(lambda x: self.clear_checkpos() if [child for child in self.group1.children if isinstance(child, Ellipse)] else None, .5)
- #Clock.schedule_interval(self.label1_text_update, .5)
- self.button1 = Button(text="Option1", size_hint=(1, 1), background_color=(uniform(0, 1), uniform(0, 1), uniform(0, 1), .8),
- background_normal='',on_press=self.button1_pressed)
- self.button2 = Button(text="Delete Ellipse", size_hint=(1, 1), background_color=(uniform(0, 1), uniform(0, 1), uniform(0, 1), .8),
- background_normal='', on_press=self.button2_pressed)
- self.button3 = Button(text="Add Ellipse", size_hint=(1, 1), background_color=(uniform(0, 1), uniform(0, 1), uniform(0, 1), .8),
- background_normal='', on_press=self.button3_pressed, on_release=self.button3_onrelease)
- # BOX LAYOUT
- self.boxlayout = BoxLayout(orientation="vertical", spacing=70, padding=50)
- self.boxlayout.add_widget(self.label1)
- self.boxlayout.add_widget(self.button1)
- self.boxlayout.add_widget(self.button2)
- self.boxlayout.add_widget(self.button3)
- self.add_widget(self.boxlayout)
- def get_ellipse_positions(self, list, *dt):
- ellipses_positions = []
- if angles_list and list:
- for el in range(len(angles_list)):
- angle = angles_list[el]
- ellipse = list[el]
- midpoint = (Window.size[0] / 2-list[el].size[0]/2, Window.size[1] / 2-list[el].size[1]/2)
- angle_radians = math.radians(angle)
- x = list[el].pos[0]
- y = list[el].pos[1]
- dx = x - midpoint[0]
- dy = y - midpoint[1]
- new_x = midpoint[0] + dx * math.cos(angle_radians) - dy * math.sin(angle_radians)
- new_y = midpoint[1] + dx * math.sin(angle_radians) + dy * math.cos(angle_radians)
- #self.check_pos(new_x,new_y)
- ellipses_positions.append((new_x,new_y))
- return ellipses_positions
- def on_touch_down(self, touch):
- if elipse_list:
- for ellipse_pos, ellipse in zip(self.get_ellipse_positions(elipse_list),elipse_list):
- if (touch.pos[0] >= ellipse_pos[0] and touch.pos[0] <= ellipse_pos[0] + ellipse.size[0]
- and touch.pos[1] >= ellipse_pos[1] and touch.pos[1] <= ellipse_pos[1] + ellipse.size[1]):
- self.check_pos(ellipse_pos[0],ellipse_pos[1],elipse_list.index(ellipse))
- self.remove_ellipse(elipse_list.index(ellipse))
- return super().on_touch_down(touch)
- def check_pos(self, x, y, index):
- colors = self.my_animation.spinning_widgets[index].colors[0]
- self.group1.add(Color(colors[0],colors[1],colors[2],colors[3]+0.4))
- small_ellipse = Ellipse(size=(Window.size[0] / 10, Window.size[0] / 10),pos = self.get_ellipse_positions(small_elipse_list)[index])
- self.group1.add(small_ellipse)
- self.group2.add(small_ellipse)
- # + small ellipse #need to get his pos
- self.group1.add(Color(*colors))
- self.group1.add(Ellipse(size=(Window.size[0] / 8, Window.size[0] / 8),pos = self.get_ellipse_positions(elipse_list)[index]))
- self.group1.add(Line(points=self.find_line_points(x, y, index),width=1.4))
- self.canvas.after.add(self.group1)
- self.clear_checkpos()
- def find_line_points(self, x, y, index):
- return (Window.size[0]/2, Window.size[1]/2,
- x + elipse_list[index].size[0]/2, y + elipse_list[index].size[1]/2)
- def clear_checkpos(self, *dt):
- small_ellipses = [child for child in self.group1.children if isinstance(child, Ellipse) and child in self.group2.children]
- big_ellipses = [child for child in self.group1.children if isinstance(child, Ellipse) and child not in self.group2.children]
- lines = [child for child in self.group1.children if isinstance(child, Line)]
- anim = Animation(size = (0,0),pos=(Window.size[0]/2, Window.size[1]/2), duration= 1.1)
- anim2 = Animation(points = (Window.size[0]/2, Window.size[1]/2, Window.size[0]/2, Window.size[1]/2), duration = 1.1)
- def inner_clear_checkpos(instance, value):
- if not len(self.group1.children) % 8:
- for _ in range(8):
- if self.group1.children: self.group1.children.pop(0)
- anim2.bind(on_complete=inner_clear_checkpos)
- for small_ellipse, big_ellipse, line in zip(small_ellipses,big_ellipses,lines):
- anim.start(small_ellipse)
- anim.start(big_ellipse)
- anim2.start(line)
- #Clock.schedule_once(inner_clear_checkpos, 0.2)
- def remove_ellipse(self, index):
- global ellipses
- global angles_list
- global elipse_list
- objects_list = self.my_animation.spinning_widgets
- if objects_list:
- objects_list[index].canvas.clear()
- objects_list.pop(index)
- angles_list.pop(index)
- elipse_list.pop(index)
- small_elipse_list.pop(index)
- ellipses -= 1
- self.label1_text_update()
- @classmethod
- def label1_text_update(cls, *dt):
- cls.label1.text = f"Elipses in total: {ellipses}"
- # SecondPage - BUTTONS
- def button1_pressed(self, instance):
- pass
- def button2_pressed(self, instance):
- pass
- #self.remove_ellipse()
- def button3_pressed(self, instance):
- self.button3.pos = (self.button3.pos[0], self.button3.pos[1] + 5)
- for x in range(10): self.my_animation.add_rect(1)
- self.label1_text_update()
- def button3_onrelease(self, instance):
- self.button3.pos = (self.button3.pos[0], self.button3.pos[1] - 5)
- class ApplicationApp(App):
- def build(self):
- return StartPage()
- ApplicationApp().run()
Advertisement
Add Comment
Please, Sign In to add comment