Advertisement
here2share

# Tk_sling.py

Oct 26th, 2016
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.03 KB | None | 0 0
  1. # Tk_sling.py
  2.  
  3. from Tkinter import *
  4. import random
  5. from math import *
  6.  
  7.  
  8. WIDTH = 400
  9. HEIGHT = 400
  10.  
  11. farben = ["#ff0000","#00ff00","#0000ff","#ffff00","#ff00ff","#00ffff"]
  12. ball_count = 0
  13.  
  14. gravity = 0.05
  15. friction = 0.001
  16.  
  17. class GUI():
  18.     def __init__(self):
  19.         self.root = Tk()
  20.         self.root.title("Sling")
  21.         self.root.bind_all('<Escape>',self.quit)
  22.         self.canvas = Canvas(self.root,width=WIDTH,height=HEIGHT,bg="#000000")
  23.  
  24.         self.arrow = self.canvas.create_line(-100,-100,-100,-100,
  25.                                              fill="#a0a0a0",width=3,
  26.                                              arrow="first",arrowshape=(12,16,6))
  27.  
  28.         self.canvas.pack()
  29.  
  30.     def quit(self,event):
  31.         self.root.quit()
  32.         self.root.destroy()
  33.  
  34.  
  35. class Ball():
  36.     def __init__(self,field,gui,x=None,y=None,vx=0,vy=0):
  37.         self.field = field
  38.         self.RADIUS = random.randint(10,40)
  39.  
  40.         if x:
  41.             if x<self.RADIUS: x = self.RADIUS
  42.             if x>WIDTH-self.RADIUS: x=WIDTH-self.RADIUS
  43.             self.x = x
  44.         else:
  45.             self.x = random.randint(WIDTH/4,WIDTH*3/4)
  46.  
  47.         if y:
  48.             if y<self.RADIUS: y = self.RADIUS
  49.             if y>HEIGHT-self.RADIUS: y=HEIGHT-self.RADIUS
  50.             self.y = y
  51.         else:
  52.             self.y = random.randint(HEIGHT/4,HEIGHT*3/4)
  53.  
  54.         farbe = random.choice(farben)
  55.         self.ball = field.create_oval(self.x-self.RADIUS,self.y-self.RADIUS,
  56.                                           self.x+self.RADIUS,self.y+self.RADIUS,
  57.                                           fill=farbe,outline="")
  58.         field.tag_lower(self.ball,gui.arrow)
  59.         self.vx, self.vy = vx,vy
  60.  
  61.     def move(self):
  62.         if self.NOMOVE: return
  63.         self.x += self.vx
  64.         self.y += self.vy
  65.         if self.x<self.RADIUS or self.x>WIDTH-self.RADIUS:
  66.             self.vx = -self.vx
  67.             self.x += self.vx
  68.         if self.y<self.RADIUS or self.y>HEIGHT-self.RADIUS:
  69.             self.vy = -self.vy
  70.             self.y += self.vy
  71.  
  72.         self.vy += gravity
  73.  
  74.         self.vx *= (1-friction)
  75.         self.vy *= (1-friction)
  76.        
  77.         self.field.coords(self.ball,self.x-self.RADIUS,self.y-self.RADIUS,
  78.                               self.x+self.RADIUS,self.y+self.RADIUS)
  79.        
  80.  
  81. class Play():
  82.     def __init__(self):
  83.         self.gui = GUI()
  84.         self.gui.canvas.bind("<Button-1>",self.clicked)
  85.         self.gui.canvas.bind("<ButtonRelease-1>",self.dragged)
  86.         self.gui.canvas.bind("<B1-Motion>",self.moved)
  87.        
  88.         self.gui.canvas.bind("<Button-3>",self.unclicked)
  89.        
  90.         self.balls = []
  91.         for i in range(ball_count):
  92.             self.balls.append(Ball(self.gui.canvas,self.gui))
  93.         self.action()
  94.  
  95.  
  96.     def clicked(self,event):
  97.         self.gui.root["cursor"] = "target"
  98.         self.balls.append(Ball(self.gui.canvas,self.gui,event.x,event.y))
  99.         self.balls[-1].NOMOVE = True
  100.         self.mouse_x0, self.mouse_y0 = event.x, event.y
  101.        
  102.     def moved(self,event):
  103.         if len(self.balls)==0: return
  104.         ball = self.balls[-1]
  105.         self.gui.canvas.coords(self.gui.arrow,self.mouse_x0,self.mouse_y0,
  106.                                event.x,event.y)
  107.  
  108.     def dragged(self,event):
  109.         self.gui.canvas.coords(self.gui.arrow,-100,-100,-100,-100)
  110.         if len(self.balls)==0: return
  111.         self.gui.root["cursor"] = "arrow"
  112.         distance_x, distance_y  = event.x-self.mouse_x0, event.y-self.mouse_y0
  113.         ball = self.balls[-1]
  114.         ball.vx = -distance_x/20.0
  115.         ball.vy = -distance_y/20.0
  116.         self.balls[-1].NOMOVE = False
  117.  
  118.     def unclicked(self,event):
  119.         if len(self.balls)>0:
  120.             removeball = self.balls[-1]
  121.             self.gui.canvas.delete(removeball.ball)
  122.             self.balls = self.balls[:-1]
  123.            
  124.  
  125.     def action(self):
  126.         while True:
  127.             for ball in self.balls:
  128.                 ball.move()
  129.             self.gui.canvas.after(10)
  130.             self.gui.canvas.update()
  131.  
  132. Play()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement