PyGame, введение II
Начальниые знания, необходимые для того, чтобы перетащить проект «Рисование Графика» в PyGame
— тема по Linux
— необязательная тема
- Понятие Surface и Rect
- Кодировка цветов
- Графические примитивы
- Цикл обработки событий
- Понятие "события" и его обработки
Виды событий PyGame
Домашнее задание
— теоретическое задание
— новая тема
- Рисование мышью
- Самое простое (лишь бы рисовало)
- + включение диагностических сообщений
- +выход по закрытию окна
- +Только при нажатой кнопке мыши pygame0.py
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 ''' 4 Рисование мышью 5 6 0. Самое простое (лишь бы рисовало) 7 1. + включение диагностических сообщений 8 2. +выход по закрытию окна 9 3. +Только при нажатой кнопке мыши 10 ''' 11 12 import pygame, sys 13 14 # Начало работы PyGame 15 pygame.init() 16 size = (1024, 768) 17 screen = pygame.display.set_mode(size) 18 width, color = 2, (250,200,150) 19 debug = False # Нужно ли выводить отладочные сообщения 20 pos = (0,0) # Предыдущая координата при ремещении мыши 21 22 while 1: 23 event = pygame.event.wait() 24 if debug: print event 25 if event.type == pygame.KEYUP: 26 if event.key == 32: 27 debug = not debug 28 if event.type == pygame.MOUSEBUTTONDOWN: 29 pos = event.pos 30 if event.type == pygame.MOUSEMOTION: 31 if event.buttons[0]: # Левая кнопка -- линия 32 pygame.draw.line(screen, color, pos, event.pos, width) 33 pos = event.pos # запоминает, куда переместился курсор 34 if event.type == pygame.QUIT: sys.exit() 35 pygame.display.flip()
Воспроизвести задачу «Рисование графика произвольной функции» в PyGame
- pygame_grafun.py
1 #!/usr/bin/env python 2 # -*- coding: UTF-8 -*- 3 ''' 4 Построение графика произвольной функции 5 в произвольном диапазоне на экране произвольных размеров 6 Используется PyGame 7 ''' 8 9 from math import * 10 import sys, pygame 11 12 pen,paper,width=(200,250,100),(0,0,0),2 13 14 def definput(prompt, *default): 15 'Реализация Input, возвращающая default, если введённые данные пусты' 16 s = raw_input(prompt+": ") 17 if s: 18 return eval(s) 19 elif len(default)==1: 20 return default[0] 21 else: 22 return default 23 24 def scale(x, X0, X1, Z0, Z1): 25 'Преобразует координату x в диапазоне [X0, X1] в координату z в диапазоне [Z0, Z1]' 26 return Z0+(Z1-Z0)*(x-X0)/float(X1-X0) 27 28 def grafun(X0, X1, count, formulae): 29 'Список длиной count вида [(x, formulae(x)),..], х из диапазона [X0, X1]' 30 ret=[] 31 for i in range(count): 32 x=scale(i, 0, count-1, X0, X1) 33 y=eval(formulae) 34 ret.append((x,y)) 35 return ret 36 37 fml = definput("Функция в виде формулы от x", "sin(x)") 38 X0, X1 = definput("Начало и конец диапазона", -4., 4.) 39 W, H = definput("Ширина и высота экрана", 1024, 768) 40 X0, X1 = float(X0), float(X1) 41 42 # вычисляем график (по одной точке на вертикальную колонку пикселей) 43 gr = grafun(X0, X1, W, fml) 44 # находим максимальное и минимальные значения функции 45 Fx=zip(*gr)[1] # список [ gr[0][1], gre[1][1], gr[2][1], ... ] 46 Min, Max = min(Fx), max(Fx) 47 # масштабируем график к экрану (x известны, они от 0 до W-1) 48 # по-хорошему, x также надо было бы вычислять из gr[*][0] 49 grs = [(x,scale(gr[x][1], Min, Max, 0, H)) for x in xrange(W)] 50 51 # всё посчитали, открываем окошко 52 pygame.init() 53 screen = pygame.display.set_mode((W,H)) 54 55 # рисуем график 56 pygame.draw.lines(screen, pen, False, grs, width) 57 # цикл до закрытия окна 58 while pygame.event.wait().type != pygame.QUIT: 59 pygame.display.flip()