2018-10-15 00:51:18 +00:00
import PySimpleGUI as sg
import subprocess
import shutil
import os
2020-05-13 12:19:43 +00:00
import sys
2019-10-23 20:10:03 +00:00
'''
Make a " Windows os " executable with PyInstaller
'''
2018-10-15 00:51:18 +00:00
2020-05-13 12:19:43 +00:00
def main ( ) :
2019-12-24 23:52:47 +00:00
sg . theme ( ' LightGreen ' )
2019-10-23 20:10:03 +00:00
layout = [ [ sg . Text ( ' PyInstaller EXE Creator ' , font = ' Any 15 ' ) ] ,
[ sg . Text ( ' Source Python File ' ) , sg . Input ( key = ' -sourcefile- ' , size = ( 45 , 1 ) ) ,
sg . FileBrowse ( file_types = ( ( " Python Files " , " *.py " ) , ) ) ] ,
[ sg . Text ( ' Icon File ' ) , sg . Input ( key = ' -iconfile- ' , size = ( 45 , 1 ) ) ,
sg . FileBrowse ( file_types = ( ( " Icon Files " , " *.ico " ) , ) ) ] ,
[ sg . Frame ( ' Output ' , font = ' Any 15 ' , layout = [
[ sg . Output ( size = ( 65 , 15 ) , font = ' Courier 10 ' ) ] ] ) ] ,
2020-05-13 12:19:43 +00:00
[ sg . Button ( ' Make EXE ' , bind_return_key = True ) ,
sg . Button ( ' Quit ' , button_color = ( ' white ' , ' firebrick3 ' ) ) ] ,
[ sg . Text ( ' Made with PySimpleGUI (www.PySimpleGUI.org) ' , auto_size_text = True , font = ' Courier 8 ' ) ] ]
2018-10-15 00:51:18 +00:00
2020-05-13 12:19:43 +00:00
window = sg . Window ( ' PySimpleGUI EXE Maker ' , layout , auto_size_text = False , auto_size_buttons = False , default_element_size = ( 20 , 1 ) , text_justification = ' right ' )
2018-10-15 00:51:18 +00:00
# ---===--- Loop taking in user input --- #
while True :
2019-10-23 20:10:03 +00:00
event , values = window . read ( )
if event in ( ' Exit ' , ' Quit ' , None ) :
break
source_file = values [ ' -sourcefile- ' ]
icon_file = values [ ' -iconfile- ' ]
2018-10-15 00:51:18 +00:00
icon_option = ' -i " {} " ' . format ( icon_file ) if icon_file else ' '
source_path , source_filename = os . path . split ( source_file )
workpath_option = ' --workpath " {} " ' . format ( source_path )
dispath_option = ' --distpath " {} " ' . format ( source_path )
specpath_option = ' --specpath " {} " ' . format ( source_path )
2019-10-23 20:10:03 +00:00
folder_to_remove = os . path . join ( source_path , source_filename [ : - 3 ] )
2020-05-13 12:19:43 +00:00
file_to_remove = os . path . join ( source_path , source_filename [ : - 3 ] + ' .spec ' )
command_line = ' pyinstaller -wF --clean " {} " {} {} {} {} ' . format ( source_file , icon_option , workpath_option , dispath_option , specpath_option )
2018-10-15 00:51:18 +00:00
2019-10-23 20:10:03 +00:00
if event == ' Make EXE ' :
2018-10-15 01:20:33 +00:00
try :
print ( command_line )
2020-05-13 12:19:43 +00:00
print ( ' Making EXE...the program has NOT locked up... ' )
2019-10-23 20:10:03 +00:00
window . refresh ( )
2018-10-15 01:20:33 +00:00
# print('Running command {}'.format(command_line))
2020-05-13 12:19:43 +00:00
out , err = runCommand ( command_line , window = window )
2018-10-15 01:20:33 +00:00
shutil . rmtree ( folder_to_remove )
os . remove ( file_to_remove )
print ( ' **** DONE **** ' )
except :
2020-05-13 12:19:43 +00:00
sg . PopupError ( ' Something went wrong ' , ' close this window and copy command line from text printed out in main window ' , ' Here is the output from the run ' , out )
print ( ' Copy and paste this line into the command prompt to manually run PyInstaller: \n \n ' , command_line )
2018-10-15 00:51:18 +00:00
2020-05-13 12:19:43 +00:00
def runCommand ( cmd , timeout = None , window = None ) :
""" run shell command
2018-10-15 00:51:18 +00:00
2020-05-13 12:19:43 +00:00
@param cmd : command to execute
@param timeout : timeout for command execution
2018-10-15 00:51:18 +00:00
2020-05-13 12:19:43 +00:00
@return : ( return code from command , command output )
"""
2018-10-15 00:51:18 +00:00
p = subprocess . Popen ( cmd , shell = True , stdout = subprocess . PIPE , stderr = subprocess . STDOUT )
2020-05-13 12:19:43 +00:00
output = ' '
for line in p . stdout :
line = line . decode ( errors = ' replace ' if ( sys . version_info ) < ( 3 , 5 )
else ' backslashreplace ' ) . rstrip ( )
output + = line
print ( line )
if window :
window . Refresh ( )
retval = p . wait ( timeout )
return ( retval , output )
2018-10-15 00:51:18 +00:00
if __name__ == ' __main__ ' :
2020-05-13 12:19:43 +00:00
main ( )