From a7808f6aacf9702719a2c5f9ad78a307d6dc70e3 Mon Sep 17 00:00:00 2001 From: themixray <35273590+themixray@users.noreply.github.com> Date: Wed, 10 Nov 2021 21:13:29 +0300 Subject: [PATCH] Add files via upload --- build/lib/pygwin/__init__.py | 15 + build/lib/pygwin/_pg.py | 16 + build/lib/pygwin/_win.py | 138 +++++ build/lib/pygwin/console.py | 62 +++ build/lib/pygwin/font.py | 43 ++ build/lib/pygwin/gamepad.py | 111 ++++ build/lib/pygwin/image.py | 44 ++ build/lib/pygwin/keyboard.py | 10 + build/lib/pygwin/mixer.py | 92 ++++ build/lib/pygwin/mouse.py | 22 + build/lib/pygwin/rect.py | 34 ++ build/lib/pygwin/surface.py | 142 +++++ build/lib/pygwin/tray.py | 49 ++ build/lib/pygwin/ui.py | 651 +++++++++++++++++++++++ dist/pygwin-0.0.1-py3.7.egg | Bin 0 -> 39275 bytes dist/pygwin0-0.0.1-py3-none-any.whl | Bin 2055 -> 2062 bytes dist/pygwin0-0.0.1.tar.gz | Bin 1815 -> 1832 bytes examples/game.py | 42 ++ examples/ui.py | 38 ++ setup.bat | 4 +- setup.py | 5 + src/pygwin.egg-info/PKG-INFO | 19 + src/pygwin.egg-info/SOURCES.txt | 23 + src/pygwin.egg-info/dependency_links.txt | 1 + src/pygwin.egg-info/requires.txt | 6 + src/pygwin.egg-info/top_level.txt | 1 + src/pygwin/rect.py | 5 +- src/pygwin0.egg-info/PKG-INFO | 1 + 28 files changed, 1571 insertions(+), 3 deletions(-) create mode 100644 build/lib/pygwin/__init__.py create mode 100644 build/lib/pygwin/_pg.py create mode 100644 build/lib/pygwin/_win.py create mode 100644 build/lib/pygwin/console.py create mode 100644 build/lib/pygwin/font.py create mode 100644 build/lib/pygwin/gamepad.py create mode 100644 build/lib/pygwin/image.py create mode 100644 build/lib/pygwin/keyboard.py create mode 100644 build/lib/pygwin/mixer.py create mode 100644 build/lib/pygwin/mouse.py create mode 100644 build/lib/pygwin/rect.py create mode 100644 build/lib/pygwin/surface.py create mode 100644 build/lib/pygwin/tray.py create mode 100644 build/lib/pygwin/ui.py create mode 100644 dist/pygwin-0.0.1-py3.7.egg create mode 100644 examples/game.py create mode 100644 examples/ui.py create mode 100644 setup.py create mode 100644 src/pygwin.egg-info/PKG-INFO create mode 100644 src/pygwin.egg-info/SOURCES.txt create mode 100644 src/pygwin.egg-info/dependency_links.txt create mode 100644 src/pygwin.egg-info/requires.txt create mode 100644 src/pygwin.egg-info/top_level.txt diff --git a/build/lib/pygwin/__init__.py b/build/lib/pygwin/__init__.py new file mode 100644 index 0000000..2d0e236 --- /dev/null +++ b/build/lib/pygwin/__init__.py @@ -0,0 +1,15 @@ +from pygwin.surface import surface +import pygwin.keyboard as keyboard +from pygwin.console import console +import pygwin.gamepad as _gp +import pygwin.mouse as mouse +from pygwin.rect import rect +import pygwin.image as image +import pygwin.mixer as mixer +from pygwin.tray import tray +from pygame.locals import * +import pygwin.font as font +from pygwin._win import * +from pygwin._pg import pg +import pygwin.ui as ui +gamepad = _gp.gamepad(pg) diff --git a/build/lib/pygwin/_pg.py b/build/lib/pygwin/_pg.py new file mode 100644 index 0000000..b8aa9e7 --- /dev/null +++ b/build/lib/pygwin/_pg.py @@ -0,0 +1,16 @@ +from contextlib import contextmanager as _cm +import os as _os +import sys as _sys + +@_cm +def _suppress_stdout(): + with open(_os.devnull, "w") as devnull: + old_stdout = _sys.stdout + _sys.stdout = devnull + try: + yield + finally: + _sys.stdout = old_stdout +with _suppress_stdout(): + import pygame as pg + pg.init() diff --git a/build/lib/pygwin/_win.py b/build/lib/pygwin/_win.py new file mode 100644 index 0000000..1faba29 --- /dev/null +++ b/build/lib/pygwin/_win.py @@ -0,0 +1,138 @@ +from pygwin.surface import surface as _surface +from pygwin.tray import tray as _tray +from datetime import datetime as _dt +from pygwin.image import save as _s +from pygwin._pg import pg as _pg +import pygwin.image as _img +import win32job as _w32j +import win32api as _w32a +import win32con as _w32c +import win32gui as _w32g +import requests as _req +import tempfile as _tf +import pickle as _p + +class win(_surface): + def __init__(self, iconpath=None): + self._orig = _pg.display.get_surface() + super().__init__(self._orig.get_size()) + self._orig = _pg.display.get_surface() + self._clock = _pg.time.Clock() + self._withfps = False + self._iconpath = iconpath + if iconpath != None: + self.tray = _tray(self.title,iconpath) + def update(self, fps=-1): + if fps != -1: + self._clock.tick(fps) + self._withfps = True + _pg.display.update() + def title(): + def fget(self): + return _pg.display.get_caption()[0] + def fset(self, value): + if type(value) != str: + return + _pg.display.set_caption(value) + def fdel(self): + pass + return locals() + title = property(**title()) + def icon(value): + _pg.display.set_icon(_pg.image.load(value)) + self._iconpath = iconpath + def size(): + def fget(self): + return _pg.display.get_window_size() + def fset(self, value): + if type(value) in [list,tuple]: + return + _pg.display.set_mode(value) + def fdel(self): + pass + return locals() + size = property(**size()) + def fullscreen(self): + _pg.display.toogle_fullscreen() + def close(self): + _pg.display.quit() + _w32g.PostMessage(self.hwnd, _w32c.WM_CLOSE, 0, 0) + self.tray.stop() + def focus(self): + self.hide() + self.show() + _w32g.BringWindowToTop(self.hwnd) + _w32g.ShowWindow(self.hwnd, _w32c.SW_SHOWNORMAL) + _w32g.SetForegroundWindow(self.hwnd) + def unfocus(self): + pass + def hide(self): + _w32g.ShowWindow(self.hwnd, _w32c.SW_HIDE) + def show(self): + _w32g.ShowWindow(self.hwnd, _w32c.SW_SHOW) + def move(self, x, y): + rect = _w32g.GetWindowRect(self.hwnd) + _w32g.MoveWindow(self.hwnd, x, y, rect[2]-x, rect[3]-y, 0) + def screenshot(self, path): + _s(self._orig, path) + return path + @property + def position(self): + rect = _w32g.GetWindowRect(self.hwnd) + x = rect[0] + y = rect[1] + return (x, y) + @property + def rawFps(self): + if self._withfps: + return self._clock.get_fps() + else: + return float(f'2010.{_dt.now().year}') + @property + def fps(self): + return int(self.rawFps) + @property + def hwnd(self): + return _pg.display.get_wm_info()['window'] + @property + def visible(self): + return _w32g.IsWindowVisible(self._win) + +def create(title=None, size=(0,0), icon=None, resizable=False, noframe=False): + screen = _pg.display.set_mode(size) + if resizable: + screen = _pg.display.set_mode(size,_pg.RESIZABLE) + if noframe: + screen = _pg.display.set_mode(size,_pg.NOFRAME) + else: + if title != None: + _pg.display.set_caption(title) + if icon != None: + _pg.display.set_icon(_pg.image.load(icon)) + return win(icon) + +def ramLimit(memory_limit): + hjob = _w32j.CreateJobObject(None,job_name) + if breakaway: + info = _w32j.QueryInformationJobObject(hjob,_w32j.JobObjectExtendedLimitInformation) + if breakaway=='silent':info['BasicLimitInformation']['LimitFlags']|=(_w32j.JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK) + else:info['BasicLimitInformation']['LimitFlags']|=(_w32j.JOB_OBJECT_LIMIT_BREAKAWAY_OK) + _w32j.SetInformationJobObject(hjob,_w32j.JobObjectExtendedLimitInformation,info) + hprocess = _w32a.GetCurrentProcess() + try:_w32j.AssignProcessToJobObject(hjob, hprocess);g_hjob=hjob + except _w32j.error as e: + if e.winerror!=winerror.ERROR_ACCESS_DENIED:raise + elif sys.getwindowsversion()>=(6,2):raise + elif _w32j.IsProcessInJob(hprocess,None):raise + warnings.warn('The process is already in a job. Nested jobs are not supported prior to Windows 8.') + info=_w32j.QueryInformationJobObject(g_hjob,_w32j.JobObjectExtendedLimitInformation) + info['ProcessMemoryLimit']=memory_limit + info['BasicLimitInformation']['LimitFlags']|=(_w32j.JOB_OBJECT_LIMIT_PROCESS_MEMORY) + _w32j.SetInformationJobObject(g_hjob,_w32j.JobObjectExtendedLimitInformation,info) + +def close(): + _pg.quit() + quit() + +def getEvents(): + return _pg.event.get() diff --git a/build/lib/pygwin/console.py b/build/lib/pygwin/console.py new file mode 100644 index 0000000..fdc806c --- /dev/null +++ b/build/lib/pygwin/console.py @@ -0,0 +1,62 @@ +import win32console as w32con +import win32con as w32c +import win32gui as w32g +import pyautogui as pag + +class console: + def __init__(self): + self._hwnd = w32con.GetConsoleWindow() + @property + def hwnd(self): + return self._hwnd + def focus(self): + self.hide() + self.show() + w32g.BringWindowToTop(self.hwnd) + w32g.ShowWindow(self.hwnd, w32c.SW_SHOWNORMAL) + w32g.SetForegroundWindow(self.hwnd) + def unfocus(self): + pass + def hide(self): + w32g.ShowWindow(self.hwnd, w32c.SW_HIDE) + def show(self): + w32g.ShowWindow(self.hwnd, w32c.SW_SHOW) + def move(self, x, y): + w32g.SetWindowPos(self.hwnd, x, y, self.size[0], self.size[1]) + def resize(self, width, height): + w32g.SetWindowPos(self.hwnd, self.position[0], self.position[1], width, height) + def minimize(self): + w32g.ShowWindow(hwnd, w32c.SW_MINIMIZE) + return self.size + def maximize(self): + w32g.ShowWindow(hwnd, w32c.SW_MAXIMIZE) + return self.size + def title(): + def fget(self): + return w32con.GetConsoleTitle() + def fset(self, value): + w32con.SetConsoleTitle(str(value)) + def fdel(self): + pass + return locals() + title = property(**title()) + @property + def visible(self): + return w32g.IsWindowVisible(self.hwnd) + @property + def position(self): + rect = w32g.GetWindowRect(self.hwnd) + x = rect[0]+7 + y = rect[1] + return (x, y) + @property + def size(self): + rect = w32g.GetWindowRect(self.hwnd) + w = rect[2] - self.position[0]-7 + h = rect[3] - self.position[1]-7 + return (w, h) + def screenshot(self, path): + rect = self.position+self.size + self.focus() + pag.screenshot(path, region=rect) + return path diff --git a/build/lib/pygwin/font.py b/build/lib/pygwin/font.py new file mode 100644 index 0000000..4532537 --- /dev/null +++ b/build/lib/pygwin/font.py @@ -0,0 +1,43 @@ +from pygwin.surface import surface as _surface +from pygwin._pg import pg as _pg + +class font: + def __init__(self, path): + self._path = path + def _font(self, size): + return _pg.font.Font(self._path,size) + def render(self, text, size, color, newLineSpace=5, + italic=False, bold=False, underline=False): + text = str(text) + font = self._font(size) + font.set_italic(italic) + font.set_bold(bold) + font.set_underline(underline) + if text.replace('\n', '') != text: + text = text.split('\n') + surf = _pg.Surface([font.size(max(text,key=lambda x:font.size(x)[0]))[0], + (font.size('123')[1]+newLineSpace)*len(text)],_pg.SRCALPHA) + y = 0 + for i in text: + r = font.render(i, True, color) + surf.blit(r, (0, y)) + y += font.size(i)[1] + if i != text[-1]: + y += newLineSpace + else: + surf = font.render(text, True, color) + surface = _surface(surf.get_size()) + surface._surface_orig = surf + return surface + def size(self, text, size, newLineSpace=5, + italic=False, bold=False, underline=False): + return self.render(text, size, (255,255,255), + newLineSpace=newLineSpace, + italic=italic, bold=bold, + underline=underline).size + +class sysFont(font): + def __init__(self, name): + self._path = _pg.font.match_font(name) + +defaultFont = font(_pg.font.get_default_font()) diff --git a/build/lib/pygwin/gamepad.py b/build/lib/pygwin/gamepad.py new file mode 100644 index 0000000..7f585ec --- /dev/null +++ b/build/lib/pygwin/gamepad.py @@ -0,0 +1,111 @@ +import inputs as _inputs +import threading as _threading +import time as _time + +class gamepad: + def __init__(self, pygame): + self._lasty = '' + self._lastx = '' + self.founded = False + self._buttons = {'left-joystick': False, + 'right-joystick': False, + 'north': False, + 'south': False, + 'west': False, + 'east': False, + 'l1': False, + 'l2': False, + 'r1': False, + 'r2': False, + 'up': False, + 'down': False, + 'left': False, + 'right': False, + 'start': False, + 'select': False} + self.leftJoystick = [0, 0] + self.rightJoystick = [0, 0] + self._pygame = pygame + self._start() + def _tick(self): + events = _inputs.get_gamepad() + if not self._pygame.display.get_active(): + return + self.founded = True + if events: + for event in events: + if event.code == 'ABS_X': + self.leftJoystick[0] = event.state + elif event.code == 'ABS_Y': + self.leftJoystick[1] = event.state + elif event.code == 'ABS_RY': + self.rightJoystick[1] = event.state + elif event.code == 'ABS_RX': + self.rightJoystick[0] = event.state + elif event.code == 'BTN_THUMBL': + self._buttons['left-joystick'] = event.state + elif event.code == 'BTN_THUMBR': + self._buttons['right-joystick'] = event.state + elif event.code == 'BTN_TL': + self._buttons['l1'] = event.state + elif event.code == 'BTN_TR': + self._buttons['r1'] = event.state + elif event.code == 'ABS_Z': + if event.state == 255: + self._buttons['l2'] = 1 + elif event.state == 0: + self._buttons['l2'] = 0 + elif event.code == 'ABS_RZ': + if event.state == 255: + self._buttons['r2'] = 1 + elif event.state == 0: + self._buttons['r2'] = 0 + elif event.code == 'BTN_WEST': + self._buttons['west'] = event.state + elif event.code == 'BTN_NORTH': + self._buttons['north'] = event.state + elif event.code == 'BTN_EAST': + self._buttons['east'] = event.state + elif event.code == 'BTN_SOUTH': + self._buttons['south'] = event.state + elif event.code == 'ABS_HAT0Y': + if event.state == 1: + self._buttons['down'] = True + self._lasty = 'down' + elif event.state == -1: + self._buttons['up'] = True + self._lasty = 'up' + else: + self._buttons[self._lasty] = False + elif event.code == 'ABS_HAT0X': + if event.state == 1: + self._buttons['right'] = True + self._lastx = 'right' + elif event.state == -1: + self._buttons['left'] = True + self._lastx = 'left' + else: + self._buttons[self._lastx] = False + elif event.code == 'BTN_START': + self._buttons['select'] = event.state + elif event.code == 'BTN_SELECT': + self._buttons['start'] = event.state + def _start(self): + self.founded = False + self._started = True + def ttcb(self): + while self._started: + self._tick() + _threading.Thread(target=lambda:ttcb(self),daemon=True).start() + def close(self): + self._started = False + def isPressed(self, btn): + return btn in self._buttons + def reset(self): + self._lasty = '' + self._lastx = '' + self._buttons = [] + self.leftJoystick = [0, 0] + self.rightJoystick = [0, 0] + def getPressed(self): + return self._buttons diff --git a/build/lib/pygwin/image.py b/build/lib/pygwin/image.py new file mode 100644 index 0000000..b61d345 --- /dev/null +++ b/build/lib/pygwin/image.py @@ -0,0 +1,44 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _surface +from PIL import Image as _im +import pickle as _p +import bz2 as _bz2 + +def load(path): + if path.endswith('.gif'): + im = _im.open(path) + surfs = [] + for i in range(im.n_frames): + im.seek(i) + image = _pg.image.fromstring(im.tobytes(),im.size,im.mode) + surf = _surface(image.get_size()) + surf._surface_orig = image + surfs.append(surf) + return surfs + else: + im = _im.open(path.encode('utf8').decode('utf8')) + image = _pg.image.fromstring(im.tobytes(),im.size,im.mode) + surf = _surface(im.size) + surf.blit(image,(0,0)) + return surf + +def save(surface, dest): + if type(surface) == _surface: + orig = surface._surface_orig + else: + orig = surface._orig + _pg.image.save_extended(orig, dest) + +def toBytes(surface): + try: + orig = surface._surface_orig + except: + orig = surface._orig + return _bz2.compress(_p.dumps([_pg.image.tostring(orig,"RGBA"),list(surface.size)])) + +def fromBytes(bytes): + string = _p.loads(_bz2.decompress(bytes)) + surf = _pg.image.fromstring(string[0],tuple(string[1]),"RGBA") + surface = _surface(tuple(string[1])) + surface.blit(surf,(0,0)) + return surface diff --git a/build/lib/pygwin/keyboard.py b/build/lib/pygwin/keyboard.py new file mode 100644 index 0000000..9d55d95 --- /dev/null +++ b/build/lib/pygwin/keyboard.py @@ -0,0 +1,10 @@ +from pygwin._pg import pg as _pg + +def getPressed(): + fkeys = {} + keys = _pg.key.get_pressed() + for i in range(len(keys)): + fkeys.update({_pg.key.name(i):keys[i]}) + return fkeys +def isPressed(key): + return getPressed()[key] diff --git a/build/lib/pygwin/mixer.py b/build/lib/pygwin/mixer.py new file mode 100644 index 0000000..a33522b --- /dev/null +++ b/build/lib/pygwin/mixer.py @@ -0,0 +1,92 @@ +from pygwin._pg import pg as _pg +import os as _os +import tempfile as _tf + +ffmpeg = None + +class sound: + def __init__(self, path): + if not (path.endswith('.wav') or path.endswith('.ogg')): + try: + from pydub import AudioSegment as _as + if ffmpeg != None: + _as.ffmpeg = ffmpeg + _as.converter = ffmpeg + sound = _as.from_file(path, _os.path.splitext(path)[1]) + path = _tf.mkstemp('.wav') + sound.export(path, format="wav") + except: + print('Set ffmpeg to path so that you don'+\ + "'t have to convert the file to "+\ + '".wav". If you have installed, but the error still appears, write down the path to ffmpeg.exe in plugin.ffmpeg.') + self._sound = _pg.mixer.Sound(path) + def play(self): + self._sound.play() + def stop(self): + self._sound.stop() + def volume(): + def fget(self): + return self._sound.get_volume() + def fset(self, value): + if type(value) == int: + self._sound.set_volume(value) + def fdel(self): + pass + return locals() + volume = property(**volume()) + @property + def length(self): + return self._sound.get_length() + +class music: + def __init__(self, path): + if path.endswith('.wav') or path.endswith('.ogg'): + self._path = path + else: + try: + from pydub import AudioSegment as _as + if ffmpeg != None: + _as.ffmpeg = ffmpeg + _as.converter = ffmpeg + sound = _as.from_file(path, _os.path.splitext(path)[1]) + path = _tf.mkstemp('.wav') + sound.export(path, format="wav") + except: + print('Set ffmpeg to path so that you don'+\ + "'t have to convert the file to "+\ + '".wav". If you have installed, but the error still appears, write down the path to ffmpeg.exe in plugin.ffmpeg.') + _pg.mixer.music.load(path) + def play(self, loops=0): + _pg.mixer.music.play(loops) + def stop(self): + _pg.mixer.music.stop() + def restart(self): + _pg.mixer.music.rewind() + def pause(self): + _pg.mixer.music.pause() + def release(self): + _pg.mixer.music.unpause() + def queue(self): + _pg.mixer.music.queue(self._path) + + def volume(): + def fget(self): + return _pg.mixer.music.get_volume() + def fset(self, value): + if type(value) == int: + _pg.mixer.music.set_volume(value) + def fdel(self): + pass + return locals() + volume = property(**volume()) + + def pos(): + def fget(self): + return _pg.mixer.music.get_pos() + def fset(self, value): + if type(value) == int: + _pg.mixer.music.set_pos(value) + def fdel(self): + pass + return locals() + pos = property(**pos()) diff --git a/build/lib/pygwin/mouse.py b/build/lib/pygwin/mouse.py new file mode 100644 index 0000000..48da5fd --- /dev/null +++ b/build/lib/pygwin/mouse.py @@ -0,0 +1,22 @@ +from pygwin._pg import pg as _pg + +def getPressed(): + orig = _pg.mouse.get_pressed(3) + return {'left':orig[0],'middle':orig[1],'right':orig[2]} +def isPressed(x): + return getPressed()[x] +def setPosition(x): + _pg.mouse.set_pos(x) +def getPosition(): + return _pg.mouse.get_pos() +def setVisible(x): + _pg.mouse.set_visible(x) +def getVisible(): + return _pg.mouse.get_visible() +def getCursor(): + return _pg.mouse.get_cursor() +def setCursor(size, hotspot=None, xormasks=None, andmasks=None): + if hotspot == None and xormasks == None and andmasks == None: + _pg.mouse.set_system_cursor(size) + else: + _pg.mouse.set_cursor(size, hotspot, xormasks, andmasks) diff --git a/build/lib/pygwin/rect.py b/build/lib/pygwin/rect.py new file mode 100644 index 0000000..3e125fa --- /dev/null +++ b/build/lib/pygwin/rect.py @@ -0,0 +1,34 @@ +from pygwin._pg import pg + +class rect: + def __init__(self,x,y,w,h): + self.x = x + self.y = y + self.w = w + self.h = h + self._rect = pg.Rect(x,y,w,h) + def width(): + def fget(self): + return self.w + def fset(self, value): + self.w = value + def fdel(self): + pass + return locals() + width = property(**width()) + def height(): + def fget(self): + return self.h + def fset(self, value): + self.h = value + def fdel(self): + pass + return locals() + height = property(**height()) + def collide(self, x): + try: + return self._rect.colliderect(x._rect_rect) + except: + return self._rect.colliderect(x._rect) + def contains(self, x, y): + return self._rect.collidepoint(x,y) diff --git a/build/lib/pygwin/surface.py b/build/lib/pygwin/surface.py new file mode 100644 index 0000000..dbe8fa4 --- /dev/null +++ b/build/lib/pygwin/surface.py @@ -0,0 +1,142 @@ +from pygwin.rect import rect as _r +from pygwin._pg import pg as _pg + +class surface: + def __init__(self, size): + self._size = size + self._orig = _pg.Surface(size, _pg.SRCALPHA) + @property + def pixels(self): + pixels = [] + pxls = _pg.PixelArray(self._orig) + for x in range(self.size[0]): + pixels.append([]) + for y in range(self.size[1]): + pixels[x].append(pxls[x, y]) + return pixels + @property + def size(self): + return self._size + def rect(self, x=0, y=0, center=[]): + if center == []: + return _r(x, y, self.size[0], self.size[1]) + else: + return _r(center[0]-(self.size[0]/2), + center[1]-(self.size[1]/2), + self.size[0], self.size[1]) + def copy(self): + surf = surface(self._size) + surf._surface_orig = self._orig + surf._surface_size = self._size + return surf + def getPixel(self, x, y): + return self._orig.get_at((x,y)) + def setPixel(self, x, y, color): + self._orig.set_at((x,y),color) + return self.copy() + def blit(self, surf, xy): + if type(surf) != surface and type(surf) != _pg.Surface: + from pygwin.font import defaultFont as _df + surf = _df.render(surf, 25, (0,0,0)) + try: + self._orig.blit(surf._surface_orig, xy) + except: + try: + self._orig.blit(surf._orig, xy) + except: + self._orig.blit(surf, xy) + return self.copy() + def fill(self, color): + self._orig.fill(color) + return self.copy() + def crop(self, rect): + self._orig = self._orig.subsurface((rect.x,rect.y,rect.w,rect.h)) + self._size = self._orig.get_size() + return self.copy() + def scale(self, size, smooth=False): + if not smooth: + self._orig = _pg.transform.scale(self._orig, size) + else: + self._orig = _pg.transform.smoothscale(self._orig, size) + self._size = self._orig.get_size() + return self.copy() + def rotate(self, angle): + self._orig = _pg.transform.rotate(self._orig, angle) + self._size = self._orig.get_size() + return self.copy() + def flip(self, x, y): + self._orig = _pg.transform.flip(self._orig, x, y) + return self.copy() + def blur(self, amt): + if amt < 0:return self.copy() + scale = (int(self._orig.get_width()*(amt+1)), + int(self._orig.get_height()*(amt+1))) + size = self._orig.get_size() + self._orig = _pg.transform.smoothscale(self._orig,scale) + self._orig = _pg.transform.smoothscale(self._orig,size) + return self.copy() + class _draw: + def __init__(self,surface): + self._surf = surface + def rect(self,color,rect, + width=0,borderRadius=0, + borderTopLeftRadius=-1, + borderTopRightRadius=-1, + borderBottomLeftRadius=-1, + borderBottomRightRadius=-1): + try: + orig = self._surf._surface_orig + except: + orig = self._surf._orig + _pg.draw.rect(orig,color,_pg.Rect(rect.x,rect.y,rect.w,rect.h), + width,borderRadius,borderTopLeftRadius, + borderTopRightRadius,borderBottomLeftRadius, + borderBottomRightRadius) + return self._surf.copy() + def polygon(self, color, points, width=0): + try: + orig = self._surf._surface_orig + except: + orig = self._surf._orig + _pg.draw.polygon(orig,color,points,width) + return self._surf.copy() + def circle(self,color,center, + radius,width=0, + drawTopLeft=1, + drawTopRight=1, + drawBottomLeft=1, + drawBottomRight=1): + try: + orig = self._surf._surface_orig + except: + orig = self._surf._orig + _pg.draw.circle(orig,color,center,radius, + width,drawTopRight,drawTopLeft, + drawBottomLeft,drawBottomRight) + return self._surf.copy() + def ellipse(self,color,rect,width=0): + try: + orig = self._surf._surface_orig + except: + orig = self._surf._orig + _pg.draw.ellipse(orig,color,_pg.Rect(rect.x,rect.y,rect.w,rect.h),width) + return self._surf.copy() + def line(self,color,start,end,width=1): + try: + orig = self._surf._surface_orig + except: + orig = self._surf._orig + _pg.draw.line(orig,color,start,end,width) + return self._surf.copy() + def arc(self,color,rect,startAngle,stopAngle,width=1): + try: + orig = self._surf._surface_orig + except: + orig = self._surf._orig + _pg.draw.arc(orig,color, + _pg.Rect(rect.x,rect.y,rect.w,rect.h), + startAngle,stopAngle,width) + return self._surf.copy() + @property + def draw(self): + return self._draw(self) diff --git a/build/lib/pygwin/tray.py b/build/lib/pygwin/tray.py new file mode 100644 index 0000000..27ba6ac --- /dev/null +++ b/build/lib/pygwin/tray.py @@ -0,0 +1,49 @@ +import threading +import wx +import wx.adv +from pygwin._pg import pg +import copy + +class tray(wx.adv.TaskBarIcon): + def __init__(self, tooltip, iconpath): + class App(wx.App): + def OnInit(self): + self.frame = wx.Frame(None) + self.SetTopWindow(self.frame) + return True + self._app = App(False) + self.frame = self._app.frame + super().__init__() + self._tooltip = tooltip + self._iconpath = iconpath + self.setIcon(iconpath) + self._menu = wx.Menu() + def CreatePopupMenu(self): + return self._menu + def GetPopupMenu(self): + return self._menu + def setIcon(self, path): + self._bicon = wx.Icon(wx.Bitmap(path)) + self.SetIcon(self._bicon, self._tooltip) + def setTooltip(self, tooltip): + self.SetIcon(self._bicon, tooltip) + self._tooltip = tooltip + def onLeftMouseButton(self): + pass + def addSeparator(self): + self._menu.AppendSeparator() + def addCommand(self,text,func=lambda:None): + item = wx.MenuItem(self._menu,-1,text) + self._menu.Bind(wx.EVT_MENU, + lambda x:func(), + id=item.GetId()) + self._menu.Append(item) + def start(self, thread=True): + cbotld = lambda x:self.onLeftMouseButton() + self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN,cbotld) + if thread: threading.Thread( + target=self._app.MainLoop, + daemon=1).start() + else: self._app.MainLoop() + def stop(self): + wx.CallAfter(self._app.frame.Close) diff --git a/build/lib/pygwin/ui.py b/build/lib/pygwin/ui.py new file mode 100644 index 0000000..17c1bc3 --- /dev/null +++ b/build/lib/pygwin/ui.py @@ -0,0 +1,651 @@ +from pygwin._pg import pg as _pg +from pygwin.surface import surface as _s +from pygwin.font import defaultFont as _df +from pygwin.image import load as _l +from pygwin.rect import rect as _r +import pygwin.mouse as _m +import pygwin.keyboard as _k +import ctypes as _ct +import copy as _copy + +class widget: + power = True + destroyed = False + def _args(self, locals): + args = _copy.copy(locals) + for i in args.items(): + if i[0] != 'self': + exec(f'self.{i[0]} = args["{i[0]}"]') + self._args = args + def __init__(self, surface): + self._args(locals()) + def draw(self, win, pos): + win.blit(self.surface,pos) + def on(self): + self.power = True + def off(self): + self.power = False + def destroy(self): + self.destroyed = True + def config(self, **parameters): + if parameters != {}: + for i in parameters.items(): + if i[0] in list(self.__dict__.keys()): + exec(f'self.{i[0]} = parameters["{i[0]}"]') + self._args[i[0]] = i[1] + else: + return self._args + self.__init__(**self._args) +class button(widget): + def __init__(self,text, + func=lambda:None, + fontSize=30,font=_df, + width=None,height=None, + bg=(70,70,70),fg=(180,180,200), + afg=(50,50,50),abg=(200,200,200), + borderColor=(50,50,50),borderWidth=5): + super()._args(locals()) + self.cl0 = False + self.cl1 = False + self.nc0 = True + self._generate() + def _generate(self, position=None): + if self.width == None or self.height == None: + textSize = self.font.size(self.text,self.fontSize) + if self.width != None: + self.surface = _s((self.width,textSize[1]+10)) + elif self.height != None: + self.surface = _s((textSize[0]+50,self.height)) + else: + self.surface = _s((textSize[0]+50,textSize[1]+10)) + else: + self.surface = _s((self.width,self.height)) + if position != None: + contains = self.surface.rect(position[0], position[1]).contains( + _m.getPosition()[0], _m.getPosition()[1]) + cacm = contains and _m.isPressed('left') + else: + contains = False + cacm = False + if contains and not self.cl0: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + self.cl0 = True + self.nc0 = True + elif not contains: + if self.nc0: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.nc0 = False + self.cl0 = False + if cacm and not self.cl1: + self.func() + self.cl1 = True + elif not cacm: + self.cl1 = False + self.surface.fill(self.borderColor) + if cacm: + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if cacm: + text = self.font.render(self.text,self.fontSize,self.afg) + else: + text = self.font.render(self.text,self.fontSize,self.fg) + pos = text.rect(center=( + self.surface.size[0]/2, + self.surface.size[1]/2)) + pos = [pos.x, pos.y] + self.surface.blit(text,pos) + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) +class label(widget): + def __init__(self,text,size=30, + color=(0,0,0),font=_df): + self.surface = font.render(text,size,color) +class entry(widget): + def __init__(self,hint='',fontSize=30,font=_df, + width=None,height=None, + bg=(70,70,70),fg=(180,180,200), + afg=(200,200,200),abg=(50,50,50), + hintColor=(100,100,100), + lineColor=(200,200,200), + borderColor=(50,50,50), + borderWidth=5,maxSymbols=None, + whitelist=None,blacklist=[]): + super()._args(locals()) + self.text = '' + self.focus = False + self.tick = 0 + self.wcl = False + self.startHint = self.hint + self.ws = False + if self.width == None or self.height == None: + if self.hint != '': + hintSize = self.font.size(self.hint,self.fontSize) + else: + hintSize = (150,self.font.size('X',self.fontSize)[1]) + if self.height == None: + self.height = hintSize[1]+10 + if self.width == None: + self.width = hintSize[0]+50 + self.surface = _s((self.width,self.height)) + self.wclk = [] + self.wsnr = False + def _generate(self,position=None): + self.surface.fill(self.borderColor) + if self.focus: + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.afg) + x = 10 + if text.size[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-text.size[0]-10 + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + for i in _k.getPressed().items(): + if i[1]: + if i[0] not in self.wclk: + if len(i[0]) == 1: + self.insert(i[0]) + elif i[0] == 'backspace': + self.delete() + elif i[0] == 'return': + self.focus = False + elif i[0] == 'space': + self.insert(' ') + self.wclk.append(i[0]) + else: + if i[0] in self.wclk: + self.wclk.remove(i[0]) + self.tick += 1 + if self.tick >= 60: + if self.text != '': + points = [[x+text.size[0],self.surface.size[1]/2-text.size[1]/2], + [x+text.size[0],self.surface.size[1]/2-text.size[1]/2+self.surface.size[1]-10]] + self.surface.draw.line(self.lineColor,points[0],points[1],3) + if self.tick == 120: + self.tick = 0 + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.fg) + x = self.surface.size[0]/2-text.size[0]/2 + if text.size[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-text.size[0]-10 + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + + if position != None: + if self.surface.rect(position[0], + position[1]).contains(_m.getPosition()[0], + _m.getPosition()[1]): + if not self.wcl: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + else: + if not self.ws: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.ws = True + if _m.isPressed('left'): + if not self.wcl: + self.focus=self.focus==0 + self.wcl = True + else: + self.wcl = False + self.wsnr = False + else: + if not self.wsnr: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.wsnr = True + if _m.isPressed('left'): + self.focus = False + def insert(self,text): + if _ct.WinDLL("User32.dll").GetKeyState(0x14): + text = text.upper() + if _pg.key.get_pressed()[_pg.K_LSHIFT] or _pg.key.get_pressed()[_pg.K_RSHIFT]: + text = text.translate(dict(zip(map(ord, '''1234567890-=[]\\;'''+"',./`"), + '''!@#$%^&*()_+{}|:"<>?~'''))) + if hex(getattr(_ct.windll.LoadLibrary("user32.dll"), "GetKeyboardLayout")(0))=='0x4190419': + text = text.translate(dict(zip(map(ord, '''qwertyuiop[]asdfghjkl;'zxcvbnm,./`QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?~'''), + '''йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё'''))) + if text in self.blacklist: + return + if self.whitelist != None: + if text not in self.whitelist: + return + if self.maxSymbols != None: + if len(self.text) > self.maxSymbols: + return + self.text += text + def delete(self,symbols=1): + self.text = self.text[:0-symbols] + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) + def get(self): + return self.text +class textarea(widget): + def __init__(self,hint='',fontSize=30, + font=_df,width=None,bg=(70,70,70), + fg=(180,180,200),afg=(200,200,200), + abg=(50,50,50),hintColor=(100,100,100), + lineColor=(200,200,200), + borderColor=(50,50,50), + borderWidth=5,maxSymbols=None, + whitelist=None,blacklist=[]): + super()._args(locals()) + self.text = '' + self.focus = False + self.tick = 0 + self.wcl = False + self.startHint = self.hint + self.ws = False + if self.hint != '': + hintSize = self.font.size(self.hint,self.fontSize) + else: + hintSize = (150,self.font.size('X',self.fontSize)[1]) + self.height = hintSize[1]+10 + if self.width == None: + self.width = hintSize[0]+50 + self.surface = _s((self.width,self.height)) + self.wclk = [] + self.wsnr = False + def _generate(self,position=None): + self.surface.fill(self.borderColor) + if self.focus: + if self.text != '': + self.height = self.font.size(self.text,self.fontSize)[1]+10 + else: + self.height = self.font.size('X',self.fontSize)[1]+10 + self.surface = _s((self.width,self.height)) + self.surface.fill(self.borderColor) + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.afg) + try: + last = self.text.split('\n')[-1] + except: + last = self.text + x = 10 + if self.font.size(last,self.fontSize)[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-self.font.size(last,self.fontSize)[0] + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + for i in _k.getPressed().items(): + if i[1]: + if i[0] not in self.wclk: + if len(i[0]) == 1: + self.insert(i[0]) + elif i[0] == 'backspace': + self.delete() + elif i[0] == 'return': + if self.maxSymbols != None: + if len(self.text) > self.maxSymbols: + continue + self.text += '\n' + elif i[0] == 'space': + self.insert(' ') + self.wclk.append(i[0]) + else: + if i[0] in self.wclk: + self.wclk.remove(i[0]) + self.tick += 1 + if self.tick >= 60: + if self.text != '': + points = [[x+self.font.size(last,self.fontSize)[0],self.surface.size[1]-(self.font.size('X',self.fontSize)[1])], + [x+self.font.size(last,self.fontSize)[0],self.surface.size[1]/2-text.size[1]/2+self.surface.size[1]-10]] + self.surface.draw.line(self.lineColor,points[0],points[1],3) + if self.tick == 120: + self.tick = 0 + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.fg) + try: + last = self.text.split('\n')[-1] + except: + last = self.text + x = self.surface.size[0]/2-text.size[0]/2 + if self.font.size(last,self.fontSize)[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-self.font.size(last,self.fontSize)[0] + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + + if position != None: + if self.surface.rect(position[0], + position[1]).contains(_m.getPosition()[0], + _m.getPosition()[1]): + if not self.wcl: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + else: + if not self.ws: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.ws = True + if _m.isPressed('left'): + if not self.wcl: + self.focus=self.focus==0 + self.wcl = True + else: + self.wcl = False + self.wsnr = False + else: + if not self.wsnr: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.wsnr = True + if _m.isPressed('left'): + self.focus = False + def insert(self,text): + if _ct.WinDLL("User32.dll").GetKeyState(0x14): + text = text.upper() + if _pg.key.get_pressed()[_pg.K_LSHIFT] or _pg.key.get_pressed()[_pg.K_RSHIFT]: + text = text.translate(dict(zip(map(ord, '''1234567890-=[]\\;'''+"',./`"), + '''!@#$%^&*()_+{}|:"<>?~'''))) + if hex(getattr(_ct.windll.LoadLibrary("user32.dll"), "GetKeyboardLayout")(0))=='0x4190419': + text = text.translate(dict(zip(map(ord, '''qwertyuiop[]asdfghjkl;'zxcvbnm,./`QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?~'''), + '''йцукенгшщзхъфывапролджэячсмитьбю.ёЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Ё'''))) + if text in self.blacklist: + return + if self.whitelist != None: + if text not in self.whitelist: + return + if self.maxSymbols != None: + if len(self.text) > self.maxSymbols: + return + self.text += text + def delete(self,symbols=1): + self.text = self.text[:0-symbols] + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) + def get(self): + return self.text +class keySelect(entry): + def __init__(self,keyBefore='', + fontSize=30,font=_df, + width=None,height=None, + bg=(70,70,70),fg=(180,180,200), + afg=(200,200,200),abg=(50,50,50), + hintColor=(100,100,100), + lineColor=(200,200,200), + borderColor=(50,50,50), + borderWidth=5,maxSymbols=None, + whitelist=None,blacklist=[]): + super()._args(locals()) + self.hint = '' + self.text = keyBefore + self.focus = False + self.tick = 0 + self.wcl = False + self.startHint = self.hint + self.ws = False + if self.width == None or self.height == None: + if self.hint != '': + hintSize = self.font.size(self.hint,self.fontSize) + else: + hintSize = (150,self.font.size('X',self.fontSize)[1]) + if self.height == None: + self.height = hintSize[1]+10 + if self.width == None: + self.width = hintSize[0]+50 + self.surface = _s((self.width,self.height)) + self.wclk = [] + self.wsnr = False + def _generate(self,position=None): + self.surface.fill(self.borderColor) + if self.focus: + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.afg) + x = self.surface.size[0]/2-text.size[0]/2 + if text.size[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-text.size[0]-10 + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + for i in _k.getPressed().items(): + if i[1] and self.focus: + if i[0] in self.blacklist: + continue + if self.whitelist != None: + if i[0] not in self.whitelist: + continue + if self.maxSymbols != None: + if len(self.text) > self.maxSymbols: + continue + self.text = i[0] + break + self.tick += 1 + if self.tick >= 60: + if self.text != '': + points = [[x+text.size[0],self.surface.size[1]/2-text.size[1]/2], + [x+text.size[0],self.surface.size[1]/2-text.size[1]/2+self.surface.size[1]-10]] + self.surface.draw.line(self.lineColor,points[0],points[1],3) + if self.tick == 120: + self.tick = 0 + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.text == '': + text = self.font.render(self.hint,self.fontSize,self.hintColor) + else: + text = self.font.render(self.text,self.fontSize,self.fg) + x = self.surface.size[0]/2-text.size[0]/2 + if text.size[0] >= self.surface.size[0]-20: + x = self.surface.size[0]-text.size[0]-10 + self.surface.blit(text,(x,self.surface.size[1]/2-text.size[1]/2)) + + if position != None: + if self.surface.rect(position[0], + position[1]).contains(_m.getPosition()[0], + _m.getPosition()[1]): + if not self.wcl: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + else: + if not self.ws: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.ws = True + if _m.isPressed('left'): + if not self.wcl: + self.focus=self.focus==0 + self.wcl = True + else: + self.wcl = False + self.wsnr = False + else: + if not self.wsnr: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.wsnr = True + if _m.isPressed('left'): + self.focus = False + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) + def get(self): + return self.text +class image(widget): + def __init__(self, path): + self.surface = _l(path) +class loadingBar(widget): + def __init__(self,width, + height=50, + length=100, + bg=(70,70,70), + loadedColor=(50,200,50), + borderColor=(50,50,50), + borderWidth=5): + super()._args(locals()) + self.loaded = 0 + def step(self,count=1): + self.loaded += 1 + if self.loaded > self.length: + self.loaded = self.length + def set(self, x): + self.loaded = x + if self.loaded > self.length: + self.loaded = self.length + def reset(self): + self.loaded = 0 + def get(self): + return self.loaded + def draw(self, win, pos): + self.surface = _s((self.width,self.height)) + self.surface.fill(self.borderColor) + self.surface.draw.rect(self.bg,_r(5,5, + self.surface.size[0]-10, + self.surface.size[1]-10)) + self.surface.draw.rect(self.loadedColor,_r(self.borderWidth,self.borderWidth, + (self.surface.size[0]/self.length*self.loaded)-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + win.blit(self.surface, pos) +class slider(widget): + def __init__(self,width, + bg=(70,70,70), + fg=(200,200,200), + horizontal=True): + super()._args(locals()) + self.s = False + self.x = 12.5 + self._generate(None) + def _generate(self, pos): + if self.horizontal: + self.surface = _s((self.width,50)) + self.surface.draw.line(self.bg,[12.5,25],[self.width-12.5,25],10) + self.surface.draw.circle(self.bg,[12.5,26],5) + self.surface.draw.circle(self.bg,[self.width-12.5,26],5) + self.surface.draw.circle(self.fg,[self.x,25],12.5) + else: + self.surface = _s((50,self.width)) + self.surface.draw.line(self.bg,[25,12.5],[25,self.width-12.5],10) + self.surface.draw.circle(self.bg,[26,12.5],5) + self.surface.draw.circle(self.bg,[26,self.width-12.5],5) + self.surface.draw.circle(self.fg,[25,self.x],12.5) + if pos != None: + if _m.isPressed('left'): + if self.horizontal: + rect = _r(pos[0]+5,pos[1], + self.surface.size[0]-10, + self.surface.size[1]) + if rect.contains(_m.getPosition()[0], + _m.getPosition()[1]) or self.s: + self.x = _m.getPosition()[0]-pos[0] + if self.x < 12.5: self.x = 12.5 + if self.x > self.width-12.5: self.x = self.width-12.5 + self.s = True + else: + rect = _r(pos[0],pos[1]+5, + self.surface.size[0], + self.surface.size[1]-10) + if rect.contains(_m.getPosition()[0], + _m.getPosition()[1]) or self.s: + self.x = _m.getPosition()[1]-pos[1] + if self.x < 12.5: self.x = 12.5 + if self.x > self.width-12.5: self.x = self.width-12.5 + self.s = True + else: + self.s = False + def get(self): + return int(self.x/(self.width-10)*101) + def set(self, x): + self.x = x/101*(self.width-10) + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface, pos) +class checkBox(widget): + def __init__(self,width=50,bg=(180,180,180), + fg=(50,180,50),afg=(70,200,70), + abg=(120,120,120),borderColor=(220,220,220), + borderWidth=5): + super()._args(locals()) + self.cl0 = False + self.cl1 = False + self.nc0 = True + self.x = False + self._generate() + def set(self, x): + self.x = x + def get(self): + return self.x + def _generate(self, position=None): + self.surface = _s((self.width,self.width)) + if position != None: + contains = self.surface.rect(position[0], position[1]).contains( + _m.getPosition()[0], _m.getPosition()[1]) + cacm = contains and _m.isPressed('left') + else: + contains = False + cacm = False + if contains and not self.cl0: + _m.setCursor(_pg.SYSTEM_CURSOR_HAND) + self.cl0 = True + self.nc0 = True + elif not contains: + if self.nc0: + _m.setCursor(_pg.SYSTEM_CURSOR_ARROW) + self.nc0 = False + self.cl0 = False + if cacm and not self.cl1: + self.x=self.x==0 + self.cl1 = True + elif not cacm: + self.cl1 = False + self.surface.fill(self.borderColor) + if cacm: + self.surface.draw.rect(self.abg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.x: + self.surface.draw.line(self.afg,[self.borderWidth,self.width/2+self.borderWidth],[self.width/2,self.width-self.borderWidth],self.borderWidth) + self.surface.draw.line(self.afg,[self.width/2,self.width-self.borderWidth],[self.width-self.borderWidth,self.borderWidth],self.borderWidth) + else: + self.surface.draw.rect(self.bg,_r(self.borderWidth,self.borderWidth, + self.surface.size[0]-self.borderWidth*2, + self.surface.size[1]-self.borderWidth*2)) + if self.x: + self.surface.draw.line(self.fg,[self.borderWidth,self.width/2+self.borderWidth],[self.width/2,self.width-self.borderWidth],self.borderWidth) + self.surface.draw.line(self.fg,[self.width/2,self.width-self.borderWidth],[self.width-self.borderWidth,self.borderWidth],self.borderWidth) + def draw(self, win, pos): + self._generate(pos) + win.blit(self.surface,pos) +class base: + def __init__(self, win, bg=(128,128,128)): + self._widgets = {} + self._bg = bg + self._win = win + self._page = 0 + def draw(self): + self._win.fill(self._bg) + for i in self._widgets[self._page]: + if i[0].power: + i[0].draw(self._win, i[1]) + if i[0].destroyed: + self._widgets[self._page].remove(i) + def put(self, widget, pos, page=0): + if page not in self._widgets: + self._widgets.update({page:[]}) + self._widgets[page].append([widget, pos]) + def selectPage(self, page): + self._page = page + def getPage(self): + return self._page + def getWidgets(self, page=0): + return self._widgets[page] + def setWidgetPos(self,index,pos,page=0): + self._widgets[page][index] = [self._widgets[page][index][0], pos] diff --git a/dist/pygwin-0.0.1-py3.7.egg b/dist/pygwin-0.0.1-py3.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..29c97c6ca782f1d109ad7ff9732a71144b5b9827 GIT binary patch literal 39275 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 literal 0 HcmV?d00001 diff --git a/dist/pygwin0-0.0.1-py3-none-any.whl b/dist/pygwin0-0.0.1-py3-none-any.whl index fec93c983972dacb213058b2731b578126107988..6da7a090f904d8529be7d074185a36f3396eeacc 100644 GIT binary patch delta 856 zcmZn{=o8=x@MdNaVPIh3U|^rHk!LTH5c`CzU~aeP?5T_l44ar37!(*LUu2h>{GW}Z zerk|!@F4?%z0bo_j&+}l=&CyH$r9qG(ZgzKA?LJvi}u;$Dl0G4zYlY0myR=<{e4q@ z`TaB|$7e<-UhvLwU(CAy?VSxSS^{^>j*68|{~L7IZ~BQXVP3o3KFF;vc&hOv`*FoH z2evD$^Gz3;%<|6GKEq*jtNh01K!M1}2|1EYUzO_nxOr0dzDjXBx{#&ST77m!{N%4$ zmkOHx3$d#(scsayv)E~_^WrnL7nRm>Nhh=23T}1%G|6W==WNT*oRJ-3>yr=4ziK)^ z_l((tb?09yy1mc-uw2Re&V$OE(N!nYrt&=L{gu5k-t&E7ufySqMGuz*t<6kc**)vc zLnj&DB`@AR`CFg3Z`zDy%J(*3o2h@|_U{xE`%CJY!Q6TKr*8Skc*Smd{|RgEk{1Wq z9vHW8yBmDP+)6;~thBco+l|&4VS7)W4U@myE4NW8&*l~X}sn;r~Y!Z(>q`KrE6n8a+G8RcLx})ieX@2h+&vq#L~&cK4J1-78g!XEG;jaRsLhL z7pr#t!767128IXK^Hp_fWJ_-}a$M8+ZL;=i>ir2>Zl2mpzkac{tZMxKp*!64lbBXO z>#Akb_Dtu>KYus+M`yv7;|uoxdG-ESd*Jgsx99Jkla_Wa$nTbei`bRsQk3*ezXO@2{ zn0jfkfP`2~$z_Je1#UMj9_TH!+HTFwhqraLi+fFMd1=TM_&K%oz$J0t zo1OF9c-I6z4L-MRZubHGRR-a&mfZjK_Qk`fYtNE}B73-=r>vVgIr!emi|-E>IX4B) z*}<^pA7g+wBa;Y&2m>1=`A)84^X3Hw3_STxzQpFJ01`n2A_Idg0|IPoOkx2i?+Gld xd@$pnrX{e;F#Uwc&S0062N?qnaRvs421W)3IfN+;TNv#pUtl+6D`o=;0sytmaM1t& delta 845 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 diff --git a/examples/game.py b/examples/game.py new file mode 100644 index 0000000..4e3a7f2 --- /dev/null +++ b/examples/game.py @@ -0,0 +1,42 @@ +from random import randint +import pygwin as pgw + +win = pgw.create('Game Example', (500,500)) + +player = [250,250] +apple = pgw.rect(randint(0,490),randint(0,490),20,20) +count = 0 + +run = True +while run: + for event in pgw.getEvents(): + if event.type == pgw.QUIT: + run = False + win.fill((255,255,255)) + playerRect = pgw.rect(player[0]-10,player[1]-10,20,20) + win.draw.rect((0,0,0),playerRect) + win.draw.rect((200,50,50),apple) + win.blit(count,(0,0)) + if pgw.keyboard.isPressed('w'): + player[1] -= 5 + if pgw.keyboard.isPressed('s'): + player[1] += 5 + if pgw.keyboard.isPressed('d'): + player[0] += 5 + if pgw.keyboard.isPressed('a'): + player[0] -= 5 + + if player[0] <= -10: + player[0] = 510 + if player[1] <= -10: + player[1] = 510 + if player[0] > 510: + player[0] = -10 + if player[1] > 510: + player[1] = -10 + + if playerRect.collide(apple): + apple = pgw.rect(randint(0,490),randint(0,490),20,20) + count += 1 + win.update(60) +pgw.close() diff --git a/examples/ui.py b/examples/ui.py new file mode 100644 index 0000000..708248f --- /dev/null +++ b/examples/ui.py @@ -0,0 +1,38 @@ +import pygwin + +win = pygwin.create('UI Example',(270,350)) +base = pygwin.ui.base(win) + +lbl = pygwin.ui.label('Label') +base.put(lbl,(130-(lbl.surface.size[0]/2),10)) +base.put(pygwin.ui.button('Button',width=250),(10,50)) +base.put(pygwin.ui.entry('Entry',width=123),(10,100)) +base.put(pygwin.ui.keySelect('Key',width=122),(138,100)) +loadbar = pygwin.ui.loadingBar(250,25) +base.put(loadbar,(10,150)) +slider = pygwin.ui.slider(250) +base.put(slider,(10,170)) +cb = pygwin.ui.checkBox(25,borderWidth=2) +base.put(cb,(10,220)) +base.put(pygwin.ui.label('Checkbox',20),(45,225)) +ta = pygwin.ui.textarea('Textarea',width=250,maxSymbols=20) +ta.text += '0123456789\n0123456789' +ta.focus = True +ta._generate() +ta.focus = False +base.put(ta,(10,255)) + +run = True +while run: + for event in pygwin.getEvents(): + if event.type == pygwin.QUIT: + run = False + base.draw() + if cb.get(): + loadbar.set(slider.get()) + else: + loadbar.step() + if loadbar.get() == loadbar.length: + loadbar.set(0) + win.update(30) +pygwin.close() diff --git a/setup.bat b/setup.bat index 29a72b1..348434a 100644 --- a/setup.bat +++ b/setup.bat @@ -1,3 +1,3 @@ @echo off -python -m pip install pygwin0 -echo Complete! +python setup.py install +pause diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..322bf90 --- /dev/null +++ b/setup.py @@ -0,0 +1,5 @@ +from setuptools import setup + +setup(name='pygwin',packages=['pygwin'],version='0.0.1',author='themixray', + description='A library for creating Python applications.',license='MIT', + install_requires=['cython','pywin32','pygame','inputs','pydub','wxPython']) diff --git a/src/pygwin.egg-info/PKG-INFO b/src/pygwin.egg-info/PKG-INFO new file mode 100644 index 0000000..c5ec6f4 --- /dev/null +++ b/src/pygwin.egg-info/PKG-INFO @@ -0,0 +1,19 @@ +Metadata-Version: 2.1 +Name: pygwin +Version: 0.0.1 +Summary: A library for creating Python applications. +Home-page: https://github.com/themixray/pygwin +Author: themixray +Author-email: simindeymo@gmail.com +License: MIT +Project-URL: Bug Tracker, https://github.com/themixray/pygwin/issues +Project-URL: Wiki, https://github.com/themixray/pygwin/wiki +Description: # PyGWin + A library for creating Python applications. + + [Documentation](https://github.com/themixray/pygwin/wiki) +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Description-Content-Type: text/markdown diff --git a/src/pygwin.egg-info/SOURCES.txt b/src/pygwin.egg-info/SOURCES.txt new file mode 100644 index 0000000..b48cbfa --- /dev/null +++ b/src/pygwin.egg-info/SOURCES.txt @@ -0,0 +1,23 @@ +README.md +pyproject.toml +setup.cfg +setup.py +src/pygwin/__init__.py +src/pygwin/_pg.py +src/pygwin/_win.py +src/pygwin/console.py +src/pygwin/font.py +src/pygwin/gamepad.py +src/pygwin/image.py +src/pygwin/keyboard.py +src/pygwin/mixer.py +src/pygwin/mouse.py +src/pygwin/rect.py +src/pygwin/surface.py +src/pygwin/tray.py +src/pygwin/ui.py +src/pygwin.egg-info/PKG-INFO +src/pygwin.egg-info/SOURCES.txt +src/pygwin.egg-info/dependency_links.txt +src/pygwin.egg-info/requires.txt +src/pygwin.egg-info/top_level.txt \ No newline at end of file diff --git a/src/pygwin.egg-info/dependency_links.txt b/src/pygwin.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/pygwin.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/pygwin.egg-info/requires.txt b/src/pygwin.egg-info/requires.txt new file mode 100644 index 0000000..6b723ea --- /dev/null +++ b/src/pygwin.egg-info/requires.txt @@ -0,0 +1,6 @@ +cython +pywin32 +pygame +inputs +pydub +wxPython diff --git a/src/pygwin.egg-info/top_level.txt b/src/pygwin.egg-info/top_level.txt new file mode 100644 index 0000000..9907c64 --- /dev/null +++ b/src/pygwin.egg-info/top_level.txt @@ -0,0 +1 @@ +pygwin diff --git a/src/pygwin/rect.py b/src/pygwin/rect.py index ab8892b..3e125fa 100644 --- a/src/pygwin/rect.py +++ b/src/pygwin/rect.py @@ -26,6 +26,9 @@ class rect: return locals() height = property(**height()) def collide(self, x): - return self._rect.colliderect(x._rect_rect) + try: + return self._rect.colliderect(x._rect_rect) + except: + return self._rect.colliderect(x._rect) def contains(self, x, y): return self._rect.collidepoint(x,y) diff --git a/src/pygwin0.egg-info/PKG-INFO b/src/pygwin0.egg-info/PKG-INFO index 12aab8d..20ee477 100644 --- a/src/pygwin0.egg-info/PKG-INFO +++ b/src/pygwin0.egg-info/PKG-INFO @@ -7,6 +7,7 @@ Author: themixray Author-email: simindeymo@gmail.com License: UNKNOWN Project-URL: Bug Tracker, https://github.com/themixray/pygwin/issues +Project-URL: Wiki, https://github.com/themixray/pygwin/wiki Platform: UNKNOWN Classifier: Programming Language :: Python :: 3 Classifier: License :: OSI Approved :: MIT License