Merge pull request #5126 from PySimpleGUI/Dev-latest

Removed all code that is now part of PySimpleGUI.  Was duplicating a …
This commit is contained in:
PySimpleGUI 2022-01-24 17:55:22 -05:00 committed by GitHub
commit 5f26b86baa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 182 deletions

View File

@ -1,12 +1,10 @@
import os.path
import subprocess
import sys
import mmap, re
import warnings
import PySimpleGUI as sg
"""
PySimpleGUI Demo Program Browser
@ -33,15 +31,9 @@ import PySimpleGUI as sg
Keeps a "history" of the previously chosen folders to easy switching between projects
Copyright 2021 PySimpleGUI.org
Copyright 2021, 2022 PySimpleGUI.org
"""
def running_linux():
return sys.platform.startswith('linux')
def running_windows():
return sys.platform.startswith('win')
def get_file_list_dict():
"""
Returns dictionary of files
@ -232,7 +224,7 @@ def find_in_file(string, demo_files_dict, regex=False, verbose=False, window=Non
matches = None
with open(full_filename, 'rb', 0) as f, mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as s:
if (regex):
if regex:
window['-FIND NUMBER-'].update(f'{num_files} files')
window.refresh()
matches = re.finditer(bytes("^.*(" + string + ").*$", 'utf-8'), s, re.MULTILINE)
@ -249,13 +241,13 @@ def find_in_file(string, demo_files_dict, regex=False, verbose=False, window=Non
window['-FIND NUMBER-'].update(f'{num_files} files')
window.refresh()
matches = None
if (ignore_case):
if (show_first_match):
if ignore_case:
if show_first_match:
matches = re.search(br'(?i)^' + bytes(".*("+re.escape(string.lower()) + ").*$", 'utf-8'), s, re.MULTILINE)
else:
matches = re.finditer(br'(?i)^' + bytes(".*("+re.escape(string.lower()) + ").*$", 'utf-8'), s, re.MULTILINE)
else:
if (show_first_match):
if show_first_match:
matches = re.search(br'^' + bytes(".*("+re.escape(string) + ").*$", 'utf-8'), s, re.MULTILINE)
else:
matches = re.finditer(br'^' + bytes(".*("+re.escape(string) + ").*$", 'utf-8'), s, re.MULTILINE)
@ -311,7 +303,7 @@ def find_in_file(string, demo_files_dict, regex=False, verbose=False, window=Non
file_match_list = []
if (verbose):
if verbose:
sg.cprint(f"{tail}:", c='white on green')
try:
dupe_lines = []
@ -320,7 +312,7 @@ def find_in_file(string, demo_files_dict, regex=False, verbose=False, window=Non
dupe_lines.append(line_num_match)
file_array_new.append(line_num_match)
file_match_list.append(_match) # I *really* overthinked this.
if (verbose):
if verbose:
sg.cprint(f"Line: {line_num_match} ", c='white on purple', end='')
sg.cprint(f"{_match.strip()}\n")
# Make a list of the matches found in this file to add to the dictionry
@ -328,7 +320,7 @@ def find_in_file(string, demo_files_dict, regex=False, verbose=False, window=Non
file_array_old.append(file_array_new)
file_array_old.append(file_match_list)
if (tail in file_lines_dict):
if tail in file_lines_dict:
for i in range(1, 100):
new_tail = f'{tail}_{i}'
if new_tail not in file_lines_dict:
@ -478,7 +470,7 @@ def make_window():
[sg.Button('Edit Me (this program)'), sg.B('Settings'), sg.Button('Exit')],
[sg.T('PySimpleGUI ver ' + sg.version.split(' ')[0] + ' tkinter ver ' + sg.tclversion_detailed, font='Default 8', pad=(0,0))],
[sg.T('Python ver ' + sys.version, font='Default 8', pad=(0,0))],
[sg.T('Interpreter ' + execute_py_get_interpreter(), font='Default 8', pad=(0,0))],
[sg.T('Interpreter ' + sg.execute_py_get_interpreter(), font='Default 8', pad=(0,0))],
]
options_at_bottom = sg.pin(sg.Column([[sg.CB('Verbose', enable_events=True, k='-VERBOSE-'),
@ -562,12 +554,12 @@ def main():
sg.cprint(f'{full_filename}', c='white on purple')
# if line != 1:
if using_local_editor():
execute_command_subprocess(editor_program, full_filename)
sg.execute_command_subprocess(editor_program, full_filename)
else:
try:
sg.execute_editor(full_filename, line_number=int(line))
except:
execute_command_subprocess(editor_program, full_filename)
sg.execute_command_subprocess(editor_program, full_filename)
# else:
# sg.execute_editor(full_filename)
else:
@ -579,10 +571,9 @@ def main():
file_to_run = str(file_list_dict[file])
sg.cprint(file_to_run,text_color='white', background_color='purple')
try:
sp = execute_py_file(file_to_run, pipe_output=values['-WAIT-'])
except TypeError:
sg.cprint('Consider upgrading to a newer PySimpleGUI.... 4.37.0 has better execution controls', c='white on red')
sp = execute_py_file_with_pipe_output(f'{file_to_run}', pipe_output=values['-WAIT-'])
sp = sg.execute_py_file(file_to_run, pipe_output=values['-WAIT-'])
except Exception as e:
sg.cprint(f'Error trying to run python file. Error info:', e, c='white on red')
try:
if values['-WAIT-']:
sg.cprint(f'Waiting on results..', text_color='white', background_color='red', end='')
@ -600,7 +591,7 @@ def main():
editor_program = get_editor()
sg.cprint(f'opening using {editor_program}:')
sg.cprint(f'{__file__}', text_color='white', background_color='red', end='')
execute_command_subprocess(f'{editor_program}', f'"{__file__}"')
sg.execute_command_subprocess(f'{editor_program}', f'"{__file__}"')
elif event == '-FILTER-':
new_list = [i for i in file_list if values['-FILTER-'].lower() in i.lower()]
window['-DEMO LIST-'].update(new_list)
@ -692,10 +683,10 @@ def main():
for file in values['-DEMO LIST-']:
file_selected = str(file_list_dict[file])
file_path = os.path.dirname(file_selected)
if running_windows():
if sg.running_windows():
file_path = file_path.replace('/', '\\')
sg.cprint(file_path, text_color='white', background_color='purple')
execute_command_subprocess(explorer_program, file_path)
sg.execute_command_subprocess(explorer_program, file_path)
elif event == 'Copy Path':
for file in values['-DEMO LIST-']:
sg.cprint('Copying the last highlighted filename in your list')
@ -708,162 +699,6 @@ def main():
sg.clipboard_set(full_filename)
window.close()
#
# .########.##.....##.########..######......######.....###....##.......##........######.
# .##........##...##..##.......##....##....##....##...##.##...##.......##.......##....##
# .##.........##.##...##.......##..........##........##...##..##.......##.......##......
# .######......###....######...##..........##.......##.....##.##.......##........######.
# .##.........##.##...##.......##..........##.......#########.##.......##.............##
# .##........##...##..##.......##....##....##....##.##.....##.##.......##.......##....##
# .########.##.....##.########..######......######..##.....##.########.########..######.
#
# .##....##..#######..########..##.....##....###....##.......##.......##....##
# .###...##.##.....##.##.....##.###...###...##.##...##.......##........##..##.
# .####..##.##.....##.##.....##.####.####..##...##..##.......##.........####..
# .##.##.##.##.....##.########..##.###.##.##.....##.##.......##..........##...
# .##..####.##.....##.##...##...##.....##.#########.##.......##..........##...
# .##...###.##.....##.##....##..##.....##.##.....##.##.......##..........##...
# .##....##..#######..##.....##.##.....##.##.....##.########.########....##...
#
# .########..########...#######..##.....##.####.########..########.########.
# .##.....##.##.....##.##.....##.##.....##..##..##.....##.##.......##.....##
# .##.....##.##.....##.##.....##.##.....##..##..##.....##.##.......##.....##
# .########..########..##.....##.##.....##..##..##.....##.######...##.....##
# .##........##...##...##.....##..##...##...##..##.....##.##.......##.....##
# .##........##....##..##.....##...##.##....##..##.....##.##.......##.....##
# .##........##.....##..#######.....###....####.########..########.########.
#
# .########..##....##....########...######...######..
# .##.....##..##..##.....##.....##.##....##.##....##.
# .##.....##...####......##.....##.##.......##.......
# .########.....##.......########...######..##...####
# .##.....##....##.......##..............##.##....##.
# .##.....##....##.......##........##....##.##....##.
# .########.....##.......##.........######...######..
def execute_py_file_with_pipe_output(pyfile, parms=None, cwd=None, interpreter_command=None, wait=False, pipe_output=False):
"""
Executes a Python file.
The interpreter to use is chosen based on this priority order:
1. interpreter_command paramter
2. global setting "-python command-"
3. the interpreter running running PySimpleGUI
:param pyfile: the file to run
:type pyfile: (str)
:param parms: parameters to pass on the command line
:type parms: (str)
:param cwd: the working directory to use
:type cwd: (str)
:param interpreter_command: the command used to invoke the Python interpreter
:type interpreter_command: (str)
:param wait: the working directory to use
:type wait: (bool)
:param pipe_output: If True then output from the subprocess will be piped. You MUST empty the pipe by calling execute_get_results or your subprocess will block until no longer full
:type pipe_output: (bool)
:return: Popen object
:rtype: (subprocess.Popen) | None
"""
if pyfile[0] != '"' and ' ' in pyfile:
pyfile = '"'+pyfile+'"'
try:
if interpreter_command is not None:
python_program = interpreter_command
else:
python_program = sg.pysimplegui_user_settings.get('-python command-', '')
except:
python_program = ''
if python_program == '':
python_program = 'python' if sys.platform.startswith('win') else 'python3'
if parms is not None and python_program:
sp = execute_command_subprocess_with_pipe_output(python_program, pyfile, parms, wait=wait, cwd=cwd, pipe_output=pipe_output)
elif python_program:
sp = execute_command_subprocess_with_pipe_output(python_program, pyfile, wait=wait, cwd=cwd, pipe_output=pipe_output)
else:
print('execute_py_file - No interpreter has been configured')
sp = None
return sp
def execute_command_subprocess_with_pipe_output(command, *args, wait=False, cwd=None, pipe_output=False):
"""
Runs the specified command as a subprocess.
By default the call is non-blocking.
The function will immediately return without waiting for the process to complete running. You can use the returned Popen object to communicate with the subprocess and get the results.
Returns a subprocess Popen object.
:param command: Filename to load settings from (and save to in the future)
:type command: (str)
:param *args: Variable number of arguments that are passed to the program being started as command line parms
:type *args: (Any)
:param wait: If True then wait for the subprocess to finish
:type wait: (bool)
:param cwd: Working directory to use when executing the subprocess
:type cwd: (str))
:param pipe_output: If True then output from the subprocess will be piped. You MUST empty the pipe by calling execute_get_results or your subprocess will block until no longer full
:type pipe_output: (bool)
:return: Popen object
:rtype: (subprocess.Popen)
"""
try:
if args is not None:
expanded_args = ' '.join(args)
# print('executing subprocess command:',command, 'args:',expanded_args)
if command[0] != '"' and ' ' in command:
command = '"'+command+'"'
# print('calling popen with:', command +' '+ expanded_args)
# sp = subprocess.Popen(command +' '+ expanded_args, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=cwd)
if pipe_output:
sp = subprocess.Popen(command +' '+ expanded_args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd)
else:
sp = subprocess.Popen(command +' '+ expanded_args, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=cwd)
else:
sp = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd)
if wait:
out, err = sp.communicate()
if out:
print(out.decode("utf-8"))
if err:
print(err.decode("utf-8"))
except Exception as e:
print('** Error executing subprocess **', 'Command:', command)
print('error:', e)
sp = None
return sp
def execute_py_get_interpreter():
"""
Returns the command that was specified in the global options that will be used to execute Python files
when the execute_py_file function is called.
:return: Full path to python interpreter or '' if nothing entered
:rtype: (str)
"""
return sg.pysimplegui_user_settings.get('-python command-', '')
# Normally you want to use the PySimpleGUI version of these functions
try:
execute_py_file = sg.execute_py_file
except:
execute_py_file = execute_py_file_with_pipe_output
try:
execute_py_get_interpreter = sg.execute_py_get_interpreter
except:
execute_py_get_interpreter = execute_py_get_interpreter
try:
execute_command_subprocess = sg.execute_command_subprocess
except:
execute_command_subprocess = execute_command_subprocess_with_pipe_output