from __future__ import division from mycolors import * #from myinput import Input import time import pygame from pygame.locals import * import time import json class Window: made=0 draw=pygame.draw bijection=lambda x,i1,i2:(i2[1]-i2[0])/(i1[1]-i1[0])*(x-i1[0])+i2[0] def __init__(self,name="Unnamed",size=None,text_font="monospace",text_size=65,text_color=WHITE,background_color=BLACK,fullscreen=False,build=True): """Create a window object using name, size text_font, text_size, text_color, background and set.""" Window.made+=1 self.number=Window.made self.name=name self.size=size self.text_font=text_font self.text_size=text_size self.text_color=text_color self.background_color=background_color self.fullscreen=fullscreen #self.input=Input() self.set() if build: self.build() self.log("Window has been created.") def set(self): """Set builtins attributs of window object.""" self.RIGHT = 0 self.UP = 1 self.LEFT = 2 self.DOWN = 3 self.selecter_color=self.reverseColor(self.background_color) self.open=False self.screenshots_taken=0 self.pause_cool_down=1 self.click_cool_down=0.3 self.last_click=time.time() self.pause_time=0.2 self.focus=None def build(self): """Creates apparent window.""" pygame.init() self.info = pygame.display.Info() self.font = pygame.font.SysFont(self.text_font, self.text_size) if self.size is None: if self.fullscreen: self.size=[self.info.current_w,self.info.current_h] else: self.size=[2*self.info.current_w//3,2*self.info.current_h//3] self.coordonnates=[0,0]+self.size if self.fullscreen: self.screen=pygame.display.set_mode(self.size,FULLSCREEN) else: self.screen=pygame.display.set_mode(self.size,RESIZABLE) pygame.display.set_caption(self.name) if self.text_color is None: self.text_color=self.reverseColor(self.background_color) self.clear() self.flip() self.open=True def clear(self,color=None): """Clear to background color.""" if color is None: color=self.background_color self.screen.fill(color) def scale(self,picture,size): """Return scaled picture using picture and size.""" return pygame.transform.scale(picture,size) def check(self): """Update window's state depending if close buttons are pressed.""" for event in pygame.event.get(): if event.type == pygame.QUIT: self.open=False if event.type == KEYDOWN: if event.key == K_ESCAPE: self.open=False def update(self): """Updates all window's main attributs.""" self.mouse_click=bool(pygame.mouse.get_pressed()[0]) self.mouse_position=pygame.mouse.get_pos() for event in pygame.event.get(): if event.type == pygame.QUIT: self.open=False if event.type == KEYDOWN: if event.key == K_ESCAPE: self.open=False def pause(self): """Wait for user to click on space.""" while self.open: self.check() keys=pygame.key.get_pressed() if keys[K_SPACE]: break if self.open: time.sleep(self.pause_time) def __call__(self): self.flip() self.pause() def direction(self): """Return keys for arrows pressed. Trigonometric orientation is used.""" keys=pygame.key.get_pressed() return (keys[K_RIGHT],keys[K_UP],keys[K_LEFT],keys[K_DOWN]) def select(self): """Wait for user to click on screen, then return cursor position.""" while self.open: self.check() for event in pygame.event.get(): if event.type == MOUSEBUTTONDOWN and event.button == 1: return (event.pos[0],event.pos[1]) def point(self): """Return cursor position on screen.""" return pygame.mouse.get_pos() def press(self): """Return all keys.""" return pygame.key.get_pressed() def click(self): """Return bool value for clicking on screen.""" return bool(pygame.mouse.get_pressed()[0]) def onclick(self): if self.click() and time.time()-self.last_click>self.click_cool_down: self.last_click=time.time() return True else: return False def flip(self): """Refresh screen.""" pygame.display.flip() def screenshot(self): """Save picture of the surface.""" self.picture_saved+=1 pygame.image.save(self.screen,self.name+"-"+str(self.picture_saved)+".png") def getPicture(self,picture_directory): """Return picture using picture directory.""" return pygame.image.load(picture_directory) def placePicture(self,picture_directory,coordonnates,color=None): """Draw a picture on screen using pygame picture directory and position.""" x,y,sx,sy=coordonnates picture=pygame.image.load(picture_directory) picture=pygame.transform.scale(picture,(sx,sy)) if color is not None: picture=colorize(picture,color) self.screen.blit(picture, position) def centerText(self,message,size=None): """Centers Text on screen.""" sx,sy=self.size if size is None: size=self.text_size l=len(message) letter_size=size/4 x=sx//2-letter_size*l//2 y=sy//2-size/3 return (x,y) def alert(self,message): """Quickly display text on window.""" position=self.centerText(message) self.print(message,position) self.flip() def print(self,text,position,size=None,color=None,font=None): """Display text on screen using position, size, color and font.""" if size is None: size=self.text_size if color is None: color=self.text_color if font is None: font=self.font label = font.render(text, 1, color) self.screen.blit(label, position) def drawRect(self,coordonnates,color): """Draw a rectangle on the screen using color and coordonnates relative to window's fiducials.""" wsx,wsy=self.size wcx,wcy,wcsx,wcsy=self.coordonnates rcx,rcy,rcsx,rcsy=coordonnates x,y=(rcx-wcx,rcy-wcy) w,h=(rcsx*wsx/wcsx,rcsy*wsy/wcsy) pygame.draw.rect(self.screen,color,(x,y,w,h),0) def place(self,position): """Return position relative to window's fiducials.""" wcx,wcy,wcsx,wcsy=self.coordonnates pcx,pcy=position x,y=(rcx-wcx,rcy-wcy) return (x,y) def randomColor(self): """Return random color.""" import random r=random.randint(0,255) g=random.randint(0,255) b=random.randint(0,255) color=(r,g,b) return color def reverseColor(self,color): """Return reverse color.""" r,g,b=color r=255-r g=255-g b=255-b color=(r,g,b) return color def lighten(self,color,luminosity=80): #View later """Return lightened color using color and luminosity percentage.""" r,g,b=color if luminosity>=50: r+=(255-r)*luminosity/100 g+=(255-g)*luminosity/100 b+=(255-b)*luminosity/100 else: r-=r*luminosity/100 g-=g*luminosity/100 b-=b*luminosity/100 color=r,g,b return color def colorize(self,image, color): """Return image colorized""" image = image.copy() image.fill((0,0,0,255),None,pygame.BLEND_RGBA_MULT) image.fill(color[0:3]+(0,),None,pygame.BLEND_RGBA_ADD) return image def wavelengthToRGB(self,wavelength): """Convert wavelength to rgb color type.""" gamma,max_intensity=0.80,255 def adjust(color, factor): if color==0: return 0 else: return round(max_intensity*pow(color*factor,gamma)) if 380<=wavelength<=440: r,g,b=-(wavelength-440)/(440-380),0,1 elif 440<=wavelength<=490: r,g,b=0,(wavelength-440)/(490-440),1 elif 490<=wavelength<=510: r,g,b=0,1,-(wavelength-510)/(510-490) elif 510<=wavelength<=580: r,g,b=(wavelength-510)/(580-510),1,0 elif 580<=wavelength<=645: r,g,b=1,-(wavelength-645)/(645-580),0 elif 645<=wavelength<=780: r,g,b=1,0,0 else: r,g,b=0,0,0 if 380<=wavelength<=420: factor=0.3+0.7*(wavelength-380)/(420-380) elif 420<=wavelength<=701: factor=1 elif 701<=wavelength<=780: factor=0.3+0.7*(780-wavelength)/(780-700) else: factor=0 r,g,b=adjust(r,factor),adjust(g,factor),adjust(b,factor) return (r,g,b) def kill(self): """Quit pygame.""" pygame.quit() def log(self,message): """Print message with window mention.""" text="["+self.name+"] "+message print(text) def __del__(self): """Executed before the window is destroyed.""" self.log("Window has been closed.") if __name__=="__main__": w=Window("Window Prototype") #save(w,"grosse fenetre") #w=load("grosse fenetre") #print(w.lighten(BLUE)) #w.alert("test") w.pause() w.clear() w.alert("je raconte de la merde juste pour avoir une longue chaine de caractere") w.pause() w.kill()