0

I am a beginner and made my first GUI calculator using tkinter.I want to convert my py file to exe file.I tried using pyinstaller,auto-py-to-exe but when the file is ready and I run ,it shown windows error box Cannot run Script main, name of my file is main.

import getpass
from os import mkdir
import tkinter,os,time
from functools import partial
from tkinter import PhotoImage
from tkinter.constants import SEL
class Calculator(tkinter.Tk):
    '''This class creates calculator using tkinter module'''
    def __init__(self):
        super().__init__()
        
        # Changing height and width of window
        self.geometry('279x316')
        self.resizable(False,False)
        self.title('Calculator')
        image=PhotoImage('download.ico')
        self.iconbitmap(image)
        # Creating tkinter varible to store what user has entered
        self.__store_value=tkinter.StringVar()
        self.__store_value.set('')
        #Creating entry widget for input
        self.__input_user=tkinter.Entry(self,font='lucidia 20 bold',textvariable=self.__store_value) 
        self.__input_user.pack(fill='x')
        self.bind('<Return>',partial(self.click,'='))
        # This Buttons will be ther in calculator
        self._button_dict={"C":"C","(":"(",")":")","/":"/",
                          "9":9,"8":8,"7":7,"*":"*",
                          "6":6,"5":5,"4":4,"+":"+",
                          "3":3,"2":2,"1":1,"-":"-",
                          "His":"His","0":0,".":".","=":"="}
                          
    
    def create_button(self,row=5,column=4):
        '''Creates button in the window,button_dict contains name of each button and an argument to be given to click function when pressed,no of rows in calculator and no. of columns'''
        self.__main_frame=tkinter.Frame(self)
        self.__main_frame.pack(fill='both')
        k=0
        for i in range(row):
            for r in range(column):
                
                try:
                    button=tkinter.Button(self.__main_frame,text=list(self._button_dict.keys())[k],command=partial(self.click,self._button_dict[list(self._button_dict.keys())[k]]),font='lucidia 20 bold')
                    button.grid(row=i,column=r,ipadx=15)
                    self._button_dict[list(self._button_dict.keys())[k]]=button
                    k+=1
                
                except Exception as e:
                    k+=1

                
        #    configuring each button
        self._button_dict['His'].grid(ipadx=1)
        self._button_dict['C'].grid(ipadx=13)
        self._button_dict['('].grid(ipadx=18)
        self._button_dict[')'].grid(ipadx=18)
        self._button_dict['.'].grid(ipadx=18)
        self._button_dict['+'].grid(ipadx=11)
        self._button_dict['='].grid(ipadx=12)
        self._button_dict[r'*'].grid(ipadx=14)

        
       
    def click(self,arg,*event):
        if arg=='C':
            '''If click on C clears the text area'''
            self.__store_value.set('')
            self.update()
        elif arg=='His':
            if os.path.exists(f"C:\\Users\\{getpass.getuser()}\\Calculator\\Log.txt"):
                self.__his=tkinter.Tk()
                self.__his.title('History')
                im=PhotoImage('History.ico')
                self.__his.iconbitmap(im)
                with open(f"C:\\Users\\{getpass.getuser()}\\Calculator\\Log.txt") as f:
                    for i in f.read().split('\n'):
                        if i=='':
                            pass
                        else:
                            tkinter.Label(self.__his,text=i,relief='solid').pack()
            else:
                self.__store_value.set("Error")
                self.update()
                
        
        elif arg=='=':
            if self.__store_value.get()=='':
                pass
            else:
        
                try:
                    l=self.__store_value.get()
                    self.__store_value.set(eval(self.__store_value.get()))
                    
                    if os.path.exists(f"C:\\Users\\{getpass.getuser()}\\Calculator\\Log.txt"):
                        with open(f'C:\\Users\\{getpass.getuser()}\\Calculator\\Log.txt',"a") as f:
                            f.write(f"{l}={eval(l)}\n")
                    else:
                        try:
                            os.mkdir(f'C:\\Users\\{getpass.getuser()}\\Calculator')
                        except Exception as e:
                            pass
                        with open(f'C:\\Users\\{getpass.getuser()}\\Calculator\\Log.txt',"a") as f:
                            f.write(f"{l}={eval(l)}\n")
                except Exception as e:
                    self.__store_value.set('Error')
                    self.update()
        else:
            if self.__store_value.get()=='Error':
                self.__store_value.set(arg)
                self.update()
            else:
                self.__store_value.set(f'{self.__store_value.get()}{arg}')
                self.update()
    def on_closing(self):
        try:
            os.remove(f'C:\\Users\\{getpass.getuser()}\\Calculator\\Log.txt')
                
        except Exception as e:
            pass
        self.destroy()
if __name__ == "__main__":
    app=Calculator()
    app.create_button()
    app.protocol("WM_DELETE_WINDOW", app.on_closing)
    app.mainloop()

    

I got error while uploading ico images so u can find images at https://github.com/01TanmayDaga/Calculator

Please help me!!

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
  • Try running the exe in a command prompt and post the error messages shown in the command prompt. – acw1668 Aug 14 '20 at 11:30
  • Does this answer your question? [Bundling data files with PyInstaller (--onefile)](https://stackoverflow.com/questions/7674790/bundling-data-files-with-pyinstaller-onefile) – acw1668 Aug 14 '20 at 11:53
  • see, when you run the program from the `dist` folder, your icon paths and all inside of the app is wrong, hence there will be error in your code. Try moving the exe the project directory, ie, where your .py script is located. And also this could just be one of the many errors, without error code its hard what exactly the problem is(so ijust guessed this). – Delrius Euphoria Aug 14 '20 at 14:18
  • @acw1668 I tried running exe in cmd but it didnt show any error code and and the same error message was shown in the windows dialog box. – Tanmay Daga Aug 18 '20 at 02:25

1 Answers1

0

There is a very simple solution to this, make sure that all the external files (icons, images, etc.) are placed into the folder that contains the executable (.exe).

In the case of PyInstaller, the .exe is put into a folder called dist, just move all the external files that you are using in the program to that folder and it should work.

Hope it helped, Cheers!

astqx
  • 2,058
  • 1
  • 10
  • 21