Advertisement
Bkmz

Untitled

Oct 3rd, 2011
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.56 KB | None | 0 0
  1. #!/usr/bin/env python2
  2. # -*- coding: utf-8 -*-
  3.  
  4. from Tkinter import Tk, Canvas
  5. from math import cos, sin, sqrt, radians
  6. from time import sleep
  7.  
  8. import copy
  9.  
  10.  
  11. class App:
  12.     def __init__(self, master):
  13.        
  14.         self.master = master
  15.        
  16.         self.width  = {"start": 0, "end": 640}
  17.         self.height = {"start": 0, "end": 480}
  18.        
  19.         self.canvas = Canvas(master)
  20.        
  21.         self.canvas.configure({"bg": "white"})
  22.         self.canvas.pack({"fill": "both", "expand": True})
  23.        
  24.         # widget sizes
  25.         w = self.width['end']
  26.         h = self.height['end']
  27.        
  28.         # define section =) #define Yes 1 #define No 0 ;-)
  29.         self.offset = 70
  30.         self.center = {"x": 0+self.offset, "y": h/2}
  31.        
  32.         self.radius      = 50
  33.         self.line_length = 23
  34.        
  35.        
  36.        
  37.         self.truck = [
  38.                  (-self.line_length,-self.radius),
  39.                  (+self.line_length,-self.radius),
  40.                  
  41.                  (+self.radius,-self.line_length),
  42.                  (+self.radius,+self.line_length),
  43.                  
  44.                  (+self.line_length,+self.radius),
  45.                  (-self.line_length,+self.radius),
  46.                  
  47.                  (-self.radius,+self.line_length),
  48.                  (-self.radius,-self.line_length),
  49.                  
  50.                  # double this point to close circuit
  51.                  (-self.line_length,-self.radius)
  52.                  
  53.                 ]
  54.        
  55.        
  56.         # Tk bindings
  57.         self.__bindings(master)
  58.        
  59.        
  60.         # need first run to redraw
  61.         self.__draw()
  62. #        self.__draw_loop()
  63.        
  64.        
  65.        
  66.        
  67.     """SLOT to update when window is resizing"""    
  68.     def __update_coords(self, event):
  69.         # bind event, to update coordinates
  70.         self.width['end']  = event.width
  71.         self.height['end'] = event.height
  72.         self.center = {"x": 0+self.offset, "y": self.height['end']/2}
  73.        
  74. #        self.canvas.update_idletasks()
  75.        
  76.         self.__draw()
  77.        
  78.        
  79.     def __draw(self, event=None):
  80.         self.canvas.delete("all")
  81.         # widget sizes
  82.         w = self.width['end']
  83.         h = self.height['end']
  84.        
  85.         truck = self.truck
  86.         radius = self.radius
  87.         line_length = self.line_length
  88.         center = self.center
  89.         offset = self.offset
  90.        
  91.         center2 = copy.copy(self.center)
  92.         center2['x'] += 250
  93.        
  94.         for i in xrange(len(truck)):
  95.             # check the last item
  96.             try:
  97.                 if i == 0:
  98.                     color = "blue"
  99.                     fill_width = 2
  100.                 else:
  101.                     color = "black"
  102.                     fill_width = 1
  103.                    
  104.                 self.canvas.create_line(center['x']+truck[i][0], center['y']+truck[i][1],
  105.                                         center['x']+truck[i+1][0], center['y']+truck[i+1][1],
  106.                                         tag="border")
  107.                
  108.                 self.canvas.create_line(center['x'], center['y'],
  109.                                         center['x']+truck[i][0], center['y']+truck[i][1],
  110.                                         fill=color,  tag="diagonal", width=fill_width)
  111.                
  112.             except:
  113.                 pass
  114.            
  115.            
  116.         for i in xrange(len(truck)):
  117.             # check the last item
  118.             try:
  119.                 if i == 0:
  120.                     color = "blue"
  121.                     fill_width = 2
  122.                 else:
  123.                     color = "black"
  124.                     fill_width = 1
  125.                    
  126.                 self.canvas.create_line(center2['x']+truck[i][0], center2['y']+truck[i][1],
  127.                                         center2['x']+truck[i+1][0], center2['y']+truck[i+1][1],
  128.                                         tag="border")
  129.                
  130.                 self.canvas.create_line(center2['x'], center2['y'],
  131.                                         center2['x']+truck[i][0], center2['y']+truck[i][1],
  132.                                         fill=color,  tag="diagonal", width=fill_width)
  133.                
  134.             except:
  135.                 pass    
  136.            
  137.            
  138.        
  139.         self.canvas.create_line(center['x'], center['y'],
  140.                                 center['x']+70, center['y']-70, width=2)
  141.        
  142.         self.canvas.create_line(center['x']+70, center['y']-70,
  143.                                 center['x']+70, center['y']-100, width=2)
  144.        
  145.         # site
  146.         self.canvas.create_line(center['x']+55, center['y']-100,
  147.                                 center['x']+90, center['y']-100, width=2)
  148.        
  149.         self.canvas.create_line(center['x']+70, center['y']-70,
  150.                                 center['x']+170, center['y']-70, width=2)
  151.        
  152.         self.canvas.create_line(center['x']+170, center['y']-70,
  153.                                 center2['x'], center2['y'], width=2)
  154.        
  155.         self.canvas.create_line(center['x']+170, center['y']-70,
  156.                                 center['x']+170, center['y']-130, width=2)
  157.        
  158.         self.canvas.create_line(center['x']+170, center['y']-130,
  159.                                 center['x']+130, center['y']-150, width=2)
  160.        
  161.         self.canvas.create_line(center['x']+170, center['y']-130,
  162.                                 center['x']+210, center['y']-150, width=2)
  163.                
  164.         # draw dash line.
  165.         self.canvas.create_line(
  166.                                 0+offset, h/2,
  167.                                 w-offset, h/2,
  168.                                 tags="line",
  169.                                 fill="blue",
  170.                                 width="2.0",
  171.                                 dash="5",
  172.                                 )
  173.        
  174.        
  175.     def __rotate_truck(self, degree=10):
  176.         for i in xrange(len(self.truck)):
  177.             self.truck[i] = self.__matrix_multiplication(self.truck[i], radians(degree))
  178.            
  179.     def __move_point(self, points=1):
  180.         self.center['x'] += points
  181.        
  182.        
  183.            
  184.            
  185.  
  186.    
  187.     def __draw_loop(self, event=None):
  188. #        sleep(5.50)
  189.         print "Run loop"
  190.        
  191.         while 1:
  192.            
  193.             self.canvas.delete("all || !line")
  194.             self.__rotate_truck(1.8)
  195.             self.__move_point(2)
  196.             self.__draw()
  197.             self.canvas.update_idletasks()
  198.             self.master.update_idletasks()
  199. #            sleep(0.01)
  200.            
  201.             if self.center['x']+self.offset >= self.width['end']:
  202. #                self.center['x'] = 0+self.offset
  203.                 break
  204.            
  205.            
  206.        
  207.     def __bindings(self, master):
  208.         # binding master window resize
  209.         master.bind("<Configure>", self.__update_coords)
  210. #        master.bind("<Configure>", self.__draw)
  211.         self.canvas.bind("<Button-1>", self.__draw_loop)
  212.    
  213.     def __matrix_multiplication(self, point, degree):
  214.         a11 = point[0]
  215.         a12 = point[1]
  216.         a13 = 1
  217.        
  218.         b11 = cos(degree)
  219.         b12 = sin(degree)
  220.         b13 = 0
  221.        
  222.         b21 = -sin(degree)
  223.         b22 = cos(degree)
  224.         b23 = 0
  225.        
  226.         b31 = 0
  227.         b32 = 0
  228.         b33 = 1
  229.        
  230.         return a11*b11+a12*b21+a13*b31 ,  a11*b12+a12*b22+a13*b32  
  231.        
  232.  
  233. root = Tk()
  234. root.title("MachineGraphics. Lab2. Variant 2")
  235. root.geometry("640x480-0+20")
  236.  
  237. app = App(root)
  238.  
  239. root.mainloop()
  240.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement