#! /usr/bin/env python
import random, threading, time
from wxPython.wx import *
from wxPython.lib.evtmgr import eventManager

class Threadmain(wxFrame):
    def __init__(self, parent):
        title = "Buttontest"
        wxFrame.__init__(self, parent, -1, title, size = (640, 480),
                                         style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
        sizer = wxBoxSizer(wxVERTICAL)
        but = wxButton(self, -1, 'Click!')
        self.out = wxTextCtrl(self, -1, style=wxTE_READONLY|wxTE_MULTILINE)
        sizer.Add(but,1,wxEXPAND)
        sizer.Add(self.out,3,wxEXPAND)
        eventManager.Register(self.onClick,	 EVT_LEFT_UP, but)
        self.SetAutoLayout(1)
        self.SetSizer(sizer)
        self.Layout()

    def onClick(self, evt):
        seed = random.uniform(1,10)
        self.out.AppendText('Seed: %d\n' %(seed))
        render = Threadtest(self, self.out, seed)
        render.start()
        evt.Skip()

class Threadtest(threading.Thread):

    def __init__(self, parent, output, seed):
        threading.Thread.__init__(self)
        self.parent = parent
        self.output = output
        self.seed   = seed

    def run(self):
        print 'Start:',time.strftime('%H:%M:%S')
        count = 0
        while count < self.seed:
            ct = time.time()
            while time.time() < ct+1:
                pass
            wxCallAfter(self.output.AppendText, '.')
            count += 1
        print 'Done :', time.strftime('%H:%M:%S')
        wxCallAfter(self.finished)

    def finished(self):
        win = TestFrame(self.parent, -1, "Preview")
        win.SetSize((100, 100))
        win.CenterOnScreen(wxBOTH)
        win.Show(1)


class TestFrame(wxFrame):
    def __init__(self, *args, **kwargs):
        apply(wxFrame.__init__,(self,) + args, kwargs)
        button = wxButton(self, -1, "Close")

        eventManager.Register(self.onCloseMe, EVT_BUTTON, button)

    def onCloseMe(self, event):
        print 'Booo!'
        self.Close(1)
        event.Skip()

class MyApp(wxApp):
    def OnInit(self):
        frame = Threadmain(None)
        frame.Show(1)
        return 1

myapp = MyApp(0)
myapp.MainLoop()

