From cb38f818e12ad94b50db1cbe428e1f0896f29a8f Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Wed, 13 May 2020 08:19:43 -0400 Subject: [PATCH] Cleanup of EXE Maker. Biggest potential impact is the --clean flag when calling pyinstaller --- DemoPrograms/Demo_EXE_Maker.py | 64 +++++++-------- .../pysimplegui-exemaker.py | 77 ++++++++++--------- 2 files changed, 75 insertions(+), 66 deletions(-) diff --git a/DemoPrograms/Demo_EXE_Maker.py b/DemoPrograms/Demo_EXE_Maker.py index 5cc8cfb9..9e02bc74 100644 --- a/DemoPrograms/Demo_EXE_Maker.py +++ b/DemoPrograms/Demo_EXE_Maker.py @@ -1,14 +1,13 @@ import PySimpleGUI as sg import subprocess -from shutil import copyfile import shutil import os - +import sys ''' Make a "Windows os" executable with PyInstaller ''' -def Launcher(): +def main(): sg.theme('LightGreen') layout = [[sg.Text('PyInstaller EXE Creator', font='Any 15')], @@ -18,16 +17,11 @@ def Launcher(): sg.FileBrowse(file_types=(("Icon Files", "*.ico"),))], [sg.Frame('Output', font='Any 15', layout=[ [sg.Output(size=(65, 15), font='Courier 10')]])], - [sg.ReadFormButton('Make EXE', bind_return_key=True), - sg.SimpleButton('Quit', button_color=('white', 'firebrick3')), ]] - - window = sg.Window('PySimpleGUI EXE Maker', - layout, - auto_size_text=False, - auto_size_buttons=False, - default_element_size=(20, 1,), - text_justification='right') + [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')]] + window = sg.Window('PySimpleGUI EXE Maker', layout, auto_size_text=False, auto_size_buttons=False, default_element_size=(20,1), text_justification='right') # ---===--- Loop taking in user input --- # while True: @@ -44,39 +38,47 @@ def Launcher(): dispath_option = '--distpath "{}"'.format(source_path) specpath_option = '--specpath "{}"'.format(source_path) folder_to_remove = os.path.join(source_path, source_filename[:-3]) - 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) + 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) if event == 'Make EXE': try: print(command_line) - print( - 'Making EXE...the program has NOT locked up...') + print('Making EXE...the program has NOT locked up...') window.refresh() # print('Running command {}'.format(command_line)) - runCommand(command_line) + out, err = runCommand(command_line, window=window) shutil.rmtree(folder_to_remove) os.remove(file_to_remove) print('**** DONE ****') except: - sg.popup_error('Something went wrong') + 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) -def runCommand(cmd, timeout=None): - """ - run shell command +def runCommand(cmd, timeout=None, window=None): + """ run shell command - @param cmd: command to execute - @param timeout: timeout for command execution + @param cmd: command to execute + @param timeout: timeout for command execution + + @return: (return code from command, command output) + """ - @return: (return code from command, command output) - """ p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - out, err = p.communicate() - p.wait(timeout) - return (out, err) + 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) + if __name__ == '__main__': - Launcher() + main() diff --git a/exemaker/pysimplegui-exemaker/pysimplegui-exemaker.py b/exemaker/pysimplegui-exemaker/pysimplegui-exemaker.py index 1b246c38..9e02bc74 100644 --- a/exemaker/pysimplegui-exemaker/pysimplegui-exemaker.py +++ b/exemaker/pysimplegui-exemaker/pysimplegui-exemaker.py @@ -1,53 +1,53 @@ import PySimpleGUI as sg import subprocess -from shutil import copyfile import shutil import os +import sys +''' + Make a "Windows os" executable with PyInstaller +''' -def Launcher(): - sg.ChangeLookAndFeel('LightGreen') +def main(): + sg.theme('LightGreen') - layout = [[sg.T('PyInstaller EXE Creator', font='Any 15')], - [sg.T('Source Python File'), sg.In(key='_sourcefile_', size=(45,1)), sg.FileBrowse(file_types=(("Python Files", "*.py"),))], - [sg.T('Icon File'), sg.In(key='_iconfile_', size=(45,1)), sg.FileBrowse(file_types=(("Icon Files", "*.ico"),))], - [sg.Frame('Output', font='Any 15',layout= [[sg.Output(size=(85, 15), font='Courier 10')]])], - [sg.ReadFormButton('Make EXE',bind_return_key=True), - sg.SimpleButton('Quit', button_color=('white','firebrick3')),]] - - window = sg.Window('PySimpleGUI EXE Maker', - auto_size_text=False, - auto_size_buttons=False, - default_element_size=(20,1), - text_justification='right') - - window.Layout(layout) + 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')]])], + [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')]] + window = sg.Window('PySimpleGUI EXE Maker', layout, auto_size_text=False, auto_size_buttons=False, default_element_size=(20,1), text_justification='right') # ---===--- Loop taking in user input --- # while True: - (button, values) = window.Read() - if button in ('Quit', None): - break # exit button clicked - source_file = values['_sourcefile_'] - icon_file = values['_iconfile_'] + event, values = window.read() + if event in ('Exit', 'Quit', None): + break + + source_file = values['-sourcefile-'] + icon_file = values['-iconfile-'] 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) - folder_to_remove = os.path.join(source_path,source_filename[:-3]) + folder_to_remove = os.path.join(source_path, source_filename[:-3]) file_to_remove = os.path.join(source_path, source_filename[:-3]+'.spec') - command_line = 'pyinstaller -wF "{}" {} {} {} {}'.format(source_file, icon_option, workpath_option, dispath_option, specpath_option) + command_line = 'pyinstaller -wF --clean "{}" {} {} {} {}'.format(source_file, icon_option, workpath_option, dispath_option, specpath_option) - if button == 'Make EXE': - out='' + if event == 'Make EXE': try: print(command_line) - print('Making EXE... this will take a while.. the program has NOT locked up...') - window.Refresh() + print('Making EXE...the program has NOT locked up...') + window.refresh() # print('Running command {}'.format(command_line)) - out, err = runCommand(command_line) + out, err = runCommand(command_line, window=window) shutil.rmtree(folder_to_remove) os.remove(file_to_remove) print('**** DONE ****') @@ -56,7 +56,7 @@ def Launcher(): print('Copy and paste this line into the command prompt to manually run PyInstaller:\n\n', command_line) -def runCommand(cmd, timeout=None): +def runCommand(cmd, timeout=None, window=None): """ run shell command @param cmd: command to execute @@ -64,14 +64,21 @@ def runCommand(cmd, timeout=None): @return: (return code from command, command output) """ + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 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() - out, err = p.communicate() - p.wait(timeout) + retval = p.wait(timeout) + + return (retval, output) - return (out, err) if __name__ == '__main__': - Launcher() - + main()