【发布时间】:2025-12-02 19:05:01
【问题描述】:
我是 PySimpleGUI 的新手。当我使用模块子进程并将 py 打包成 exe 时,它总是像下面的截图一样崩溃。但是当我直接在cmd中运行我的py文件时,就很好了。所以有人请告诉我如何解决它?谢谢。
SimpleDemoSubprocess Test.py:
import PySimpleGUI as sg
import subprocess
def runCommand(cmd, timeout=None):
""" run shell command
@param cmd: command to execute
@param timeout: timeout for command execution
@return: (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)
sg.Popup(out)
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()
将py打包成exe:
# 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
@param cmd: command to execute
@param timeout: timeout for command execution
@return: (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()
【问题讨论】:
-
在控制台中运行 exe 以查看是否收到错误消息。通常,创建 exe 的程序无法找到所有需要的模块,并且程序无法加载某些模块。
-
@furas,对您的误解深表歉意。 exe很好,只有调用子进程导致ok按钮崩溃。这种崩溃也可以在控制台打印吗?
-
你不知道你遇到了什么类型或崩溃,所以总是在控制台中运行代码,看看你是否没有收到错误消息。并且 exe 可以正确启动,但它可能会崩溃,因为它没有子进程可能需要的某些元素 - 这可能是您用来创建 .exe 的程序的问题。
-
好的,我测试过了,在CLI里没问题。所以它必须是py-exe包,我该如何修复它?因为它是从官方网站复制的官方packge代码。
-
CLI 崩溃时不会出现任何错误吗?
标签: python windows crash pysimplegui