pythonpython-2.7pygamecx-freezepykinect

CX_Freeze come up not responding with Pygame and Pykinect


I have my code here:

import thread
import pygame
from pykinect import nui
import os
import Tkinter as tk
import tkMessageBox
root = tk.Tk()
root.withdraw()

DEPTH_WINSIZE = (640, 480)

screen_lock = thread.allocate()
screen = None

tmp_s = pygame.Surface(DEPTH_WINSIZE, 0, 16)

s=None
global DIR
k = open("DIR.dir", "r")
DIR = k.read()
if (not os.path.exists("Patients\\" + DIR)):
    os.makedirs("Patients\\" + DIR)
k.close()
def exit():
    exit()
def video_frame_ready(frame):
    frame.image.copy_bits(screen._pixels_address)
    pygame.display.update()
    global s
    if (s == 4):
        R = open("Patients\\" + DIR + "\\" + "RED.clr", "w")
        G = open("Patients\\" + DIR + "\\" + "GREEN.clr", "w")
        B = open("Patients\\" + DIR + "\\" + "BLUE.clr", "w")
        for i in range(screen.get_height()):
            for i1 in range(screen.get_width()):
                R.write(str(screen.get_at((i1, i))[0]) + " ")
                G.write(str(screen.get_at((i1, i))[1]) + " ")
                B.write(str(screen.get_at((i1, i))[2]) + " ")
            R.write("\n")
            G.write("\n")
            B.write("\n")
        R.close()
        G.close()
        B.close()
def depth_frame_ready(frame):
    with screen_lock:
        global arr
        frame.image.copy_bits(tmp_s._pixels_address)
        arr.append(pygame.surfarray.pixels2d(tmp_s))
        arr2d = (pygame.surfarray.pixels2d(tmp_s) >> 7) & 255

        global s
        s=s+1
        if (s==5):
            tkMessageBox.showinfo("Points", "Select Some Points in the Window")
            click = 0
            coords = []
            while (True):
                action = pygame.mouse.get_pressed()
                if (action[0]):
                    if (click != 0):
                        if (coords[-1] == pygame.mouse.get_pos()):
                            break
                    coords.append([])
                    coords[click] = pygame.mouse.get_pos()
                    pygame.time.wait(300)
                    DEPTH_MULT = arr[3][coords[click][0]][coords[click][1]] / 8800.0
                    MULT_FINAL = 1 / DEPTH_MULT
                    screen.set_at((coords[click][0]-1, coords[click][1]-1), (255, 0, 0))
                    arr2d_N = (pygame.surfarray.pixels2d(tmp_s) >> 7) & 255
                    pygame.display.update()
                    click = click + 1
                    action = pygame.mouse.get_pressed()
            File = open("NM.dta", "w")
            File.write(str(click))
            File.close()
            tkMessageBox.showinfo("Finished", "Scanning Finished, Please Wait...")
            File = open("Patients\\" + DIR + "\\coords_MLT.crd", "w")
            FILE = open("Patients\\" + DIR + "\\coords_MLT_VIDEO.crd", "w")
            for i in range (len(coords)):
                for i1 in range (2):
                    DEPTH_MULT = arr[3][coords[i][0]][coords[i][1]] / 8800.0
                    MULT_FINAL = 1 / DEPTH_MULT
                    if (i1 == 0):
                        File.write(str(coords[i][i1] - int(19 * MULT_FINAL)) + " ")
                        FILE.write(str(coords[i][i1]) + " ")
                    else:
                        File.write(str(coords[i][i1] - int(22 * MULT_FINAL)) + " ")
                        FILE.write(str(coords[i][i1]) + " ")
                File.write("\n")
                FILE.write("\n")
            File.close()
            FILE.close()
            for k in range(len(arr)):
                test = open("Patients\\" + DIR + "\\out"+str(k)+".dpm", "w")
                for i in arr[k]:
                    for i1 in i:
                        test.write(str(i1) + " ")
                    test.write("\n")
                test.close()
            pygame.quit()
            k = open("Finished.FNS", "w")
            k.write("FNS")
            k.close()
            os.startfile("Kinect_Matrix_generation_FINAL_VERSION.exe")
            pygame.time.wait(100)
            exit()

def main():
    pygame.init()
    global s
    s=0
    global arr
    arr = []

    global screen
    screen = pygame.display.set_mode(DEPTH_WINSIZE, 0, 32)
    pygame.display.set_caption("Skelenct Scan")

    angle = 0
    with nui.Runtime() as kinect:
        kinect.depth_frame_ready += depth_frame_ready
        kinect.depth_stream.open(nui.ImageStreamType.Depth, 2, nui.ImageResolution.Resolution640x480, nui.ImageType.Depth)

        kinect.video_frame_ready += video_frame_ready
        kinect.video_stream.open(nui.ImageStreamType.Video, 2, nui.ImageResolution.Resolution640x480, nui.ImageType.Color)

        # Main game loop
        while (True):
            event = pygame.event.wait()

            if (event == pygame.QUIT):
                break
if (__name__ == "__main__"):
    import sys
    main()
    sys.exit(app.exec_())

And this is my setup.py file:

import cx_Freeze
import sys

base = None

if (sys.platform == "win32"):
    base = "Win32GUI"
Executables = [          cx_Freeze.Executable("Kinect_wint_Python_Multi_Points_Final_With_Video.py", base = base, icon = "Icon.ico")]

cx_Freeze.setup(
    name = "Skelenect",
    options = {"build_exe": {"packages":["thread", "pygame", "sys", "os"], "include_files":["Icon.ico", "Icon.png", "SKEL_PIC.png"]}},
    version = "0.1",
    description = "Body Scanning Software",
    executables = Executables
    )

When this program runs, it works fine until it wants to run the other .exe file and exits. It always says that it is not responding but the program works fine before Freezing it with CX_Freeze.

Any help would be greatly appreciated.


Solution

  • You just have to move the pygame.quit() method down and add a try/except statement and also use os._exit(0)

    Like this:

    import thread
    import pygame
    import easygui
    from pykinect import nui
    import os
    import Tkinter as tk
    import tkMessageBox
    root = tk.Tk()
    root.withdraw()
    
    
    DEPTH_WINSIZE = (640, 480)
    
    screen_lock = thread.allocate()
    screen = None
    
    tmp_s = pygame.Surface(DEPTH_WINSIZE, 0, 16)
    
    s=None
    global DIR
    k = open("DIR.dir", "r")
    DIR = k.read()
    if (not os.path.exists("Patients\\" + DIR)):
        os.makedirs("Patients\\" + DIR)
    k.close()
    def video_frame_ready(frame):
        frame.image.copy_bits(screen._pixels_address)
        pygame.display.update()
        global s
        if (s == 4):
            R = open("Patients\\" + DIR + "\\" + "RED.clr", "w")
            G = open("Patients\\" + DIR + "\\" + "GREEN.clr", "w")
            B = open("Patients\\" + DIR + "\\" + "BLUE.clr", "w")
            for i in range(screen.get_height()):
                for i1 in range(screen.get_width()):
                    R.write(str(screen.get_at((i1, i))[0]) + " ")
                    G.write(str(screen.get_at((i1, i))[1]) + " ")
                    B.write(str(screen.get_at((i1, i))[2]) + " ")
                R.write("\n")
                G.write("\n")
                B.write("\n")
            R.close()
            G.close()
            B.close()
    def depth_frame_ready(frame):
        with screen_lock:
            global arr
            frame.image.copy_bits(tmp_s._pixels_address)
            arr.append(pygame.surfarray.pixels2d(tmp_s))
            arr2d = (pygame.surfarray.pixels2d(tmp_s) >> 7) & 255
    
            global s
            s=s+1
            if (s==5):
                click = 0
                coords = []
                while (True):
                    action = pygame.mouse.get_pressed()
                    if (action[0]):
                        if (click != 0):
                            if (coords[-1] == pygame.mouse.get_pos()):
                                break
                        coords.append([])
                        coords[click] = pygame.mouse.get_pos()
                        pygame.time.wait(300)
                        DEPTH_MULT = arr[3][coords[click][0]][coords[click][1]] / 8800.0
                        MULT_FINAL = 1 / DEPTH_MULT
                        screen.set_at((coords[click][0]-1, coords[click][1]-1), (255, 0, 0))
                        arr2d_N = (pygame.surfarray.pixels2d(tmp_s) >> 7) & 255
                        pygame.display.update()
                        click = click + 1
                        action = pygame.mouse.get_pressed()
                File = open("NM.dta", "w")
                File.write(str(click))
                File.close()
                tkMessageBox.showinfo("Finished", "Scanning Finished, Please Wait...")
                File = open("Patients\\" + DIR + "\\coords_MLT.crd", "w")
                FILE = open("Patients\\" + DIR + "\\coords_MLT_VIDEO.crd", "w")
                for i in range (len(coords)):
                    for i1 in range (2):
                        DEPTH_MULT = arr[3][coords[i][0]][coords[i][1]] / 8800.0
                        MULT_FINAL = 1 / DEPTH_MULT
                        if (i1 == 0):
                            File.write(str(coords[i][i1] - int(19 * MULT_FINAL)) + " ")
                            FILE.write(str(coords[i][i1]) + " ")
                        else:
                            File.write(str(coords[i][i1] - int(22 * MULT_FINAL)) + " ")
                            FILE.write(str(coords[i][i1]) + " ")
                    File.write("\n")
                    FILE.write("\n")
                File.close()
                FILE.close()
                for k in range(len(arr)):
                    test = open("Patients\\" + DIR + "\\out"+str(k)+".dpm", "w")
                    for i in arr[k]:
                        for i1 in i:
                            test.write(str(i1) + " ")
                        test.write("\n")
                    test.close()
                k = open("Finished.FNS", "w")
                k.write("FNS")
                k.close()
                os.startfile("Kinect_Matrix_generation_FINAL_VERSION.exe")
                pygame.time.wait(100)
                global G
                G = False
                os._exit(0)
                pygame.quit()
    
    
    def main():
        pygame.init()
        global s
        s=0
        global arr
        arr = []
    
        global G
        G = True
    
        global screen
        screen = pygame.display.set_mode(DEPTH_WINSIZE, 0, 32)
        pygame.display.set_caption("Skelenct Scan")
    
        angle = 0
        with nui.Runtime() as kinect:
            kinect.depth_frame_ready += depth_frame_ready
            kinect.depth_stream.open(nui.ImageStreamType.Depth, 2, nui.ImageResolution.Resolution640x480, nui.ImageType.Depth)
    
            kinect.video_frame_ready += video_frame_ready
            kinect.video_stream.open(nui.ImageStreamType.Video, 2, nui.ImageResolution.Resolution640x480, nui.ImageType.Color)
    
            while (G):
                try:
                    event = pygame.event.wait()
    
                    if (event == pygame.QUIT):
                        break
                except :
                    os._exit(0)
    if (__name__ == "__main__"):
        import sys
        main()
        sys.exit(app.exec_())
    

    The setup script does not need any changes.