[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] py2exe oceangui problem



I'm having a problem and I wonder if anyone has any insight.  I have a
program that works runs properly but when I use py2exe to create an
executable and then attempt to run that executable from the dist dir I
get:

D:\code\test\dist>twisted_ocean_client.exe
D:\code\test\dist\library.zip\twisted\spread\pb.py:30:
DeprecationWarning: the md5 module is deprecated; use hashlib instead
D:\code\test\dist\library.zip\ocempgui\draw\String.py:71:
RuntimeWarning: use font: DLL load failed: The specified module could
not be found
.
Traceback (most recent call last):
  File "twisted_ocean_client.py", line 279, in <module>
  File "twisted_ocean_client.py", line 227, in __init__
  File "twisted_ocean_client.py", line 239, in drawButton
  File "ocempgui\widgets\Button.pyc", line 83, in __init__
  File "ocempgui\widgets\Button.pyc", line 97, in set_text
  File "ocempgui\widgets\Label.pyc", line 124, in __init__
  File "ocempgui\widgets\Label.pyc", line 158, in set_text
  File "ocempgui\widgets\BaseWidget.pyc", line 961, in <lambda>
  File "ocempgui\widgets\BaseWidget.pyc", line 527, in set_dirty
  File "ocempgui\widgets\BaseWidget.pyc", line 875, in update
  File "ocempgui\widgets\BaseWidget.pyc", line 792, in draw
  File "ocempgui\widgets\Label.pyc", line 318, in draw_bg
  File "D:\Python26\share\ocempgui\themes\default\DefaultEngine.py",
line 682, in draw_label
    rtext = self.draw_string (label.text, label.state, cls, st)
  File "D:\Python26\share\ocempgui\themes\default\DefaultEngine.py",
line 287, in draw_string
    return String.draw_string (text, name, size, alias, color, st)
  File "ocempgui\draw\String.pyc", line 169, in draw_string
  File "ocempgui\draw\String.pyc", line 135, in create_font
  File "ocempgui\draw\String.pyc", line 71, in create_file_font
  File "pygame\__init__.pyc", line 70, in __getattr__
NotImplementedError: font module not available

D:\code\test\dist>


Here is the code it is compiling and I can run it directly with python.
----------


import pygame
import sys
from pygame import QUIT, event
from pygame import error as PygameError
from pygame import time as PygameTime

from random import randint

from ocempgui.widgets import *
from ocempgui.widgets.Constants import *
from ocempgui.object import BaseObject

from ocempgui.widgets import Button, Renderer
from twisted.internet._threadedselect import install
install()
from twisted.spread import pb
from twisted.internet import reactor

REPORT = pygame.locals.USEREVENT + 4
SCORE = pygame.locals.USEREVENT + 5

def main_loop():
    events = pygame.event.get ()
    for ev in events:
        if ev.type == pygame.QUIT:
            sys.exit ()

    re.distribute_events (*events)
    re.refresh ()
    pygame.time.delay (15)


class CustomTwistedRenderer (Renderer):
    """TwistedRenderer () -> TwistedRenderer

    A Renderer that allows the easy integration with Twisted.

    Because Twisted's threadedselectreactor *must* be shut down before
    the main loop shuts down, this Renderer will keep running until
    explicitly told to stop.

    Before starting the main loop, this Renderer will check to see if it
    has a Twisted reactor attached to it. This is an attribute set like
    any of the normal Renderer attributes:

    self.reactor = reactor

    If self.reactor is None (default), this will behave like a normal
    Renderer. If self.reactor has been set, the QUIT signal will call
    reactor.stop(), and then wait for reactor.addSystemEventTrigger to
    call self.stop(). This function will then stop the main loop.

    Usage
    -----
    Install the threadedselectreactor instead of the default reactor:

    from twisted.internet.threadedselectreactor import install
    install()
    from twisted.internet import reactor

    In the main section of your program, where you create the Renderer,
    just set TwistedRenderer's reactor:

    re = TwistedRenderer()
    re.reactor = reactor

    Everything else is handled internally by TwistedRenderer.

    Attributes:
    reactor - The twisted reactor attached to the TwistedRenderer.
    """
    def __init__ (self):
        Renderer.__init__ (self)
        self._reactor = None
        self._running = False

    def start (self):
        """T.start () -> None

        Overrides default start() to use self._running. If a reactor is
        attached, interleave self.waker
        """
        self._running = 1
        if self._reactor != None:
            self._reactor.interleave (self.waker)
        self._loop()

    def stop (self):
        """T.stop () -> None

        Tells the internal loop to stop running.
        """
        self._running = False

    def set_reactor (self, reactor):
        """T.set_reactor (...) -> None

        Sets the internal reactor.
        """
        if not hasattr (reactor, 'interleave'):
            raise AttributeError ("interleave() method not found in %s" %
                                  reactor)
        self._reactor = reactor
        self._reactor.addSystemEventTrigger ('after', 'shutdown', self.stop)

    def waker (self, func):
        """T.waker (...) -> None

        Used in threadedselectreactor.interleave.
        """
        event.post (event.Event (SIG_TWISTED, data=func))

    def distribute_events (self, *events):
        """T.distribute_events (...) -> None

        Overrides default distribute_events() to check for a reactor. If
        a reactor is found, the QUIT signal will call reactor.stop(). If
        there's no reactor attached, a QUIT signal will simply set
        self._running to False.
        """
        for event in events:
            if event.type == QUIT:
                if self._reactor != None:
                    self._reactor.stop ()
                else:
                    self._running = False

            elif event.type == SIG_TWISTED:
                event.data ()
            else:
                Renderer.distribute_events (self, (event))
        return True

    def _loop (self):
        """T._loop () -> None

        Overrides default _loop() so that it will not stop until
        self._running is false.
        """
        # Emit the tick event every 10 ms.
        PygameTime.set_timer (SIG_TICK, 10)
        delay = PygameTime.delay
        event_get = event.get
        pump = event.pump

        while self._running:
            pump ()
            # Get events and distribute them.
            events = event_get ()
            main_loop()

            if not self.distribute_events (*events):
                return # QUIT event
            if self.timer > 0:
                delay (1000 / self.timer)

    reactor = property (lambda self: self._reactor,
                        lambda self, var: self.set_reactor (var),
                        doc = "The twisted reactor attached to the Renderer.")


class NetController (BaseObject, pb.Referenceable):
    def __init__ (self, re):
        """
        The network controller. Can call remote PB methods, and because
        it inherits from pb.Referenceable, can also contain remote
        methods callable by the server.

        Make sure you set the internal _signals before setting the
        manager, otherwise the signals won't get connected to the event
        manager.
        """
        BaseObject.__init__ (self)
        self._signals[SCORE] = []
        self.connect_signal (SCORE, self.add_one)
        self.manager = re.active_layer[2]

        # Set up twisted connection.
        self.factory = pb.PBClientFactory ()
        d = self.factory.getRootObject ()
        d.addCallback (self.setRoot)
        reactor.connectTCP ('localhost', 8008, self.factory)
        self.root = None

    def setRoot (self, root):
        self.root = root
        reactor.callLater (0, self.resetter)

    def add_one (self, data):
        # Call the server's score method and update score by 1. Although
        # data is passed to this method, it isn't used. Note that it
        # sends self as an arg, so that the server can call a remote
        # method on this object.
        if self.root:
            self.root.callRemote ('score', self, 1)

    def resetter (self):
        # This method is called by the reactor every 5 seconds to reset
        # the score on the server.
        if self.root:
            self.root.callRemote ('reset', self)
            self.emit (REPORT, 0)
            reactor.callLater (5, self.resetter)

    def remote_report (self, score):
        # This method is called by the server and emits a REPORT event
        # which is picked up by the JumpingButton object.
        self.emit (REPORT, score)

    def notify (self, event):
        self.run_signal_handlers (event.signal, event.data)

class JumpingButton (BaseObject):
    def __init__ (self, re):
        """
        The Jumping Button game. When the button is clicked, it emits a
        SCORE event, which is picked up by the network controller. It
        listens for a REPORT event and updates the score display with
        the value given by the server.
        """
        BaseObject.__init__ (self)
        self._signals[REPORT] = []
        self.connect_signal (REPORT, self.adjustScore)
        self.manager = re.active_layer[2]

        # create gui elements
        self.btn = self.drawButton ((20, 20))
        self.scoreLabel = Label ("Current score: ")
        re.add_widget (self.btn)
        re.add_widget (self.scoreLabel)

    def clicked (self, data):
        x = randint (1, 550 - self.btn.width)
        y = randint (1, 470 - self.btn.height)
        self.btn.topleft = (x, y)
        self.emit (SCORE, data.pos)

    def drawButton (self, loc):
        button = Button ("Click me!")
        button.topleft = loc
        button.connect_signal (SIG_MOUSEDOWN, self.clicked)
        return button

    def adjustScore (self, score):
        self.scoreLabel.text = "Current score: %s" % score

    def notify (self, event):
        self.run_signal_handlers (event.signal, event.data)


# Initialize pygame window
pygame.init ()
screen = pygame.display.set_mode ((200, 200));
screen.fill ((255, 200, 100))

# Create the Renderer to use for the UI elements.
re = CustomTwistedRenderer ()


# Bind it to a part of the screen, which it will use to draw the widgets.
# Here we use the complete screen.
re.screen = screen

# Create a button, place it at x=10, y=30, bind a callback to its
# clicking action and add it to the Renderer instance.


# Some variables we will need in the main loop for drawing a rect.



re.reactor = reactor

re.create_screen (550, 470)
re.title = "Jumping Button"
re.color = (234, 228, 223)

net = NetController (re)
game = JumpingButton (re)

def main_loop():
    events = pygame.event.get ()
    for ev in events:
        if ev.type == pygame.QUIT:
            sys.exit ()

    re.distribute_events (*events)
    re.refresh ()
    pygame.time.delay (15)

re.start()


-- 

Doubt is not a pleasant condition, but certainty is absurd.
		-- Voltaire