I’m an economist not a programmer and I’m perfectly aware that my code is 
far from being optimized. I had some python courses online but they rarely 
go beyond the “Hello world” stuff. On the other hand, with hundreds of 
trial and error I was able to get a quite complex (for me) project which 
does exactly what it was supposed to do. What I can’t manage is to create a 
python free exe with pyinstaller. In addition I see that the 
“ModuleNotFoundError” is quite common…not only among economists.

@bwoodsend If you have the authority to throw me out of the forum then do 
it, otherwise I suggest you to not waste your time just ignoring my 
questions.

@Chris Barker the reason I joined the forum was indeed to look for help 
from human intelligence, not to stimulate the acrimony against the AI which 
is, at the end of the day, a product of programmers.
Any additional hint will be appreciated.

M
Il giorno lunedì 1 luglio 2024 alle 19:36:41 UTC+2 Chris Barker ha scritto:

> On Mon, Jul 1, 2024 at 7:12 AM Marco Fioramanti <[email protected]> 
> wrote:
>
>>  Knowing the math behind the program, I asked ChatGPT to translate it 
>> into python code.
>>
>
> Well, there's your problem :-(
>
> ChatGPT has written some horrible code for you.
>
> All the Popen calls are interesting, and well,  totally unnecessary . 
> What's interesting (to me) is that I've seen ChatGPT code like that, but in 
> that case, it was asked to translate a shell scripts into python,  so the 
> Popen stuff made sense, but in this case -- WTF?
>
> I guess we programmers are not out of job just yet :-)
>
> My advice is to try to make this the proper Python. With luck the TkInter 
> code and the math code are OK, and all you need to do is replace all the 
> Open calls with plain Python calling of functions, but ?????
>
> Not sure what to tell you other that you'll need to learn some Python -- 
> and/or get a "naturally intelligent" person to help.
>
> -CHB
>
>
>
>
>
>  
>
>> My goal is to distribute the final exe to colleagues who neither know 
>> python nor have python itself installed in their computer. Having different 
>> folder names serves the purpose of being as clear as possible with my 
>> colleagues.
>>
>> The structure of the project is:
>> MyProjetcFolder
>>       |-----IO_Analysis.py
>>       |-----SIOT_2019.xlsx (input file)
>>       |-----Manual
>>       |             |---Manual.pdf
>>       |-----Results
>>       |             |---IO_ResultsBase.xlsx
>>       |             |---IO_ResultsDomImp.xlsx
>>       |             |---…
>>       |             |---…
>>       |-----src     
>>       |             |---Mod_Base.py
>>       |             |---Mod_DomImp.py
>>       |             |---…
>>       |             |---…
>>       |-----Temp_results
>>       |             |---key_value.txt
>>       |-----myvenv (virtual environment)
>>
>> The original idea was to put the main script (IO_Analysis.py) in the src 
>> folder but I couldn’t manage to use input from and write results into same 
>> level (parallel?) folder, while if the main file is in the main folder 
>> everything seems to be easier.
>>
>> The code in the main file is the following:
>> import tkinter as tk
>> import subprocess
>> import os
>>
>> def run_python_file(file_path, root):
>>     # Run the specified Python file
>>     subprocess.Popen(['python', file_path], shell=True)
>>     # Close the current window
>>     root.destroy()
>>
>> def open_excel_file():
>>     # Specify the path to the Excel file you want to open
>>     excel_file_path = "SIOT_2019.xlsx"
>>
>>     # Check if the Excel file exists
>>     if os.path.isfile(excel_file_path):
>>         # Open the Excel file using the default program associated with 
>> .xlsx files
>>         subprocess.Popen([excel_file_path], shell=True)
>>         continue_program()
>>     else:
>>         # Display an error message if the Excel file does not exist
>>         error_message = "The specified Excel file does not exist."
>>         tk.messagebox.showerror("Error", error_message)
>>
>> def continue_program():
>>     # Create a new Tkinter window for the second pop-up
>>     root2 = tk.Toplevel(root)
>>     root2.title("Select Python File")
>>
>>     # Create a label with the question inside the first pop-up
>>     question_label = tk.Label(root2, text="Choose a model to run")
>>     question_label.pack()
>>
>>     # Function to handle button clicks for Python files
>>     def button_click(file_path):
>>         run_python_file(file_path, root2)
>>
>>     # Create six buttons for different Python files
>>     button1 = tk.Button(root2, text="Base Model", command=lambda: 
>> button_click("src\\\\\\\\Mod_Base.py"))
>>     button1.pack()
>>
>>     button2 = tk.Button(root2, text="Domestic/Import Model", 
>> command=lambda: button_click("src\\\\\\\\Mod_DomImp.py"))
>>     button2.pack()
>>
>>     button3 = tk.Button(root2, text="Employment Model", command=lambda: 
>> button_click("src\\\\\\\\Mod_Empl.py"))
>>     button3.pack()
>>
>>     button4 = tk.Button(root2, text="Value Added Model", command=lambda: 
>> button_click("src\\\\\\\\Mod_VA.py"))
>>     button4.pack()
>>
>>     button5 = tk.Button(root2, text="Endogenous Household Model", 
>> command=lambda: button_click("src\\\\\\\\Mod_EndHH.py"))
>>     button5.pack()
>>
>>     button6 = tk.Button(root2, text="Cost/Price Model", command=lambda: 
>> button_click('src\\\\\\\\Mod_CostPrice_D.py'))
>>     button6.pack()
>>
>>     # Run the Tkinter event loop for the second pop-up window
>>     root2.mainloop()
>>
>> # Create the Tkinter window for the main background
>> root = tk.Tk()
>> root.title("Main Window")
>> root.attributes('-fullscreen', True)  # Set to fullscreen mode
>> root.configure(bg='blue')
>>
>> def exit_fullscreen(event=None):
>>     root.attributes('-fullscreen', False)
>>     root.geometry("800x600")  # Optional: set to a reasonable size after 
>> exiting fullscreen
>>
>> # Bind the Escape key to exit fullscreen mode
>> root.bind("<Escape>", exit_fullscreen)
>>
>> # Function to minimize the window
>> def minimize_window():
>>     root.iconify()
>>
>> # Function to toggle fullscreen mode
>> def toggle_fullscreen():
>>     if root.attributes('-fullscreen'):
>>         root.attributes('-fullscreen', False)
>>         root.geometry("800x600")
>>     else:
>>         root.attributes('-fullscreen', True)
>>
>> # Function to close the window
>> def close_window():
>>     root.destroy()
>>
>> # Create a frame for the custom title bar
>> title_bar = tk.Frame(root, bg='blue', relief='raised', bd=2)
>> title_bar.pack(side='top', fill='x')
>>
>> # Add close button
>> close_button = tk.Button(title_bar, text='x', command=close_window, 
>> bg='light grey', fg='black', relief='flat')
>> close_button.pack(side='right', padx=5)
>>
>> # Add maximize button
>> max_button = tk.Button(title_bar, text='⬜', command=toggle_fullscreen, 
>> bg='light grey', fg='black', relief='flat')
>> max_button.pack(side='right', padx=5)
>>
>> # Add minimize button
>> min_button = tk.Button(title_bar, text='-', command=minimize_window, 
>> bg='light grey', fg='black', relief='flat')
>> min_button.pack(side='right', padx=5)
>>
>> # Create a label for Input/Output Analysis title
>> title_label = tk.Label(root, text="Input/Output Analysis", bg='blue', 
>> fg='white', font=("Helvetica", 40))
>> title_label.pack(pady=(200, 10))  # Aumenta il valore del pady per 
>> spostare la label più in basso
>>
>> # Create a frame for the central content
>> content_frame = tk.Frame(root, bg='blue')
>> content_frame.pack(expand=True)
>>
>> # Create a label with the question inside the first pop-up
>> question_label = tk.Label(content_frame, text="Do you want to open the 
>> Excel Input file?", bg='blue', fg='white', font=("Helvetica", 16))
>> question_label.pack(pady=20)
>>
>> # Create a frame for the buttons to be centered
>> button_frame = tk.Frame(content_frame, bg='blue')
>> button_frame.pack()
>>
>> # Create the "Yes" button to open the Excel file with larger size
>> yes_button = tk.Button(button_frame, text="Yes", command=open_excel_file, 
>> font=("Helvetica", 16), width=10, height=2)
>> yes_button.pack(side="left", padx=10)
>>
>> # Create the "No" button to continue the program with larger size
>> no_button = tk.Button(button_frame, text="No", command=continue_program, 
>> font=("Helvetica", 16), width=10, height=2)
>> no_button.pack(side="left", padx=10)
>>
>> # Create the "Exit" button to close the main window
>> exit_button = tk.Button(button_frame, text="Exit", command=close_window, 
>> font=("Helvetica", 16), width=10, height=2)
>> exit_button.pack(side="left", padx=10)
>>
>> # Funzione per aprire il file di help
>> def open_help_file():
>>     # Specifica il percorso del file di help
>>     help_file_path = "Manual\\\\\\\\IO_Analysis_Manual.pdf"  
>>
>>     # Controlla se il file di help esiste
>>     if os.path.isfile(help_file_path):
>>         # Apri il file di help usando il programma predefinito associato 
>> ai file PDF
>>         subprocess.Popen([help_file_path], shell=True)
>>     else:
>>         # Mostra un messaggio di errore se il file di help non esiste
>>             error_message = "Il file di help specificato non esiste."
>>             tk.messagebox.showerror("Errore", error_message)
>>
>>     # Creare il pulsante "Go to manual"
>> manual_button = tk.Button(button_frame, text="Go to Manual", 
>> command=open_help_file, font=("Helvetica", 16), width=15, height=2)
>> manual_button.pack(side="right", padx=100)
>>
>>     # Run the Tkinter event loop for the main window
>> root.mainloop()
>>
>>
>> My question: are you suggesting me to move all the .py files in the main 
>> folder and then change the 5th line of the code (comments excluded)
>> subprocess.Popen(['python', file_path], shell=True) 
>> with     
>> import IO_Analysis; IO_Analysis.file_path()
>>
>> Thank you for any additional help you can give me.
>>
>> M
>>
>> Il giorno domenica 30 giugno 2024 alle 18:39:59 UTC+2 bwoodsend ha 
>> scritto:
>>
>> If I’m reading this right, you’ve got raw .py scripts in the src folder 
>> and presumably you’re running them as subprocesses using something akin to 
>> subprocess.run(["python", 
>> "src/IO_Analysis.py"]) or possibly something involving exec()? So you’re 
>> giving code to PyInstaller as data files so it has no idea that it needs to 
>> scan them for dependencies and you’re invoking that code using a random 
>> Python interpreter instead of the one PyInstaller collected so even if 
>> PyInstaller did know to collect numpy, you wouldn’t be able to use it 
>> anyway.
>>
>> I suggest that you stop trying to structure your code like a C++ project. 
>> Move everything out of src and into the top level of your project then 
>> use import IO_Analysis; IO_Analysis.do_something() instead of whatever 
>> you're using to invoke the other scripts. Or better yet, learn how to 
>> properly 
>> structure Python projects 
>> <https://packaging.python.org/en/latest/tutorials/packaging-projects/>.
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "PyInstaller" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected].
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/pyinstaller/ee0037ed-4bec-4e68-bb2e-1b5f6770707dn%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/pyinstaller/ee0037ed-4bec-4e68-bb2e-1b5f6770707dn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
>
> -- 
>
> Christopher Barker, Ph.D.
> Oceanographer
>
> Emergency Response Division
> NOAA/NOS/OR&R            (206) 526-6959   voice
> 7600 Sand Point Way NE   (206) 526-6329   fax
> Seattle, WA  98115       (206) 526-6317   main reception
>
> [email protected]
>

-- 
You received this message because you are subscribed to the Google Groups 
"PyInstaller" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyinstaller/3a1484e4-1d7a-4423-933b-a127a7780cd2n%40googlegroups.com.

Reply via email to