from config import * from imagefunctions import ImageSetLoader, ImageStretcher, ImageSet def draw_line(surf, from_point, to_point): draw.line(surf, (255,255,255), from_point, to_point) def main(): pygame.init() imageset_loader = Control.imageset_loader image_stretcher = ImageStretcher(imageset_loader.button.normal) button_image = image_stretcher(size=(200, 200), fill=(250, 250, 250, 150)) screen = pygame.display.set_mode((640, 480)) backup = pygame.image.load(os.path.join(imageset_loader.path, 'back.jpg') ).convert() back = backup.copy() rect = Rect(20, 0, 250, 50) button = Button(parent=None, rect=rect) m = [0, 0] # mouse position md = False # left mouse button is down while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == MOUSEBUTTONDOWN: print event if not md and event.button == 1: md = True m[:] = event.pos elif event.button == 3: back = backup.copy() elif event.type == MOUSEBUTTONUP: if md and event.button == 1: md = False elif event.type == MOUSEMOTION: print event if md and event.buttons[0]: x, y = tuple(m) dx, dy = event.rel to_point = (x+dx, y+dy) draw_line(back, from_point=m, to_point=to_point) m[:] = to_point else: print event screen.blit(back, (0, 0)) screen.blit(button_image, (250, 250)) screen.blit(button.image, button.exterect) #print button.exterect pygame.display.flip() class Control(object): """Meta-Class containing basics for all control elements""" imageset_loader = ImageSetLoader(imageset_name="standard") def __init__(self, parent=None): self._exterect = Rect(0, 0, 0, 0) self._interect = Rect(0, 0, 0, 0) self._visible = True self._disabled = False self.dirty = 1 # 0 clean, 1 dirty, 2 (stay) dirty if parent: self.parent = parent self.style = style = {} def _get_visible(self): return self._visible def _set_visible(self, value): self._visible = value self.dirty = 1 def _get_disabled(self): return self._disabled def _set_disabled(self, value): self._disabled = value self.dirty = 1 def _get_exterect(self): return self._exterect def _set_exterect(self, rect): self._exterect = rect def _get_interect(self): return self._interect def _set_interect(self, rect): self._interect = rect def _get_parent(self): return self._parent def _set_parent(self, parent): self._parent = parent exterect = (_get_exterect, _set_exterect) interect = (_get_interect, _set_interect) parent = (_get_parent, _set_parent) visible = (_get_visible, _set_visible) disabled = (_get_disabled, _set_disabled) class Container(Control, sprite.OrderedUpdates): def __init__(self): Control.__init__(self) sprite.OrderedUpdates.__init__(self) class Widget(Control, sprite.Sprite): def __init__(self): Control.__init__(self) sprite.Sprite.__init__(self) class ContainerWidget(Container, Widget): def __init__(self): Widget.__init__(self) Container.__init__(self) class Desktop(Container): def __init__(self): Container.__init__(self) class Layer(Container): def __init__(self, parent): Container.__init__(self) class Frame(Container, Widget): def __init__(self, parent): Container.__init__(self) Widget.__init__(self) class Button(Container, Widget): def __init__(self, parent, rect=None): Control.__init__(self, parent) Container.__init__(self) Widget.__init__(self) self.imageset = self.imageset_loader.button self.image_stretcher = ImageStretcher(self.imageset()) self.image = self.image_stretcher(rect=rect, fill=(250, 150, 150, 100)) self.exterect = rect print self.image class Entry(Container, Widget): def __init__(self, parent): Container.__init__(self) Widget.__init__(self) class Label(Container, Widget): def __init__(self, parent): Container.__init__(self) Widget.__init__(self) class Text(Container, Widget): def __init__(self, parent): Container.__init__(self) Widget.__init__(self) class Checkbutton(Container, Widget): def __init__(self, parent): Container.__init__(self) Widget.__init__(self) class Radiobutton(Container, Widget): def __init__(self, parent): Container.__init__(self) Widget.__init__(self) class Listbox(Container, Widget): def __init__(self, parent): Container.__init__(self) Widget.__init__(self) class Scrollbar(Container, Widget): def __init__(self, parent): Container.__init__(self) Widget.__init__(self) class Root(sprite.OrderedUpdates): def __init__(self): self.update_rect() print self.rect def update(self, *args): self.update_rect() sprite.OrderedUpdates.update(self, *args) def update_rect(self): """Update own rect with display surface rect""" try: self.rect = pygame.display.get_surface().get_rect() except AttributeError: # skip and set dummy until pygame.display is initialized self.rect = Rect(0, 0, 0, 0) class _Widget(sprite.OrderedUpdates): def __init__(self, parent=None, rect=None, position=(0, 0), width=100, height=20): if rect: self.rect = rect else: self.rect = Rect(position, (width, height)) self.parent = parent if parent: self.parent.add(self) def render_image(self): """Render widget-specific image surface and save in self.image""" self.image = Surface(self.rect.size) def spritecollidetopmost(sprite, group, collided = None): """pygame.sprite.spritecollideany(sprite, group) -> sprite finds any sprites that collide Given a sprite and a group of sprites, this will return the first sprite that collides with the given sprite and comes last in the group. If there are no collisions this returns None. If you don't need all the features of the spritecollide function, this function will be a bit quicker. Param group must have the attribute _spritelist containing all sprite references in layered order. Group "OrderedUpdates" provides this funtionality. All sprites must have a "rect" value, which is a rectangle of the sprite area.""" if collided: for i in xrange(len(group._spritelist)): s = group._spritelist[-i] if collided( sprite, s ): return s else: spritecollide = sprite.rect.colliderect for i in xrange(len(group._spritelist)): s = group._spritelist[-i] if spritecollide(s.rect): return s return None if __name__ == "__main__": main()