heres the window.py file: from typing import Iterable
import pygame as pg, random, os

from .styles.units import Measure
from .objects import Image
from .global\_data import DATA, on\_update

from .types import Size, Pos
from .styles.colors import Gradient
from .styles.styles\_resolver import resolve\_color
 
# handlers
from .event\_handler import EventHandler
from .time\_handler import TimeHandler

class Window:
 \_\_slots\_\_ = ("size", "pos", "title", "icon", "depth", "vsync", "fullscreen", "resizable", "color", "surface", "clock", "show\_fps", "fps")
 
 # check if an istance of Window is created
 is\_created: bool = False

 def \_\_new\_\_(cls, \*args, \*\*kwargs) -> 'Window':
 r'''
 #### Creates a new Window instance if it doesn't exist
 '''
 if not cls.is\_created:
 cls.is\_created = True
 
 window = object.\_\_new\_\_(cls)
 
 DATA.window = window
 
 # globalize time and event handlers
 DATA.TimeHandler = TimeHandler
 DATA.EventHandler = EventHandler
 return window

 else:
 return DATA.window

 def \_\_init\_\_(self, size: Size | Iterable[Measure] = Size(720, 420), title: str = "", icon: str = "", fps: int = 60,
 show\_fps: bool = False, vsync: bool = False, depth: int = 32, color="black", fullscreen: bool = False,
 resizable: bool = False):

 self.size = size if isinstance(size, Size) else Size(\*size)
 self.pos = Pos(0, 0)
 self.title = title
 self.icon = icon
 self.vsync = vsync
 self.fullscreen = fullscreen
 self.resizable = resizable
 self.color = color
 self.fps = fps
 self.depth = depth
 self.show\_fps = show\_fps

 self.load\_icon(icon)

 # init window
 self.\_\_init()
 def \_\_str\_\_(self):
 return ""

 # -----------------------------------------------------------------------------

 def load\_icon(self, icon: str):
 r'''
 #### Loads an icon for the window
 - `icon` : path to the icon
 '''
 self.icon = icon
 if icon == "":
 try:
 path = os.path.join(os.path.dirname(
 \_\_file\_\_), "assets", "img", "icon.jpg")
 self.icon = path
 pg.display.set\_icon(pg.image.load(self.icon))

 except FileNotFoundError:
 pass

 return self

 def shake(self, force=5):
 r'''
 #### Shakes the window
 - `force` : force of the shake
 '''
 if force <= 0:
 return

 force = int(force)
 x = random.randint(-force, force)
 y = random.randint(-force, force)
 self.surface.blit(self.surface, (x, y))
 return self

 def get\_fps(self):
 r'''
 #### Returns the current window FPS
 '''
 return self.clock.get\_fps()

 def check\_events(self):
 r'''
 #### Checks and Manage the events, should be called in the main loop
 '''
 TimeHandler.check()
 EventHandler.check()

 def \_\_resolve\_size(self, size: Size):
 if self.fullscreen:
 self.\_\_size = Size(size)
 self.size = pg.display.list\_modes()[0]
 return

 else:
 # returns to size before fullscreen
 try:
 self.size = self.\_\_size
 return
 except:
 pass

 if size == []:
 raise Exception("You must specify a size for the screen")

 elif len(size) == 1:
 if size[0] in ("max", "full", "100%"):
 self.size = pg.display.list\_modes()[0]
 else:
 raise Exception(
 "Screen size should \"max\" || \"full\" or list [width, height] ")

 elif len(size) == 2:
 if size[0] in ("max", "full", "100%"):
 self.size[0] = pg.display.list\_modes()[0][0]
 elif size[1] in ("max", "full", "100%"):
 self.size[1] = pg.display.list\_modes()[0][1]
 else:
 self.size = Size(size[0], size[1])

 def \_\_init(self):
 r'''
 #### Initializes the window, is called automatically
 '''

 pg.init()
 self.\_\_resolve\_size(self.size)

 if self.resizable and self.fullscreen:
 raise ValueError("You can't have resize and fullscreen at the same time")

 display\_type = 0
 if self.fullscreen:
 display\_type = pg.FULLSCREEN

 elif self.resizable:
 display\_type = pg.RESIZABLE

 self.surface = pg.display.set\_mode(self.size, display\_type, self.depth, 0, self.vsync)

 pg.display.set\_caption(self.title)
 if self.icon != "":
 pg.display.set\_icon(pg.image.load(self.icon))
 
 self.clock = pg.time.Clock()
 
 def update(self):
 r'''
 #### Updates the Window
 '''

 if self.show\_fps:
 pg.display.set\_caption(
 f"{self.title} FPS : " + f"{int(self.clock.get\_fps())}")

 pg.display.update()
 
 self.clock.tick(self.fps)

 # call on update events
 for func in on\_update():
 func()
 
 def quit(self):
 r'''
 #### Quits the App (Ends the window)
 '''
 pg.quit()
 quit()

 def fill(self, color=None, pos: list = [0, 0], size: list = [0, 0]):
 r'''
 #### Fill the Window with a `color` or `gradient`
 - `color` : color to fill the Window with, or `Gradient` or `Image` (Optional)
 - `pos` : position of the fill start (Optional)
 - `size` : size of the fill (Optional)
 '''
 
 color = self.color if color == None else color
 
 if size == [0, 0]:
 size = self.size

 if isinstance(color, Gradient) or isinstance(color, Image):
 color.draw()

 else:
 color = resolve\_color(color)
 pg.draw.rect(self.surface, color, pg.Rect(pos, size))
 
 def toggle\_fullscreen(self):
 r'''
 #### Toggles the fullscreen mode
 '''
 self.fullscreen = not self.fullscreen
 self.\_\_init()
다음은 window.py 파일입니다: 입력에서 이터러블을 가져옵니다.pygame을 pg, random, os로 가져옵니다..styles.units에서 Measure를 가져옵니다..objects에서 이미지 임포트.global\_data에서 DATA, on\_update를 가져옵니다..types에서 크기, 위치 가져오기.styles.colors에서 그라디언트.styles.styles\_resolver에서 resolve\_color를 가져옵니다. # 핸들러.event\_handler에서 EventHandler를 가져옵니다..time\_handler에서 TimeHandler를 임포트합니다.클래스 Window: \_\_slots\_\_ = ("size", "pos", "title", "icon", "depth", "vsync", "fullscreen", "resizable", "color", "surface", "clock", "show\_fps", "fps")  # 창 인스턴스가 생성되었는지 확인합니다. is\_created: bool = False def \_\_new\_\_(cls, \*args, \*\*kwargs) -> 'Window': r''' #### Window 인스턴스가 존재하지 않는 경우 새 Window 인스턴스를 만듭니다. ''' 그렇지 않으면 새 창 인스턴스를 만듭니다: cls.is\_created = True  window = object.\_\_new\_\_(cls)  DATA.window = window  # 시간 및 이벤트 핸들러 전역화 DATA.TimeHandler = 시간 핸들러 DATA.EventHandler = 이벤트 핸들러 창 반환 else: 반환 DATA.window def \_\_init\_\_(self, size: Size | Iterable[Measure] = Size(720, 420), title: str = "", icon: str = "", fps: int = 60, show\_fps: bool = False, vsync: bool = False, depth: int = 32, color="black", fullscreen: bool = False, resizable: bool = False): self.size = size if isinstance(크기, 크기) else Size(\*크기) self.pos = Pos(0, 0) self.title = title self.icon = 아이콘 self.vsync = vsync self.fullscreen = 전체화면 self.resizable = 크기 조정 가능 self.color = 색상 self.fps = fps self.depth = 깊이 self.show\_fps = show\_fps self.load\_icon(아이콘) # 창 초기화 self.\_\_init() def \_\_str\_\_(self): return "" # ----------------------------------------------------------------------------- def load\_icon(self, icon: str): r''' #### 창에 대한 아이콘을 로드합니다. - `icon` : 아이콘 경로 ''' self.icon = 아이콘 if icon == "": try: path = os.path.join(os.path.dirname( \_\_file\_\_), "assets", "img", "icon.jpg") self.icon = 경로 pg.display.set\_icon(pg.image.load(self.icon)) FileNotFoundError를 제외합니다: pass 반환 self def shake(self, force=5): r''' #### 창을 흔듭니다. - `force` : 흔들기의 힘 ''' if force <= 0: 반환 force = int(force) x = random.randint(-force, force) y = random.randint(-force, force) self.surface.blit(self.surface, (x, y)) 반환 self def get\_fps(self): r''' #### 현재 창 FPS를 반환합니다. ''' return self.clock.get\_fps() def check\_events(self): r''' #### 이벤트를 확인하고 관리하며, 메인 루프에서 호출되어야 합니다. ''' TimeHandler.check() 이벤트 핸들러.check() def \_\_resolve\_size(self, size: 크기): if self.fullscreen: self.\_\_size = Size(size) self.size = pg.display.list\_modes()[0] return else: # 전체화면 이전 크기로 반환 try: self.size = self.\_\_size 반환 예외: pass size == []: raise Exception("화면 크기를 지정해야 합니다") elif len(size) == 1: if size[0] in ("max", "full", "100%"): self.size = pg.display.list\_modes()[0] else: 예외 발생( "화면 크기는 \"최대\" || \"전체\" 또는 목록 [너비, 높이] ") elif len(size) == 2: if size[0] in ("max", "full", "100%"): self.size[0] = pg.display.list\_modes()[0][0] elif size[1] in ("max", "full", "100%"): self.size[1] = pg.display.list\_modes()[0][1] else: self.size = Size(size[0], size[1]) def \_\_init(self): r''' #### 창을 초기화하고, 자동으로 호출됩니다. ''' pg.init() self.\_\_resolve\_size(self.size) self.resizable 및 self.fullscreen인 경우: ValueError("크기 조정과 전체 화면을 동시에 가질 수 없습니다") 발생 display\_type = 0 if self.fullscreen: display\_type = pg.FULLSCREEN elif self.resizable: display\_type = pg.RESIZABLE self.surface = pg.display.set\_mode(self.size, display\_type, self.depth, 0, self.vsync) pg.display.set\_caption(self.title) if self.icon != "": pg.display.set\_icon(pg.image.load(self.icon))  self.clock = pg.time.Clock()  def update(self): r''' #### 창을 업데이트합니다. ''' if self.show\_fps: pg.display.set\_caption( f"{self.title} FPS : " + f"{int(self.clock.get\_fps())}") pg.display.update()  self.clock.tick(self.fps) # 업데이트 이벤트 호출 for func in on\_update(): func()  def quit(self): r''' #### 앱을 종료합니다(창을 종료합니다). ''' pg.quit() quit() def fill(self, color=None, pos: list = [0, 0], size: list = [0, 0]): r''' #### `색상` 또는 `그래디언트`로 창을 채웁니다. - color` : 창을 채울 색상, 또는 `그라데이션` 또는 `이미지` (선택 사항) - pos` : 채우기 시작 위치 (선택 사항) - 크기` : 채우기 크기 (선택 사항) '''  color = self.color if color == None else color  size == [0, 0]: size = self.size isinstance(color, 그라디언트) 또는 isinstance(color, 이미지): color.draw() else: color = resolve\_color(color) pg.draw.rect(self.surface, color, pg.Rect(pos, size))  def toggle\_fullscreen(self): r''' #### 전체화면 모드를 전환합니다. ''' self.fullscreen = not self.fullscreen self.\_