Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2011-09-26 11:35:27, 1.6 KB) [[attachment:Oval.seg]]
- [получить | показать] (2011-09-26 11:35:27, 2.4 KB) [[attachment:PyGameState_Editor.dia]]
- [получить | показать] (2011-09-26 11:35:27, 2.8 KB) [[attachment:PyGameState_Ellipse.dia]]
- [получить | показать] (2011-09-26 11:35:27, 2.8 KB) [[attachment:PyGameState_Figure.dia]]
- [получить | показать] (2011-09-26 11:35:27, 1.5 KB) [[attachment:PyGameState_Input.dia]]
- [получить | показать] (2011-09-26 11:35:27, 0.4 KB) [[attachment:grap_0.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.4 KB) [[attachment:grap_1-1.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.1 KB) [[attachment:grap_1.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.8 KB) [[attachment:grap_2.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.4 KB) [[attachment:grap_3.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.6 KB) [[attachment:grap_4.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.0 KB) [[attachment:grap_5-0.py]]
- [получить | показать] (2011-09-26 11:35:27, 4.8 KB) [[attachment:grap_5-1.py]]
- [получить | показать] (2011-09-26 11:35:27, 3.6 KB) [[attachment:grap_5.py]]
- [получить | показать] (2011-09-26 11:35:27, 3.5 KB) [[attachment:grap_6-0.py]]
- [получить | показать] (2011-09-26 11:35:27, 4.7 KB) [[attachment:grap_6.py]]
- [получить | показать] (2011-09-26 11:35:27, 9.7 KB) [[attachment:grap_7.py]]
- [получить | показать] (2011-09-26 11:35:27, 0.8 KB) [[attachment:pygame_0.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.2 KB) [[attachment:pygame_1-1.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.9 KB) [[attachment:pygame_1.py]]
- [получить | показать] (2011-09-26 11:35:27, 2.5 KB) [[attachment:pygame_2-0.py]]
- [получить | показать] (2011-09-26 11:35:27, 1.3 KB) [[attachment:pygame_2-1-0.py]]
- [получить | показать] (2011-09-26 11:35:27, 5.6 KB) [[attachment:pygame_2-1.py]]
Вам нельзя прикреплять файлы к этой странице.