Прикреплённый файл «pygame_2-1.py»

Загрузка

   1 #!/usr/bin/env python
   2 # -*- coding: UTF-8 -*-
   3 # vim: expandtab shiftwidth=4
   4 '''
   5 Проект "Построение графика", подзадача pygame 2-1
   6 "Резиновые линии": двухуровневый редизайн
   7 см. диаграммы PyGameState_*.dia
   8 '''
   9 
  10 from math import *
  11 import sys
  12 
  13 import pygame
  14 pygame.init()
  15 pygame.font.init()
  16 
  17 def distance(M1,M2):
  18     'Расстояние от точки до точки'
  19     return sqrt(float(M1[0]-M2[0])**2+float(M1[1]-M2[1])**2)
  20 
  21 def Draw(screen, pen, width, center, pos, figure):
  22     if figure == "Line":
  23         pygame.draw.line(screen, pen, center, pos, width)
  24     elif figure == "Rect":
  25         pygame.draw.rect(screen, pen, (center, (pos[0]-center[0],pos[1]-center[1])), width)
  26     elif figure == "Circle":
  27         r=int(round(distance(center, pos)))
  28         pygame.draw.circle(screen, pen, center, max(r, width), width)
  29 
  30 def DrawState(screen, event, stages):
  31     'Рисование фигуры по двум точкам'
  32     global State, Stage, Center, Copy, pen, width, Action
  33     if event.type == pygame.MOUSEMOTION:
  34         if Stage == 2:
  35             screen.blit(Copy, (0,0))    # восстанавливаем 
  36             Draw(screen, pen, width, Center, event.pos, Action)
  37     elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
  38         if Stage == 1:                  # первое нажатие
  39             Stage = 2
  40             Center = event.pos
  41             Copy = screen.copy()        # состояние экрана без нарисованной линии
  42         elif Stage == stages:           # Последнее нажатие
  43             Stage = 1
  44     elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 3:
  45         if Stage > 1:                   # Нарисовано что-то резиновое
  46             screen.blit(Copy, (0,0))    # восстанавливаем 
  47             Stage = 1
  48     elif event.type == pygame.KEYDOWN and event.key == 27:
  49         screen.blit(Copy, (0,0))
  50         State = "Base"
  51 
  52 def ScrInput(screen, prompt, pos):
  53     '''Ввести строку с клавиатуры, отображая её.
  54     Backspace -- удалить один символ, ESC -- вернуть None'''
  55     global Copy
  56     res = ""
  57     Copy = screen.copy()
  58     while True:
  59         text = font.render(prompt+": "+res, 1, (255,255,255))
  60         screen.blit(Copy, (0,0))
  61         screen.blit(text, pos)
  62         pygame.display.flip()
  63         event = pygame.event.wait()
  64         if event.type == pygame.KEYDOWN:
  65             if event.unicode:                     # real characters
  66                 if event.unicode == u"\033":      # ESC
  67                     res = None
  68                     break
  69                 elif event.unicode == "\010":     # Backspace
  70                     res=res[:-1]
  71                 elif event.unicode in u"\r\n":    # Enter
  72                     break
  73                 elif event.unicode > u" ":        # printable characters
  74                     res += event.unicode
  75                 #print event.unicode.__repr__()
  76     screen.blit(Copy, (0,0))
  77     pygame.display.flip()
  78     return res
  79 
  80 def Ask_n_Do(screen, what, prompt):
  81     '''Ввести строку, проверить, и сделать с ней что полагается.
  82     Вернуть True или False в зависимости от успешности'''
  83     global width, pen
  84     str_res=ScrInput(screen,u"Введите "+prompt, (10,10))
  85     if str_res is None: return False    # ввод был прерван
  86     try:
  87         res = eval(str_res)
  88     except:     # неизвестно что, пусть это остаётся строкой
  89         res = str_res
  90     if what == "Width":
  91         if type(res) != int:
  92             print what, "must be integer"
  93             return False
  94         width = res
  95     elif what == "Color":
  96         if type(res) not in (list, tuple) or len(res) != 3:
  97             print what, "must be 3-element list"
  98             return False
  99         pen = [r%256 for r in res]      # лень проверять ещё и < 256
 100     elif what == "Save":
 101         try:
 102             pygame.image.save(screen,res)
 103         except:
 104             print sys.exc_value
 105             return False
 106     elif what == "Edit":
 107         try:
 108             newscr = pygame.image.load(res)
 109             screen.blit(newscr,(0,0))
 110         except:
 111             print sys.exc_value
 112             return False
 113     return True
 114 
 115 # Основной экран
 116 W,H=640,480
 117 screen=pygame.display.set_mode((W,H))
 118 
 119 pen,width=(10,100,200),2
 120 font = pygame.font.Font(None, W/24)
 121 States=("Draw", "Input", "Base")
 122 Figures={"o":"Circle", "l":"Line", "r":"Rect"}
 123 Inputs={"w":    ("Width", u"ширину линии"),
 124         "c":    ("Color", u"цвет линии"),
 125         "s":    ("Save", u"имя файла для сохранения"),
 126         "e":    ("Edit", u"имя файла для чтения"),
 127 }
 128 Center=(0,0)
 129 Copy=None
 130 
 131 State, Stage, Action = "Base", 1, "Line"
 132 while True:
 133   pygame.display.flip()
 134   event = pygame.event.wait()
 135   # Выход по закрытию окна
 136   if event.type == pygame.QUIT: sys.exit()
 137   if State == "Base":   # основное состояние
 138     if event.type == pygame.KEYDOWN:
 139         key = event.unicode.lower()
 140         if key == "q":
 141             sys.exit()
 142         elif key in Figures.keys():     # Начать рисование фигуры
 143             State,Stage,Action = "Draw", 1, Figures[event.unicode.lower()]
 144             Copy = screen.copy()
 145         elif key in Inputs.keys():      # Что-то ввести и обработать результат
 146             Ask_n_Do(screen, *Inputs[key])
 147   elif State == "Draw": # рисование фигуры
 148     DrawState(screen, event, 2)

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.