Advertisement
Guest User

Untitled

a guest
May 25th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.12 KB | None | 0 0
  1. from PIL import Image, ImageDraw, ImageFont
  2. import time
  3. import os
  4. from datetime import datetime
  5. import math
  6.  
  7. __author__ = "vk.com/id411779952"
  8.  
  9.  
  10. # Все права под защитой Летающего Макаронного Монстра
  11.  
  12.  
  13. class Timer:
  14.     def __init__(self, x_size=160, y_size=21):
  15.         self.x_size = x_size
  16.         self.y_size = y_size
  17.  
  18.         texts = ['yandex', "яндекс"]
  19.         rows = []
  20.         for text in texts:
  21.             rows.append((text * int(math.ceil(x_size / len(text))))[:x_size])
  22.         grid = []
  23.         for y in range(max(y_size, x_size)):
  24.             grid.append(rows[y % len(rows)])
  25.         self.grid = grid
  26.  
  27.     @staticmethod
  28.     def _decl_of_num(number, titles: (str, str, str)):
  29.  
  30.         cases = [2, 0, 1, 1, 1, 2]
  31.         if 4 < number % 100 < 20:
  32.             return titles[2]
  33.         else:
  34.             if number % 10 < 5:
  35.                 return titles[cases[number % 10]]
  36.             else:
  37.                 return titles[cases[5]]
  38.  
  39.     @classmethod
  40.     def _delta_to_str(cls, t_delta):
  41.         days = t_delta.days
  42.         hours, rem = divmod(t_delta.seconds, 3600)
  43.         minutes, seconds = divmod(rem, 60)
  44.         days_text = cls._decl_of_num(days, ('День', 'Дня', 'Дней'))
  45.         hours_text = cls._decl_of_num(hours, ('Час', 'Часа', 'Часов'))
  46.         minutes_text = cls._decl_of_num(minutes, ('Минута', 'Минуты', 'Минут'))
  47.         return f'{days} {days_text}, {hours} {hours_text}, {minutes} {minutes_text}'
  48.  
  49.     @classmethod
  50.     def get_time_left(cls) -> str:
  51.         conference_time = datetime(2018, 5, 29, 10)
  52.         if conference_time < datetime.now():
  53.             raise ValueError("Конференция началась!")
  54.         return cls._delta_to_str(conference_time - datetime.now())
  55.  
  56.     def create_mask(self):
  57.         font_fname = "fonts/11871.otf"
  58.         font_size = 20
  59.         if font_fname[-3:] == 'ttf':
  60.             font = ImageFont.truetype(font_fname, font_size)
  61.         else:
  62.             font = ImageFont.FreeTypeFont(font_fname, font_size)
  63.  
  64.         image = Image.new('RGBA', (self.x_size, self.y_size), (0, 0, 0, 0))
  65.         draw = ImageDraw.Draw(image)
  66.         draw.multiline_text((0, 0), self.get_time_left(), spacing=10, fill='black', font=font)
  67.         return image
  68.  
  69.     def produce_result(self):
  70.         mask = self.create_mask()
  71.         pixels = mask.load()
  72.  
  73.         rows = []
  74.         for y in range(self.y_size):
  75.             row = ""
  76.             for x in range(self.x_size):
  77.                 if pixels[x, y][3] > 80:
  78.                     row += self.grid[y][x]
  79.                 else:
  80.                     row += " "
  81.             rows.append(row)
  82.         return rows
  83.  
  84.     def run(self):
  85.         while True:
  86.             try:
  87.                 result = self.produce_result()
  88.             except ValueError:
  89.                 print("Все на конференцию!")
  90.                 return
  91.             print('\n' * 100)
  92.             os.system('cls')
  93.             print("\n".join(result))
  94.  
  95.             time.sleep(60)
  96.  
  97.  
  98. if __name__ == '__main__':
  99.     t = Timer()
  100.     t.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement