рдХреАрдбрд╝рд╛
рд╡рд┐рдВрдбреЛрдЬ 7
3.5
4.4.1
рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдиреБрднрд╡
1
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдиреБрднрд╡
7
рдкрд╣рд▓реЗ рдПрдХ рдФрд░ рдкрд╛рдпрдерди рдЬреАрдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ (tkiner, Qt, рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ (рд╣рд╛рдБ/рдирд╣реАрдВ рдареАрдХ рд╣реИ)?
рд╣рд╛рдВ
рдореИрдВ PySimpleGUI рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╣реВрдБред рдЬрдм рдореИрдВ рдореЙрдбреНрдпреВрд▓ рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ exe рдореЗрдВ py рдкреИрдХ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдиреАрдЪреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреА рддрд░рд╣ рдХреНрд░реИрд╢ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЕрдкрдиреА py рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реАрдзреЗ cmd рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реВрдБ, рддреЛ рдпрд╣ рдареАрдХ рд╣реИред рддреЛ рдХреГрдкрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП? рдзрдиреНрдпрд╡рд╛рджред
рдУрдХреЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ 7 рдкрд░ рдПрдХреНрд╕рдИ рдлрд╛рдЗрд▓ рдХреНрд░реИрд╢:
SimpleDemoTestSubprocess.py:
import PySimpleGUI as sg
import subprocess
def runCommand(cmd, timeout=None):
""" run shell command
<strong i="38">@param</strong> cmd: command to execute
<strong i="39">@param</strong> timeout: timeout for command execution
<strong i="40">@return</strong>: (return code from command, command output)
"""
prt('runCommand, cmd = ' + str(cmd))
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = ''
prt('runCommand, communicate')
out, err = p.communicate()
prt('runCommand, wait')
p.wait(timeout)
prt(out)
prt(err)
return (out, err)
def prt(self, *args, sep=' ', end='\n', file=None):
print()
print(self, *args, sep=' ', end='\r\n', file=None)
# All the stuff inside your window.
layout = [
[sg.Text('Some text on Row 1')]
, [sg.Text('Enter something on Row 2'), sg.InputText()]
, [sg.Button('Ok'), sg.Button('Cancel')]
# , [sg.PopupScrolled('Hello From PySimpleGUI!', 'This is the shortest GUI program ever!')]
]
# Create the Window
window = sg.Window('Window Title', layout)
# Event Loop to process "events" and get the "values" of the inputs
while True:
event, values = window.read()
if event in (None, 'Cancel'): # if user closes window or clicks cancel
break
if event in (None, 'Ok'): # if user closes window or clicks cancel
runCommand("ls")
print('You entered ', values[0])
window.close()
exe рдореЗрдВ рдкреИрдХреЗрдЬ py:
# https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_EXE_Maker.py
import PySimpleGUI as sg
import subprocess
from shutil import copyfile
import shutil
import os
def prt(self, *args, sep=' ', end='\n', file=None):
print()
print(self, *args, sep=' ', end='\r\n', file=None)
def Launcher():
sg.ChangeLookAndFeel('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=(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',
auto_size_text=False,
auto_size_buttons=False,
default_element_size=(20, 1,),
text_justification='right')
window.Layout(layout)
# ---===--- 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_']
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])
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)
if button == 'Make EXE':
try:
prt('source_file: ' + str(source_file))
prt('Making EXE... this will take a while.. the program has NOT locked up...')
window.Refresh()
prt('window.Refresh')
window.Refresh()
prt('Running command: {}'.format(command_line))
runCommand(command_line)
shutil.rmtree(folder_to_remove)
os.remove(file_to_remove)
prt('**** DONE ****')
except Exception as e:
# sg.PopupError('Something went wrong')
prt("Launcher, Exception = " + e)
def runCommand(cmd, timeout=None):
""" run shell command
<strong i="6">@param</strong> cmd: command to execute
<strong i="7">@param</strong> timeout: timeout for command execution
<strong i="8">@return</strong>: (return code from command, command output)
"""
prt('runCommand, cmd = ' + str(cmd))
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = ''
prt('runCommand, communicate')
out, err = p.communicate()
prt('runCommand, wait')
p.wait(timeout)
prt(out)
prt(err)
return (out, err)
if __name__ == '__main__':
Launcher()
рдпрд╣ PyInstaller рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ EXE рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рдм рдареАрдХ рдЪрд▓рддрд╛ рд╣реИред рдЕрддреАрдд рдореЗрдВ рдореИрдВ PyInstaller рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд▓реЙрдиреНрдЪрд░ рдбреЗрдореЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЧрд┐рдЯрд╣рдм рдкрд░ EXE рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдвреВрдВрдв рдкрд╛рдпрд╛ рд╣реВрдВред
рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рдХреЙрд▓ рдФрд░ PyInstaller рдХреА рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдпрд╛ рдХрд╣реАрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВред
рдпрджрд┐ рдЖрдк рд╕рднреА PySimpleGUI рдХреЛрдб рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЕрдкрдиреА EXE рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рдХреЙрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдХрдбрд╝реА рдХреЛрдбрд┐рдВрдЧ рдХрд░рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
"рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдПрдХ EXE рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рдм рдареАрдХ рдЪрд▓рддрд╛ рд╣реИ"
рд╣рд╛рдБ рдпрд╣реА рд╣реИред
"рдпрджрд┐ рдЖрдк рд╕рднреА PySimpleGUI рдХреЛрдб рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА EXE рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ рдХреЙрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ?"
рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рд╕рднреА PySimpleGUI рдХреЛрдб рд╣рдЯрд╛ рджрд┐рдП рд╣реИрдВ, рдФрд░ рдпрд╣ рдЕрднреА рднреА рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ PySimpleGUI рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ :)
рддреЛ рдХреНрдпрд╛ PySimpleGUI рдиреЗ pyinstaller рдХреЗ рдмрдЬрд╛рдп рдЕрдиреНрдп EXE рдкреИрдХреЗрдЬрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛?
рдЗрд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛:
рдкреА = рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ред рдкреЙрдкреЗрди (рд╕реАрдПрдордбреА, рд╢реЗрд▓ = рдЯреНрд░реВ, рд╕реНрдЯрдбрдЖрдЙрдЯ = рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ред рдкрд╛рдЗрдк, рд╕реНрдЯреЗрдбрд░ = рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ред рдПрд╕рдЯреАрдбреАрдУрдпреВрдЯреА, рд╕реНрдЯрдбрд┐рди = рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ред рдкрд╛рдЗрдк)
рдзрдиреНрдпрд╡рд╛рдж!!!!!!!!!
рдореИрдВ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╕рдордп рд╕реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рди рдХреЗрд╡рд▓ рдЦреБрджрд╛рдИ рдФрд░ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡рд╛рдкрд╕ рдЖрдХрд░ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рднреА рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдмрд╣реБрдд рд╣реА рд╕рд░рд╛рд╣рдиреАрдп!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛:
рдкреА = рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ред рдкреЙрдкреЗрди (рд╕реАрдПрдордбреА, рд╢реЗрд▓ = рдЯреНрд░реВ, рд╕реНрдЯрдбрдЖрдЙрдЯ = рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ред рдкрд╛рдЗрдк, рд╕реНрдЯреЗрдбрд░ = рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ред рдПрд╕рдЯреАрдбреАрдУрдпреВрдЯреА, рд╕реНрдЯрдбрд┐рди = рд╕рдмрдкреНрд░реЛрд╕реЗрд╕ред рдкрд╛рдЗрдк)