@@ -58,12 +59,24 @@ Thanks goes to these **Wonderful People** 👨🏻💻: 🚀 **Contribut
[](https://starchart.cc/avinashkranjan/Amazing-Python-Scripts)
- Project Admin ❤️
-
-
-
-
-
|
+
Project Maintainers ❤️
+
+
+ Avinash Ranjan
+ |
+
+ Kaustubh Gupta
+ |
+
+ Antriksh Misri
+ |
+ Santushti Sharma
+ |
+
+ Kushal Das  |
+
+
+
Happy Coding 👨💻
diff --git a/Rain Alert Mail Sender/README.md b/Rain Alert Mail Sender/README.md
new file mode 100644
index 0000000000..e22de0df89
--- /dev/null
+++ b/Rain Alert Mail Sender/README.md
@@ -0,0 +1,11 @@
+# Rain Alert Mail Sender
+
+ An application that checks the weather condition for the next 12 hours and sends a message to the registered mail address number as to whether one should carry a sunglass (if it is sunny) , or an umbrella (if it rains).
+
+Libraries used : requests, smtp, time, datetime
+
+
+
+
+# Author(s)
+Shubhrima Jana
diff --git a/Rain Alert Mail Sender/main.py b/Rain Alert Mail Sender/main.py
new file mode 100644
index 0000000000..4f19152e72
--- /dev/null
+++ b/Rain Alert Mail Sender/main.py
@@ -0,0 +1,56 @@
+import requests
+from smtplib import SMTP
+import os
+from dotenv import load_dotenv
+
+load_dotenv()
+
+def function():
+ """Go to Manage your Google(or any mail) account, and then headover to Security.\nTurn OFF the options 'Two Step Verification' and 'Use your phone to sign in' in the Signing in to Google section.\nTurn ON the Less secure apps section.
+ """
+ return 0
+print(function.__doc__)
+MY_MAIL= os.getenv('MAIL')
+MY_PASSWORD= os.getenv('PASSWORD')
+RECIEVER_MAIL = input('Send mail to (mail id): ')
+CITY = input('Enter your City: ')
+
+API_KEY = os.getenv('API')
+
+API_END_POINT ='https://nominatim.openstreetmap.org/search.php'
+PARAMETER_LOCATION ={
+ 'city' : CITY,
+ 'format': 'json',
+}
+response_location = requests.get(url = API_END_POINT, params=PARAMETER_LOCATION)
+data_location = response_location .json()
+LAT = data_location [0]['lat']
+LONG = data_location [0]['lon']
+PARAMETER= {
+ "lat": LAT,
+ "lon": LONG,
+ "appid" : API_KEY,
+ "exclude" : "current,minutely,daily",
+}
+api = requests.get(url="http://api.openweathermap.org/data/2.5/onecall",params=PARAMETER)
+data = api.json()
+
+bring_umbrella = False
+
+for i in range(0,12):
+ hourly_condition = data['hourly'][i]['weather'][0]['id']
+ if(hourly_condition<700):
+ bring_umbrella = True
+
+if (bring_umbrella == True):
+ MESSAGE=f"Subject: Rain Rain \n\nIt's going to rain today. Bring Umbrella "
+
+else:
+ MESSAGE = f"Subject: Sunny Day\n\nMay be a sunny day. Carry sunglasses. "
+
+with SMTP("smtp.gmail.com") as connection:
+ connection.starttls()
+ connection.login(user=MY_MAIL, password=MY_PASSWORD)
+ connection.sendmail(from_addr=MY_MAIL, to_addrs=RECIEVER_MAIL,
+ msg=MESSAGE)
+ print('Mail Sent')
diff --git a/Rain Alert Mail Sender/requirements.txt b/Rain Alert Mail Sender/requirements.txt
new file mode 100644
index 0000000000..b4f6d53390
--- /dev/null
+++ b/Rain Alert Mail Sender/requirements.txt
@@ -0,0 +1,2 @@
+requests==2.25.1
+dotenv==0.05
\ No newline at end of file
diff --git a/Real Estate Webscrapper/README.md b/Real Estate Webscrapper/README.md
new file mode 100644
index 0000000000..34e06a4b22
--- /dev/null
+++ b/Real Estate Webscrapper/README.md
@@ -0,0 +1,34 @@
+## Real Estate Webscrapper
+- It will take information from the real estate site and store it in the form of csv file making the data more organised and locally accessible.
+
+___
+
+## Requirements
+- BeautifulSoup
+- Pandas
+---
+## How To install
+> pip install pandas
+
+> pip install beautifulsoup
+---
+- Now run the real_estate_webscrapper.py file to create the output2.csv file.
+- Then output2.csv will be created in the same folder as real_estate_webscrapper.py file and it can be opened using Microsoft Excel.
+---
+### Step 1
+- Load the website https://www.magicbricks.com/ready-to-move-flats-in-new-delhi-pppfs in your code using requests.
+
+### Step 2
+- Use inspect in website to know which div contains the information that we need
+- Use beautiful soup to load the information in program and store it into a dictionary for each property
+
+### Step 3
+- Use pandas to convert the list of dictionaries to csv file
+---
+
+## Author
+[Himanshi2997](https://github.com/Himanshi2997)
+---
+
+## Output
+
diff --git a/Real Estate Webscrapper/real_estate_webscrapper.py b/Real Estate Webscrapper/real_estate_webscrapper.py
new file mode 100644
index 0000000000..dd6cd5a5fb
--- /dev/null
+++ b/Real Estate Webscrapper/real_estate_webscrapper.py
@@ -0,0 +1,75 @@
+import requests
+from bs4 import BeautifulSoup
+import pandas
+
+
+headers = {
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0',
+}
+
+r=requests.get("https://www.magicbricks.com/ready-to-move-flats-in-new-delhi-pppfs", headers=headers)
+c=r.content
+soup=BeautifulSoup(c,"html.parser")
+
+
+complete_dataset = []
+
+
+all_containers=soup.find_all("div",{"class":"flex relative clearfix m-srp-card__container"})
+for item in all_containers:
+ item_data={}
+ try:
+ Price=item.find("div",{"class":"m-srp-card__price"}).text.replace("\n","").replace(" ","").replace("₹","")
+ p=Price.split()
+ item_data["Price"]=p[0]
+
+ except:
+ Price=item.find("span",{"class":"luxury-srp-card__price"}).text.replace("\n","").replace(" ","").replace("₹","")
+ p=Price.split()
+ item_data["Price"]=p[0]
+
+
+ try:
+ Pricepersqft=item.find("div",{"class":"m-srp-card__area"}).text.replace("₹","")
+ pr=Pricepersqft.split()
+ item_data["Pricepersqft"]=pr[0]
+
+ except:
+ try:
+ Pricepersqft=item.find("span",{"class":"luxury-srp-card__sqft"}).text.replace("\n","").replace(" ","").replace("₹","")
+ pr=Pricepersqft.split()
+ item_data["Pricepersqft"]=pr[0]
+ except:
+ item_data["Pricepersqft"]=None
+
+ try:
+ item_data["Size"]=item.find("span",{"class":"m-srp-card__title__bhk"}).text.replace("\n","").strip()[0:5]
+ except:
+ item_data["Size"]=None
+
+
+ title=item.find("span",{"class":"m-srp-card__title"})
+
+ words=(title.text.replace("in","")).split()
+
+ for i in range(len(words)):
+ if words[i]=="sale" or words[i]=="Sale":
+ break
+ s=""
+ for word in range(i+1,len(words)):
+ s=s+words[word]+" "
+
+ item_data["Address"]=s
+
+ try:
+ item_data["Carpet Area"]=item.find("div",{"class":"m-srp-card__summary__info"}).text
+ except:
+ item_data["Carpet Area"]=item.find("div",{"class":"luxury-srp-card__area__value"}).text
+
+
+ complete_dataset.append(item_data)
+
+
+
+df=pandas.DataFrame(complete_dataset)
+df.to_csv("./Real Estate Webscrapper/scraped.csv")
diff --git a/Real Estate Webscrapper/requirements.txt b/Real Estate Webscrapper/requirements.txt
new file mode 100644
index 0000000000..96fc9b6a4f
--- /dev/null
+++ b/Real Estate Webscrapper/requirements.txt
@@ -0,0 +1,3 @@
+requests==2.25.1
+pandas==1.2.4
+beautifulsoup4==4.9.3
diff --git a/Reddit_Scraper_without_API/README.md b/Reddit_Scraper_without_API/README.md
new file mode 100644
index 0000000000..ec65d6c75c
--- /dev/null
+++ b/Reddit_Scraper_without_API/README.md
@@ -0,0 +1,27 @@
+# Reddit Scraper
+
+- Using BeautifulSoup, a python library useful for web scraping, this script helps to scrape a desired subreddit to obtain all relevant data regarding its posts.
+
+- In the `fetch_reddit.py` , we take user input for the subreddit name, tags and the maximum count of posts to be scraped, we fetch and store all this information in a database file.
+
+- In the `display_reddit.py` , we display the desired results from the database to the user.
+
+## Setup instructions
+
+- The requirements can be installed as follows:
+
+```shell
+ $ pip install -r requirements.txt
+```
+
+## Working screenshots
+
+
+
+#
+
+
+
+## Author
+[Rohini Rao](www.github.com/RohiniRG)
+
diff --git a/Reddit_Scraper_without_API/display_reddit.py b/Reddit_Scraper_without_API/display_reddit.py
new file mode 100644
index 0000000000..299475a23b
--- /dev/null
+++ b/Reddit_Scraper_without_API/display_reddit.py
@@ -0,0 +1,51 @@
+import sqlite3
+import os
+
+
+def sql_connection():
+ """
+ Establishes a connection to the SQL file database
+ :return connection object:
+ """
+ path = os.path.abspath('SubredditDatabase.db')
+ con = sqlite3.connect(path)
+ return con
+
+
+def sql_fetcher(con):
+ """
+ Fetches all the tweets with the given hashtag from our database
+ :param con:
+ :return:
+ """
+ subreddit = input("\nEnter subreddit to search: r/")
+ count = 0
+ cur = con.cursor()
+ cur.execute('SELECT * FROM posts') # SQL search query
+ rows = cur.fetchall()
+
+ for r in rows:
+ if subreddit in r:
+ count += 1
+ print(f'\nTAG: {r[1]}\nPOST TITLE: {r[2]}\nAUTHOR: {r[3]}\n'
+ f'TIME STAMP: {r[4]}\nUPVOTES: {r[5]}\nCOMMENTS: {r[6]}'
+ f'\nURL: {r[7]}\n')
+
+ if count:
+ print(f'{count} posts fetched from database\n')
+ else:
+ print('\nNo posts stored for this subreddit\n')
+
+
+con = sql_connection()
+
+while 1:
+ sql_fetcher(con)
+
+ ans = input('\nPress (y) to continue or any other key to exit: ').lower()
+ if ans == 'y':
+ continue
+ else:
+ print('\nExiting..\n')
+ break
+
diff --git a/Reddit_Scraper_without_API/fetch_reddit.py b/Reddit_Scraper_without_API/fetch_reddit.py
new file mode 100644
index 0000000000..1518f8af1c
--- /dev/null
+++ b/Reddit_Scraper_without_API/fetch_reddit.py
@@ -0,0 +1,159 @@
+import requests
+import csv
+import time
+import sqlite3
+from bs4 import BeautifulSoup
+
+
+def sql_connection():
+ """
+ Establishes a connection to the SQL file database
+ :return connection object:
+ """
+ con = sqlite3.connect('SubredditDatabase.db')
+ return con
+
+
+def sql_table(con):
+ """
+ Creates a table in the database (if it does not exist already)
+ to store the tweet info
+ :param con:
+ :return:
+ """
+ cur = con.cursor()
+ cur.execute("CREATE TABLE IF NOT EXISTS posts(SUBREDDIT text, TAG text, "
+ " TITLE text, AUTHOR text, TIMESTAMP text, UPVOTES int, "
+ " COMMENTS text, URL text)")
+ con.commit()
+
+
+def sql_insert_table(con, entities):
+ """
+ Inserts the desired data into the table to store tweet info
+ :param con:
+ :param entities:
+ :return:
+ """
+ cur = con.cursor()
+ cur.execute('INSERT INTO posts(SUBREDDIT, TAG, TITLE, AUTHOR, '
+ 'TIMESTAMP, UPVOTES, COMMENTS, URL) '
+ 'VALUES(?, ?, ?, ?, ?, ?, ?, ?)', entities)
+ con.commit()
+
+
+def scraper():
+ """
+ The function scrapes the post info from the desired subreddit and stores it
+ into the desired file.
+ :return:
+ """
+ con = sql_connection()
+ sql_table(con)
+
+ while 1:
+ subreddit = input('\n\nEnter the name of the subreddit: r/').lower()
+ max_count = int(input('Enter the maximum number of entries to collect: '))
+ select = int(input('Select tags to add for the search: \n1. hot\n2. new'
+ '\n3. rising\n4. controversial\n5. top\nMake your choice: '))
+
+ if select == 1:
+ tag = 'hot'
+ tag_url = '/'
+ elif select == 2:
+ tag = 'new'
+ tag_url = '/new/'
+ elif select == 3:
+ tag = 'rising'
+ tag_url = '/rising/'
+ elif select == 4:
+ tag = 'controversial'
+ tag_url = '/controversial/'
+ elif select == 5:
+ tag = 'top'
+ tag_url = '/top/'
+
+ # URL for the desired subreddit
+ url = 'https://old.reddit.com/r/' + subreddit
+
+ # Using a user-agent to mimic browser activity
+ headers = {'User-Agent': 'Mozilla/5.0'}
+
+ req = requests.get(url, headers=headers)
+
+ if req.status_code == 200:
+ soup = BeautifulSoup(req.text, 'html.parser')
+ print(f'\nCOLLECTING INFORMATION FOR r/{subreddit}....')
+
+ attrs = {'class': 'thing'}
+ counter = 1
+ full = 0
+ reddit_info = []
+ while 1:
+ for post in soup.find_all('div', attrs=attrs):
+ try:
+ # To obtain the post title
+ title = post.find('a', class_='title').text
+
+ # To get the username of the post author
+ author = post.find('a', class_='author').text
+
+ # To obtain the time of the post
+ time_stamp = post.time.attrs['title']
+
+ # To obtain the number of comments on the post
+ comments = post.find('a', class_='comments').text.split()[0]
+ if comments == 'comment':
+ comments = 0
+
+ # To get the number of comments on the post
+ upvotes = post.find('div', class_='score likes').text
+ if upvotes == '•':
+ upvotes = "None"
+
+ # To get the URL of the post
+ link = post.find('a', class_='title')['href']
+ link = 'www.reddit.com' + link
+
+ # Entering all the collected information into our database
+ entities = (subreddit, tag, title, author, time_stamp, upvotes,
+ comments, link)
+ sql_insert_table(con, entities)
+
+ if counter == max_count:
+ full = 1
+ break
+
+ counter += 1
+ except AttributeError:
+ continue
+
+ if full:
+ break
+
+ try:
+ # To go to the next page
+ next_button = soup.find('span', class_='next-button')
+ next_page_link = next_button.find('a').attrs['href']
+
+ time.sleep(2)
+
+ req = requests.get(next_page_link, headers=headers)
+ soup = BeautifulSoup(req.text, 'html.parser')
+ except:
+ break
+
+ print('DONE!\n')
+ ans = input('Press (y) to continue or any other key to exit: ').lower()
+ if ans == 'y':
+ continue
+ else:
+ print('Exiting..')
+ break
+ else:
+ print('Error fetching results.. Try again!')
+
+
+if __name__ == '__main__':
+ scraper()
+
diff --git a/Reddit_Scraper_without_API/requirements.txt b/Reddit_Scraper_without_API/requirements.txt
new file mode 100644
index 0000000000..b7a5bb209c
--- /dev/null
+++ b/Reddit_Scraper_without_API/requirements.txt
@@ -0,0 +1,7 @@
+beautifulsoup4==4.9.3
+certifi==2020.12.5
+chardet==4.0.0
+idna==2.10
+requests==2.25.1
+soupsieve==2.2.1
+urllib3==1.26.4
diff --git a/Speak-like-Yoda/README.md b/Speak-like-Yoda/README.md
new file mode 100644
index 0000000000..57188d650f
--- /dev/null
+++ b/Speak-like-Yoda/README.md
@@ -0,0 +1,24 @@
+# Speak-Like-Yoda
+
+## Description
+A python script that translates an input English sentence into Yoda-speak.
+
+## Usage
+Run ```python speak_like_yoda.py```. Type in your sentence to get it translated into Yoda-speak.
+
+## Requirements
+The script only uses Python's standard modules ```random``` and ```string```, so no additional installation is needed.
+
+## Output
+```
+Your English sentence:
+Avoiding failure is something we learn at some later point in life.
+
+Your Yodenglish sentence:
+Something is we point some failure learn avoiding later at in life
+
+```
+
+## Author(s)
+
+[Soumik Kumar Baithalu](https://www.github.com/soumik2012)
diff --git a/Speak-like-Yoda/Speak_Like_yoda.py b/Speak-like-Yoda/Speak_Like_yoda.py
new file mode 100644
index 0000000000..3e92e8d6df
--- /dev/null
+++ b/Speak-like-Yoda/Speak_Like_yoda.py
@@ -0,0 +1,23 @@
+import random
+import string
+
+def speak_like_yoda(sentence):
+ """
+ Translate the input sentence into Yoda-speak.
+
+ :param sentence: input string
+ :return: translation to Yoda-speak
+ """
+ sentence = sentence.lower()
+ for p in string.punctuation.replace("'", ''):
+ sentence = sentence.replace(p, '')
+ words = sentence.split()
+ random.shuffle(words)
+ new_sent = ' '.join(words)
+ print('\nYour Yodenglish sentence: ')
+ print(new_sent.capitalize())
+
+if __name__ == '__main__':
+ print('Your English sentence: ')
+ sentence = str(input())
+ speak_like_yoda(sentence)
diff --git a/Speak-like-Yoda/requirements.txt b/Speak-like-Yoda/requirements.txt
new file mode 100644
index 0000000000..d1357856c9
--- /dev/null
+++ b/Speak-like-Yoda/requirements.txt
@@ -0,0 +1,2 @@
+random
+string
diff --git a/Stack-overflow-scraper/README.md b/Stack-overflow-scraper/README.md
new file mode 100644
index 0000000000..0681571a06
--- /dev/null
+++ b/Stack-overflow-scraper/README.md
@@ -0,0 +1,26 @@
+# Stack overflow question scraper
+Running this Script would allow the user to scrape top questions from Stack overflow based on the question tag(python, java, etc) of their choice. The question, summary, link, votes and views will be stored in a local SQL DB.
+
+## Setup instructions
+In order to run this script, you need to have Python and pip installed on your system. After you're done installing Python and pip, run the following command from your terminal to install the requirements from the same folder (directory) of the project.
+```
+pip install -r requirements.txt
+```
+After satisfying all the requirements for the project, Open the terminal in the project folder and run
+```
+python scraper.py
+```
+or
+```
+python3 scraper.py
+```
+depending upon the python version. Make sure that you are running the command from the same virtual environment in which the required modules are installed.
+
+## Output
+
+The user can choose the question tag based on which they want to scrape top questions from Stack Overflow.
+
+
+
+## Author
+[Ayush Jain](https://github.com/Ayushjain2205)
\ No newline at end of file
diff --git a/Stack-overflow-scraper/requirements.txt b/Stack-overflow-scraper/requirements.txt
new file mode 100644
index 0000000000..a98ae430c4
--- /dev/null
+++ b/Stack-overflow-scraper/requirements.txt
@@ -0,0 +1,2 @@
+requests
+beautifulsoup4
\ No newline at end of file
diff --git a/Stack-overflow-scraper/scraper.py b/Stack-overflow-scraper/scraper.py
new file mode 100644
index 0000000000..2cb2588949
--- /dev/null
+++ b/Stack-overflow-scraper/scraper.py
@@ -0,0 +1,193 @@
+import requests
+from bs4 import BeautifulSoup
+import tkinter as tk
+from tkinter import messagebox, simpledialog
+from tkinter import ttk
+from tkinter import font as tkFont
+import time
+import sqlite3
+from sqlite3 import Error
+
+# Function to connect to the SQL Database
+def sql_connection():
+ try:
+ con = sqlite3.connect('./Stack-overflow-scraper/stackoverflow.db')
+ return con
+ except Error:
+ print(Error)
+
+# Function to create table
+def sql_table(con):
+ cursorObj = con.cursor()
+ cursorObj.execute(
+ "CREATE TABLE IF NOT EXISTS questions(question_text text, question_summary text, question_link text,votes integer, views integer )")
+ con.commit()
+
+# Call functions to connect to database and create table
+con = sql_connection()
+sql_table(con)
+
+# Function to insert into table
+def sql_insert(con, entities):
+ cursorObj = con.cursor()
+ cursorObj.execute(
+ 'INSERT INTO questions(question_text, question_summary, question_link, votes, views) VALUES(?, ?, ?, ?, ?)', entities)
+ con.commit()
+
+# Function to generate URL based on choice
+def get_URL():
+ tag = search_box.get()
+ if not tag:
+ messagebox.showinfo("Alert", "Please Enter tag!")
+ return
+ url = 'https://stackoverflow.com/questions/tagged/{}?sort=MostVotes&edited=true'.format(tag)
+ return url
+
+def number_questions():
+ questions = int(questions_box.get())
+ if type(questions) != int or questions > 15:
+ return 15
+ return questions
+
+def scrape_questions():
+ for count in range(5):
+ progress['value'] += 15
+ window.update_idletasks()
+ time.sleep(0.10)
+
+ question_count = number_questions()
+ count = 0
+
+ url = get_URL()
+ if url:
+ page = requests.get(url)
+ else:
+ clear_progress()
+ return
+
+ # Start scraping resultant html data
+ soup = BeautifulSoup(page.content, 'html.parser')
+ questions = soup.find_all('div', {'class': 'question-summary'})
+ if not questions:
+ messagebox.showinfo("Invalid", "Invalid search tag")
+ clear_progress()
+ return ""
+ for question in questions:
+ if count >= question_count:
+ break
+ question_text = question.find('a', {'class': 'question-hyperlink'}).text.strip()
+ question_summary = question.find('div', {'class': 'excerpt'}).text.strip()
+ question_summary = question_summary.replace('\n',' ')
+ question_link = 'https://stackoverflow.com{}'.format(question.find('a', {'class': 'question-hyperlink'})['href'])
+ votes = question.find('span', {'class': 'vote-count-post'}).text.strip()
+ views = question.find('div', {'class': 'views'}).text.strip().split()[0]
+ entities = (question_text, question_summary, question_link, votes, views)
+ sql_insert(con, entities)
+ count += 1
+
+ messagebox.showinfo("Success!", "Questions scrapped successfully!")
+ clear_progress()
+
+# Function to fetch stackoverflow questions from DB
+def sql_fetch(con):
+ cursorObj = con.cursor()
+ try:
+ cursorObj.execute('SELECT DISTINCT * FROM questions ORDER BY rowid DESC') # SQL search query
+ except Error:
+ print("Database empty... Fetch users using GUI")
+ return
+
+ rows = cursorObj.fetchall()
+ display_text = ""
+
+ # Show messagebox incase of empty DB
+ if len(rows) == 0 :
+ messagebox.showinfo("Alert", "No users scraped yet!")
+ return " "
+
+ first_row = "{:^65}".format("Question") + "{:^65}".format("Summary") + "{:^40}".format("Link") + "{:^15}".format("Votes") + "{:^15}".format("Views") + '\n'
+ display_text += first_row
+
+ # Format rows
+ for row in rows:
+ question_text = "{:<65}".format(
+ row[0] if len(row[0]) < 60 else row[0][:56]+"...")
+ question_summary = "{:<65}".format(
+ row[1] if len(row[1]) < 60 else row[1][:56]+"...")
+ question_link = "{:<40}".format(
+ row[2] if len(row[2]) < 30 else row[2][:36]+"...")
+ votes = "{:^15}".format(row[3])
+ views = "{:^15}".format(row[4])
+ display_text += (question_text + question_summary + question_link + votes + views +'\n')
+
+ return display_text
+
+def show_results():
+ display_text = sql_fetch(con)
+ query_label.config(state=tk.NORMAL)
+ query_label.delete(1.0, "end")
+ query_label.insert(1.0, display_text)
+ query_label.config(state=tk.DISABLED)
+
+def clear_progress():
+ #set progress bar back to 0
+ progress['value'] = 100
+ window.update_idletasks()
+ progress['value'] = 0
+ window.update_idletasks()
+
+# Creating tkinter window
+window = tk.Tk()
+window.title('Stack overflow question scraper')
+window.geometry('1200x1000')
+window.configure(bg='white')
+
+style = ttk.Style()
+style.theme_use('alt')
+style.map('my.TButton', background=[('active','white')])
+style.configure('my.TButton', font=('Helvetica', 16, 'bold'))
+style.configure('my.TButton', background='white')
+style.configure('my.TButton', foreground='orange')
+style.configure('my.TFrame', background='white')
+
+# label text for title
+ttk.Label(window, text="Stack overflow question scraper",
+ background='white', foreground="Orange",
+ font=("Helvetica", 30, 'bold')).grid(row=0, column=1)
+
+# label texts
+ttk.Label(window, text="Enter tag (ex - python):", background = 'white',
+ font=("Helvetica", 15)).grid(column=0,
+ row=5, padx=10, pady=25)
+
+ttk.Label(window, text="No of questions to scrape:", background = 'white',
+ font=("Helvetica", 15)).grid(column=0,
+ row=6, padx=10, pady=5)
+
+
+# Button creation
+scrape_btn = ttk.Button(window, text="Scrape questions!", style='my.TButton', command=scrape_questions)
+scrape_btn.grid(row=5, column=2, pady=5, padx=15, ipadx=5)
+
+display_btn = ttk.Button(window, text="Display from DB", style='my.TButton', command = show_results)
+display_btn.grid(row=6, column=2, pady=5, padx=15, ipadx=5)
+
+# Search Box
+search_box = tk.Entry(window, font=("Helvetica 15"), bd = 2, width=60)
+search_box.grid(row=5, column=1, pady=5, padx=15, ipadx=5)
+
+questions_box = tk.Entry(window, font=("Helvetica 15"), bd = 2, width=60)
+questions_box.grid(row=6, column=1, pady=5, padx=15, ipadx=5)
+
+frame = ttk.Frame(window, style='my.TFrame')
+frame.place(relx=0.50, rely=0.18, relwidth=0.98, relheight=0.90, anchor="n")
+
+# Progress bar
+progress = ttk.Progressbar(window, orient="horizontal", length=200, mode="determinate")
+progress.grid(row=5, column=5, pady=5, padx=15, ipadx=5)
+
+# To display questions data
+query_label = tk.Text(frame ,height="52" ,width="500", bg="alice blue")
+query_label.grid(row=10, columnspan=2)
+
+window.mainloop()
\ No newline at end of file
diff --git a/Stackoverflow-Tool/README.md b/Stackoverflow-Tool/README.md
new file mode 100644
index 0000000000..a7a86cc923
--- /dev/null
+++ b/Stackoverflow-Tool/README.md
@@ -0,0 +1,11 @@
+# Package/Script Name
+
+Stack Overflow Error Search Auto Tool
+
+- This script executes your python file.
+- And it opens up the related Stack Overflow threads in the browser if there's any error in the script.
+
+## Author(s)
+
+[Muskan Kalra](https://github.com/Muskan0)
+
diff --git a/Stackoverflow-Tool/requirements.txt b/Stackoverflow-Tool/requirements.txt
new file mode 100644
index 0000000000..4387b609b9
--- /dev/null
+++ b/Stackoverflow-Tool/requirements.txt
@@ -0,0 +1,3 @@
+subprocess
+requests
+webbrowser
diff --git a/Stackoverflow-Tool/script.py b/Stackoverflow-Tool/script.py
new file mode 100644
index 0000000000..d97f80dcdd
--- /dev/null
+++ b/Stackoverflow-Tool/script.py
@@ -0,0 +1,37 @@
+import subprocess
+import requests
+import webbrowser
+
+# take the input of the python file
+file=input("Enter the python file name(same directory) or enter the proper location\n")
+# executing a script and extracting the errors
+p = subprocess.run(['python', file], capture_output=True, text=True)
+s= p.stderr
+s=s.split("\n")
+s=s[-2]
+errorType= errorMessage= ""
+k=len(s)
+for i in range(k):
+ if s[i]==":":
+ break
+errorType=s[:i]
+errorMessage=s[i+1:]
+
+# using Stack Exchange API search feature
+# parsing the json and extracting the links
+URL="https://api.stackexchange.com/2.2/search"
+PARAMS= {'intitle': errorType, 'tagged': 'python', 'nottagged':errorMessage, 'sort': 'votes', 'site': 'stackoverflow'}
+r= requests.get(url= URL, params= PARAMS)
+data= r.json()
+
+links=[]
+for i in data['items']:
+ # get those question links which are answered
+ if i["is_answered"]==True:
+ links.append(i["link"])
+
+# opening links the web browser
+n1=len(links)
+for i in range(7):
+ if iTrain PNR Status
+
+[](https://forthebadge.com)
+
+## Train PNR Status Functionalities : 🚀
+
+- Enter the tesseract path
+- After entering a GUI will pop up in which enter the PNR number and click on submit
+- The script will fill the perform web scrapping and display the PNR status
+
+## Setup:
+
+- Google should be updated to latest version
+
+## Train PNR Status Instructions: 👨🏻💻
+
+### Step 1:
+
+ Open Termnial 💻
+
+### Step 2:
+
+ Locate to the directory where python file is located 📂
+
+### Step 3:
+
+ Run the command: python script.py/python3 script.py 🧐
+
+### Step 4:
+
+ Sit back and Relax. Let the Script do the Job. ☕
+
+## DEMO
+
+
+
+After clicking on submit it goes to official IRCTC website and draws the PNR status.
+
+
+## Author
+
+[Amit Kumar Mishra](https://github.com/Amit366)
+
diff --git a/Train_pnr_status/requirements.txt b/Train_pnr_status/requirements.txt
new file mode 100644
index 0000000000..e766d3f7fb
--- /dev/null
+++ b/Train_pnr_status/requirements.txt
@@ -0,0 +1,8 @@
+selenium
+PIL
+pytesseract
+io
+numpy
+time
+cv2
+tkinter
\ No newline at end of file
diff --git a/Train_pnr_status/script.py b/Train_pnr_status/script.py
new file mode 100644
index 0000000000..43e4197f60
--- /dev/null
+++ b/Train_pnr_status/script.py
@@ -0,0 +1,103 @@
+from selenium import webdriver
+from PIL import Image
+import pytesseract
+import io
+import numpy as np
+import cv2 as cv
+import time
+import tkinter
+from tkinter import ttk
+from webdriver_manager.chrome import ChromeDriverManager
+
+
+def click():
+ global inputpnrnumber
+ inputpnrnumber = str(name.get())
+ if (inputpnrnumber.isnumeric()) and ( len(inputpnrnumber) == 10 ) :
+ window.destroy()
+
+
+def GUI() :
+ window.title("PNR STATUS")
+ lbl = ttk.Label(window, text = " ")
+ lbl.grid(column = 0, row = 0)
+ lbl = ttk.Label(window, text = " Enter PNR Number: ")
+ lbl.grid(column = 0, row = 1)
+ nameEntered = ttk.Entry(window, width = 12, textvariable = name)
+ nameEntered.grid(column = 1, row = 1)
+ lbl = ttk.Label(window, text = " ")
+ lbl.grid(column = 2, row = 1)
+ lbl = ttk.Label(window, text = " ")
+ lbl.grid(column = 1, row = 2)
+ button = ttk.Button(window, text = "Submit", command = click)
+ button.grid(column = 1, row = 3)
+ lbl = ttk.Label(window, text = " ")
+ lbl.grid(column = 1, row = 4)
+ window.mainloop()
+
+window = tkinter.Tk()
+name = tkinter.StringVar()
+url="http://www.indianrail.gov.in/enquiry/PNR/PnrEnquiry.html?locale=en"
+
+GUI()
+
+#google = input(r"Enter google executable path");
+tess = input(r"Enter tesseract path: ");
+
+browser = webdriver.Chrome(
+ executable_path=ChromeDriverManager().install())
+browser.get(url)
+pnrnumber = browser.find_element_by_id('inputPnrNo')
+pnrnumber.send_keys(inputpnrnumber)
+close = browser.find_element_by_id('corover-close-btn')
+close.click()
+submit = browser.find_element_by_id('modal1')
+submit.click()
+captchascreenshot = browser.find_element_by_xpath("/html/body/div[2]/div[2]/div[2]/div[3]/div/div/div/div[2]/div[2]/div/div[2]")
+time.sleep(2)
+screenshotimagebinary = captchascreenshot.screenshot_as_png
+img_array = np.array(bytearray(screenshotimagebinary), dtype=np.uint8)
+img = cv.imdecode(img_array, 0)
+(thresh, blackAndWhiteImage) = cv.threshold(img, 120,255, cv.THRESH_BINARY)
+pytesseract.pytesseract.tesseract_cmd = tess
+prob = pytesseract.image_to_string(blackAndWhiteImage)
+prob = prob.replace('=', ' ')
+prob = prob.replace('?', ' ')
+add = prob.find('+')
+subtract = prob.find('-')
+if add != -1 :
+ k=1
+ prob = prob.replace('+', ' ')
+if subtract != -1 :
+ k=2
+ prob = prob.replace('-', ' ')
+j = 0
+while j < len(prob):
+ q = prob[j]
+ if not(q.isdigit()):
+ prob = prob.replace(prob[j], ' ')
+ j+=1
+
+i = prob.split(" ", 1)
+print(prob)
+num1=int(i[0])
+num2=int(i[1])
+if k == 1 :
+ sol=num1+num2
+if k == 2 :
+ sol=num1-num2
+print(str(sol))
+ans = browser.find_element_by_id('inputCaptcha')
+ans.send_keys(str(sol))
+time.sleep(1)
+submit1 = browser.find_element_by_id('submitPnrNo')
+submit1.click()
+time.sleep(3)
+
+screenshot = browser.find_element_by_xpath("//html/body/div[2]/div[2]/div[2]")
+screenshotimagebin = screenshot.screenshot_as_png
+imgarray = np.array(bytearray(screenshotimagebin), dtype=np.uint8)
+img1 = cv.imdecode(imgarray, cv.IMREAD_COLOR)
+cv.imshow("PNR STATUS",img1)
+cv.imwrite("PNRSTATUS.png", img1)
+
diff --git a/TurtleRace/TurtleRace.py b/TurtleRace/TurtleRace.py
new file mode 100644
index 0000000000..5ca9822b31
--- /dev/null
+++ b/TurtleRace/TurtleRace.py
@@ -0,0 +1,43 @@
+import turtle as t
+import random
+import time
+
+scr = t.Screen()
+scr.setup(width=500, height=500)
+UserInput = scr.textinput(title="Play luck",
+ prompt="Who would win in your opinion??Enter your lucky color from rainbow")
+# declaring a list of colors
+ColorList = ["Red", "Orange", "Yellow", "Green", "Blue", "Indigo", "Violet"]
+RaceRunning = False
+Runners = []
+pos = -100
+# for each and every turtle
+for i in range(0, 7):
+ NewTurtle = t.Turtle()
+ NewTurtle.shape("turtle")
+ NewTurtle.penup()
+ NewTurtle.color(ColorList[i])
+ NewTurtle.goto(x=-250, y=pos)
+ pos += 50
+ Runners.append(NewTurtle)
+if UserInput:
+ RaceRunning = True
+ # till the game is running
+while RaceRunning :
+ for runner in Runners:
+ if runner.xcor() > 230:
+ winner = runner.pencolor()
+ RaceRunning = False
+ show = t.Turtle()
+ show.hideturtle()
+ show.penup()
+ show.goto(-200, -150)
+ show.color("red")
+ if winner.lower() == UserInput.lower():
+ print("Your turtle won!")
+ show.write("Your turtle won!")
+ else:
+ print(f"Your turtle lost, the winner is {winner} turtle!")
+ show.write(f"Your turtle lost, the winner is {winner} turtle!")
+ runner.forward(random.randint(0, 10))
+scr.exitonclick()
diff --git a/TurtleRace/output.png b/TurtleRace/output.png
new file mode 100644
index 0000000000..f9e708b6ae
Binary files /dev/null and b/TurtleRace/output.png differ
diff --git a/TurtleRace/readme.md b/TurtleRace/readme.md
new file mode 100644
index 0000000000..71735f3b56
--- /dev/null
+++ b/TurtleRace/readme.md
@@ -0,0 +1,19 @@
+# Package/Script Name
+
+TurtleRace.py : to make the turtles move
+
+## Setup instructions
+
+python file.py
+
+## Detailed explanation of script, if needed
+
+The user will bet on a turtle to win and a race would be hosted to see who wins.
+
+## Output
+
+
+
+## Author(s)
+
+-[Anushka Pathak](https://github.com/anumshka)
diff --git a/TwitterTweetSentimentalAnalysis/Model.py b/TwitterTweetSentimentalAnalysis/Model.py
new file mode 100644
index 0000000000..647e01f213
--- /dev/null
+++ b/TwitterTweetSentimentalAnalysis/Model.py
@@ -0,0 +1,56 @@
+from nltk.sentiment import SentimentIntensityAnalyzer
+from textblob import TextBlob
+
+import tweepy
+
+
+class model(object):
+
+ def __init__(self, candidate_key, candidate_sec, access_key, access_sec):
+ super().__init__()
+ self.candidate_key = candidate_key
+ self.candidate_sec = candidate_sec
+ self.access_key = access_key
+ self.access_sec = access_sec
+
+ def get_authenticated_api(self):
+ auth = tweepy.OAuthHandler(self.candidate_key, self.candidate_sec)
+ auth.set_access_token(self.access_key, self.access_sec)
+ api = tweepy.API(auth)
+ return api
+
+ def get_live_tweets_from_Twitter(self, text):
+
+ api = self.get_authenticated_api()
+
+ tweet_live = api.search(text, tweet_mode='extended')
+ return tweet_live
+
+ def analysis_live_tweet_data(self, text):
+
+ tweet_live = self.get_live_tweets_from_Twitter(text)
+ for tweet in tweet_live:
+ tweet_is = tweet.text
+ analysis = TextBlob(tweet_is)
+
+ def detailed_analysis_tweet_data(self, text):
+
+ # if polarity is in negative then the tweet is negative
+ # if in positive then its a positive tweet
+ # if polarity is greater then 0 and less then 5 then tweet is neutral
+
+ tweet_live = self.get_live_tweets_from_Twitter(text)
+ result = []
+ for tweet in tweet_live:
+ polarity = TextBlob(tweet.full_text).sentiment.polarity
+ subjectivity = TextBlob(tweet.full_text).sentiment.subjectivity
+ score = SentimentIntensityAnalyzer().polarity_scores(tweet.full_text)
+
+ if polarity < 0 or subjectivity < 0 and score['neg'] > score['pos']:
+ result.append([tweet.full_text, polarity, subjectivity, score, "negative"])
+ elif polarity > 0 and subjectivity > 0 and score['neg'] < score['pos']:
+ result.append([tweet.full_text, polarity, subjectivity, score, "positive"])
+ else:
+ result.append([tweet.full_text, polarity, subjectivity, score, "neutral"])
+
+ return result
diff --git a/TwitterTweetSentimentalAnalysis/Readme.md b/TwitterTweetSentimentalAnalysis/Readme.md
new file mode 100644
index 0000000000..f5cc323226
--- /dev/null
+++ b/TwitterTweetSentimentalAnalysis/Readme.md
@@ -0,0 +1,40 @@
+## Twitter Sentimental Analysis Script
+
+This python script can be used to scrap twitter for a specific tweets according to there hashTags and then classify these tweets according to there sentiments example the tweet is positive, negative or neutral tweet
+
+This provides features like :
+
+1. Tweets Scraping
+2. sorting the Tweets
+3. Finding out the polarity,subjectivity score of a tweet
+4. SentimentIntensityAnalyzer on the tweet
+5. based on these scores it differentiate them in different categories like Positive , Negative and more.
+
+
+## Steps to Create your Credentials :
+
+1. Apply for a Twitter Developer Account here [Developers site](https://developer.twitter.com/en)
+2. Create an Application a new Application
+3. Create the Authentication Credentials
+4. Copy and paste your credential_variables.env file
+
+and done your credentials are setup for working
+
+
+## Installation
+
+First of all install [python]("https://www.python.org/downloads/") on your system.
+
+```
+pip install nltk
+pip install tweepy
+pip install textblob
+```
+
+
+### Made with ❤️ by Shantam Sultania
+
+You can find me at:-
+[Linkedin](https://www.linkedin.com/in/shantam-sultania-737084175/) or [Github](https://github.com/shantamsultania) .
+
+Happy coding ❤️ .
diff --git a/TwitterTweetSentimentalAnalysis/app.py b/TwitterTweetSentimentalAnalysis/app.py
new file mode 100644
index 0000000000..6002cf403e
--- /dev/null
+++ b/TwitterTweetSentimentalAnalysis/app.py
@@ -0,0 +1,28 @@
+from TwitterTweetSentimentalAnalysis import Model
+import getpass
+
+
+class app(object):
+
+ @staticmethod
+ def run_app():
+ try:
+ candidate_key = getpass.getpass(prompt='enter your candidate Key : ')
+ candidate_sec = getpass.getpass(prompt='enter your candidate secret Key : ')
+ access_key = getpass.getpass(prompt='enter your access Key : ')
+ access_sec = getpass.getpass(prompt='enter your access secret Key : ')
+
+ except Exception as E:
+ print('There is an Error : ', E)
+ else:
+ model_object = Model.model(candidate_key, candidate_sec, access_key, access_sec)
+ print(model_object.get_authenticated_api())
+ text = input(" Enter the tag you want to perform sentimental analysis on : ")
+ result = model_object.detailed_analysis_tweet_data(text)
+ for i in result:
+ print(i)
+
+
+if __name__ == "__main__":
+ object = app()
+ object.run_app()
diff --git a/TwitterTweetSentimentalAnalysis/requirements.txt b/TwitterTweetSentimentalAnalysis/requirements.txt
new file mode 100644
index 0000000000..f6b3c017f8
--- /dev/null
+++ b/TwitterTweetSentimentalAnalysis/requirements.txt
@@ -0,0 +1,3 @@
+nltk==3.2.4
+tweepy==3.10.0
+textblob==0.15.3
\ No newline at end of file
diff --git a/Twitter_Video_Downloader/Readme.md b/Twitter_Video_Downloader/Readme.md
new file mode 100644
index 0000000000..21da49eb83
--- /dev/null
+++ b/Twitter_Video_Downloader/Readme.md
@@ -0,0 +1,22 @@
+# Twitter Video Downloader
+
+A GUI downloader used to download Twitter videos by providing its link.
+
+## Installation
+
+> pip3 install -r requirements.txt
+
+## Usage
+
+Provide the Twitter video URL in the field and click `Download`.
+
+## Output
+
+Downloaded video you desired in the same directory of the script.
+
+## Authors
+
+Written by [XZANATOL](https://www.github.com/XZANATOL).
+
+The project was built as a contribution during [GSSOC'21](https://gssoc.girlscript.tech/).
+
diff --git a/Twitter_Video_Downloader/requirements.txt b/Twitter_Video_Downloader/requirements.txt
new file mode 100644
index 0000000000..c0317052e9
--- /dev/null
+++ b/Twitter_Video_Downloader/requirements.txt
@@ -0,0 +1,2 @@
+twitter-dl
+requests
\ No newline at end of file
diff --git a/Twitter_Video_Downloader/script.py b/Twitter_Video_Downloader/script.py
new file mode 100644
index 0000000000..b2c598da49
--- /dev/null
+++ b/Twitter_Video_Downloader/script.py
@@ -0,0 +1,64 @@
+from tkinter import *
+import subprocess
+import requests
+
+
+def Invalid_URL():
+ """ Sets Status bar label to error message """
+ Status["text"] = "Invalid URL..."
+ Status["fg"] = "red"
+
+
+def Download_vid():
+ """ Validates link and Downloads Video """
+ Download_Window.delete("0.0", "end")
+ global URL_Val
+ url = URL_Val.get()
+
+ Status["text"] = "Downloading..."
+ Status["fg"] = "green"
+
+ # Validate input
+ if not "twitter.com" in url:
+ Invalid_URL()
+ return
+ response = requests.get(url)
+ if not response.status_code == 200:
+ Invalid_URL()
+ response.close()
+ return
+ response.close()
+
+ with subprocess.Popen("youtube-dl {} --no-cache-dir".format(url), stdout=subprocess.PIPE, shell=True, universal_newlines=True) as Process:
+ for line in Process.stdout:
+ Download_Window.insert(END, line)
+ main.update_idletasks()
+
+ Status["text"] = "Finished!!"
+ Status["fg"] = "green"
+
+
+# <----- GUI Code Block Start ----->
+main = Tk()
+main.title("Twitter Video Downloader")
+main.geometry("600x400")
+
+URL_Label = Label(main, text="Enter Twitter Video URL:", anchor=W, font=("Calibri", 9))
+URL_Label.place(x=30, y=20)
+
+URL_Val = StringVar()
+URL_Input = Entry(main, textvariable=URL_Val, font=("Calibri", 9))
+URL_Input.place(x=60, y=50, width=400)
+
+Download_button = Button(main, text="Download", font=("Calibri", 9), command=Download_vid)
+Download_button.place(x=250, y=80, width=100)
+
+Download_Window = Text(main, font=("Calibri", 9), bg="black", fg="white", bd=1, relief=SUNKEN, wrap=WORD)
+Download_Window.insert(END, "Welcome to Twitter Video Downloader, Provide a Twitter video link in the above box and click download to start the process. :D")
+Download_Window.place(x=30, y=120, width=530, height=250)
+
+Status = Label(main, text="Hello!! :D", fg="orange", font=("Calibri", 9), bd=1, relief=SUNKEN, anchor=W, padx=3)
+Status.pack(side=BOTTOM, fill=X)
+
+main.mainloop()
+# <----- GUI Code Block End ----->
diff --git a/Vector_Calc/Readme.md b/Vector_Calc/Readme.md
new file mode 100644
index 0000000000..347654d9ff
--- /dev/null
+++ b/Vector_Calc/Readme.md
@@ -0,0 +1,25 @@
+# Base-N Calculator
+
+It is a GUI based script that allows user to fetch relations between 2 vectors along with the properties of each vector.
+
+## Installation
+
+`` This Should be used for Linux OS only ``
+> pip3 install -r requirements.txt
+
+## Usage
+
+1) Fill the required fields.
+2) Results will be displayed in their corresponding fields.
+
+Note: You need to press calculate in order to access the properties results of each vector.
+
+## Output
+
+Relations between vectors and the properties of each one.
+
+## Authors
+
+Written by [XZANATOL](https://www.github.com/XZANATOL).
+
+The project was built as a contribution during [GSSOC'21](https://gssoc.girlscript.tech/).
\ No newline at end of file
diff --git a/Vector_Calc/requirements.txt b/Vector_Calc/requirements.txt
new file mode 100644
index 0000000000..7d971ab981
--- /dev/null
+++ b/Vector_Calc/requirements.txt
@@ -0,0 +1 @@
+tk
\ No newline at end of file
diff --git a/Vector_Calc/script.py b/Vector_Calc/script.py
new file mode 100644
index 0000000000..9be9b725f6
--- /dev/null
+++ b/Vector_Calc/script.py
@@ -0,0 +1,378 @@
+from tkinter import *
+import math
+
+values = []
+vec_window_count = []
+
+def func_main():
+ """ Get the Variables to calculate relations """
+
+ global Vec_1
+ global Vec_2
+ global values
+
+ Vals = [V1_x_val.get(), V1_y_val.get(), V1_z_val.get(),
+ V2_x_val.get(), V2_y_val.get(), V2_z_val.get()]
+ # Validate values
+ try:
+ for i in range(6):
+ Vals[i] = float(Vals[i])
+ except:
+ SetStatusError()
+ return
+
+ DotProduct(Vals)
+ CrossProduct(Vals)
+ Angle(Vals)
+ comp_v_on_v(Vals)
+ proj_v_on_v(Vals)
+
+ Vec_1.place(x=355, y=10)
+ Vec_2.place(x=355, y=40)
+ values = Vals
+
+
+def DotProduct(Vals):
+ """ Dot product of 2 vectors """
+ res = (Vals[0]*Vals[3]) + (Vals[1]*Vals[4]) + (Vals[2]*Vals[5])
+ dotproduct_entry_val.set(res)
+ return res
+
+
+def CrossProduct(Vals):
+ """ Cross product of 2 vectors """
+ res_x = (Vals[1] * Vals[5]) - (Vals[4] * Vals[2])
+ res_y = (Vals[0] * Vals[5]) - (Vals[3] * Vals[2])
+ res_z = (Vals[0] * Vals[4]) - (Vals[1] * Vals[3])
+ crossproduct_x_val.set(res_x)
+ crossproduct_y_val.set(res_y)
+ crossproduct_z_val.set(res_z)
+
+
+def abs_val(Vals):
+ """ Absolute value of a vector |v| """
+ res = (Vals[0]**2 + Vals[1]**2 + Vals[2]**2)**0.5
+ return res
+
+
+def Angle(Vals):
+ """ Angle between both vectors """
+ abs_v1 = abs_val(Vals[:3])
+ abs_v2 = abs_val(Vals[3:])
+ dot = DotProduct(Vals)
+ try:
+ ang = round(math.acos(dot / (abs_v1*abs_v2)) * 180 / math.pi, 5)
+ except:
+ ang = "Invalid"
+ angle_val.set(ang)
+
+
+def comp_v_on_v(Vals):
+ """ Compnent of a vector on the other """
+ dot_prod = DotProduct(Vals)
+ abs_v1 = abs_val(Vals[:3])
+ abs_v2 = abs_val(Vals[3:])
+
+ try:
+ res_a_on_b = round(dot_prod / abs_v2, 5)
+ a_on_b_val.set(res_a_on_b)
+ except:
+ a_on_b_val.set("Invalid")
+
+ try:
+ res_b_on_a = round(dot_prod / abs_v1, 5)
+ b_on_a_val.set(res_b_on_a)
+ except:
+ b_on_a_val.set("Invalid")
+
+
+def proj_v_on_v(Vals):
+ """ Projection of a vector on the other """
+ dot_prod = DotProduct(Vals)
+ abs_v1 = abs_val(Vals[:3])
+ abs_v2 = abs_val(Vals[3:])
+
+ try:
+ res_a_on_b = round(dot_prod / abs_v2**2, 5)
+ x_1 = res_a_on_b * Vals[3]
+ y_1 = res_a_on_b * Vals[4]
+ z_1 = res_a_on_b * Vals[5]
+ a_on_b_proj_x_val.set(x_1)
+ a_on_b_proj_y_val.set(y_1)
+ a_on_b_proj_z_val.set(z_1)
+ except:
+ a_on_b_proj_x_val.set("Invalid")
+ a_on_b_proj_y_val.set("Invalid")
+ a_on_b_proj_z_val.set("Invalid")
+
+ try:
+ res_b_on_a = round(dot_prod / abs_v1**2, 5)
+ x_2 = res_b_on_a * Vals[0]
+ y_2 = res_b_on_a * Vals[1]
+ z_2 = res_b_on_a * Vals[2]
+ b_on_a_proj_x_val.set(x_2)
+ b_on_a_proj_y_val.set(y_2)
+ b_on_a_proj_z_val.set(z_2)
+ except:
+ b_on_a_proj_x_val.set("Invalid")
+ b_on_a_proj_y_val.set("Invalid")
+ b_on_a_proj_z_val.set("Invalid")
+
+ Status["text"] = "Calculations Completed! :D "
+ Status["fg"] = "green"
+
+
+def SetStatusError():
+ """ Sets Status bar label to error message """
+ Status["text"] = "Wronge Input(s)... :\ "
+ Status["fg"] = "red"
+
+
+def on_closing():
+ """ Closes all Instances """
+ global vec_window_count
+ global main
+
+ try:
+ for window in vec_window_count:
+ window.destroy()
+ main.destroy()
+ except:
+ main.destroy()
+
+
+# <----- Single Vector Properties GUI-Backend Code Block Start ----->
+def Show_Vec_Frame(vec_num, values):
+ """ Shows the properties of a single vector """
+ global vec_window_count
+
+ if vec_num == 1:
+ values = values[:3]
+ title = "Vector A Properties"
+ else:
+ values = values[3:]
+ title = "Vector B Properties"
+
+ vec_window = Tk()
+ vec_window.title(title)
+ vec_window.geometry("300x250")
+ vec_window_count.append(vec_window)
+
+ # Modulus
+ Modulus = round(( values[0]**2 + values[1]**2 + values[2]**2 )**0.5, 5)
+ Modulus_lbl = Label(vec_window, text="Modulus > ", anchor=E, font=("Calibri", 8))
+ Modulus_val = Text(vec_window, height=1, borderwidth=0)
+ Modulus_val.insert(1.0, str(Modulus))
+ Modulus_lbl.place(x=10, y=10)
+ Modulus_val.place(x=70, y=11, width=80)
+
+ # Unit Vectors
+ try:
+ uv_x = round(values[0]/Modulus, 5)
+ uv_y = round(values[1]/Modulus, 5)
+ uv_z = round(values[2]/Modulus, 5)
+ except:
+ uv_x = "Invalid"
+ uv_y = "Invalid"
+ uv_z = "Invalid"
+
+ Unit_Vector_lbl = Label(vec_window, text="Unit Vector: ", anchor=E, font=("Calibri", 8))
+ uv_x_lbl = Label(vec_window, text="X > ", anchor=E, font=("Calibri", 8))
+ uv_x_val = Text(vec_window, height=1, borderwidth=0)
+ uv_x_val.insert(1.0, str(uv_x))
+ uv_y_lbl = Label(vec_window, text="Y > ", anchor=E, font=("Calibri", 8))
+ uv_y_val = Text(vec_window, height=1, borderwidth=0)
+ uv_y_val.insert(1.0, str(uv_y))
+ uv_z_lbl = Label(vec_window, text="Z > ", anchor=E, font=("Calibri", 8))
+ uv_z_val = Text(vec_window, height=1, borderwidth=0)
+ uv_z_val.insert(1.0, str(uv_z))
+ Unit_Vector_lbl.place(x=10, y=30)
+ uv_x_lbl.place(x=25, y=50)
+ uv_x_val.place(x=50, y=51, width=80)
+ uv_y_lbl.place(x=25, y=70)
+ uv_y_val.place(x=50, y=71, width=80)
+ uv_z_lbl.place(x=25, y=90)
+ uv_z_val.place(x=50, y=91, width=80)
+
+ if uv_x != "Invalid":
+ alpha = round(math.acos(uv_x) * 180 / math.pi, 5)
+ beta = round(math.acos(uv_y) * 180 / math.pi, 5)
+ gamma = round(math.acos(uv_z) * 180 / math.pi, 5)
+ else:
+ alpha = "Invalid"
+ beta = "Invalid"
+ gamma = "Invalid"
+ Cosine_lbl = Label(vec_window, text="Cosine Angles: ", anchor=E, font=("Calibri", 8))
+ alpha_lbl = Label(vec_window, text="X > ", anchor=E, font=("Calibri", 8))
+ alpha_val = Text(vec_window, height=1, borderwidth=0)
+ alpha_val.insert(1.0, str(alpha))
+ beta_lbl = Label(vec_window, text="Y > ", anchor=E, font=("Calibri", 8))
+ beta_val = Text(vec_window, height=1, borderwidth=0)
+ beta_val.insert(1.0, str(beta))
+ gamma_lbl = Label(vec_window, text="Z > ", anchor=E, font=("Calibri", 8))
+ gamma_val = Text(vec_window, height=1, borderwidth=0)
+ gamma_val.insert(1.0, str(gamma))
+ Cosine_lbl.place(x=10, y=120)
+ alpha_lbl.place(x=25, y=140)
+ alpha_val.place(x=50, y=141, width=80)
+ beta_lbl.place(x=25, y=160)
+ beta_val.place(x=50, y=161, width=80)
+ gamma_lbl.place(x=25, y=180)
+ gamma_val.place(x=50, y=181, width=80)
+
+ vec_window.mainloop()
+# <----- Single Vector Properties GUI-Backend Code Block End ----->
+
+
+# <----- GUI Code Block Start ----->
+# Main Window
+main = Tk()
+main.title("Vector Calculator")
+main.geometry("460x310")
+main.protocol("WM_DELETE_WINDOW", on_closing)
+
+# Entry Titles
+x_lbl = Label(main, text="X", font=("Calibri", 8))
+y_lbl = Label(main, text="Y", font=("Calibri", 8))
+z_lbl = Label(main, text="Z", font=("Calibri", 8))
+x_lbl.place(x=110, y=15)
+y_lbl.place(x=170, y=15)
+z_lbl.place(x=230, y=15)
+
+# Vector 1
+V1_lbl = Label(main, text="Vector A > ", anchor=E, font=("Calibri", 8))
+V1_x_val = StringVar()
+V1_x = Entry(main, textvariable=V1_x_val, font=("Calibri", 8))
+V1_y_val = StringVar()
+V1_y = Entry(main, textvariable=V1_y_val, font=("Calibri", 8))
+V1_z_val = StringVar()
+V1_z = Entry(main, textvariable=V1_z_val, font=("Calibri", 8))
+V1_lbl.place(x=20,y=35)
+V1_x.place(x=90, y=36, width=50)
+V1_y.place(x=150, y=36, width=50)
+V1_z.place(x=210, y=36, width=50)
+
+# Vector 2
+V2_lbl = Label(main, text="Vector B > ", anchor=E, font=("Calibri", 8))
+V2_x_val = StringVar()
+V2_x = Entry(main, textvariable=V2_x_val, font=("Calibri", 8))
+V2_y_val = StringVar()
+V2_y = Entry(main, textvariable=V2_y_val, font=("Calibri", 8))
+V2_z_val = StringVar()
+V2_z = Entry(main, textvariable=V2_z_val, font=("Calibri", 8))
+V2_lbl.place(x=20,y=65)
+V2_x.place(x=90, y=66, width=50)
+V2_y.place(x=150, y=66, width=50)
+V2_z.place(x=210, y=66, width=50)
+
+# Calculate Button
+Calculate = Button(main, text="Calculate", font=("Calibri", 8), command=func_main)
+Calculate.place(x=270, y=48, width=70)
+
+# Results Frame ----->
+frame = Frame(main, bg="#708090")
+frame.place(x=20, y=90, width=420, height=197)
+
+# Dot Product
+dotproduct_lbl = Label(frame, text="Dot Product:", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+dotproduct_lbl.place(x=10, y=10)
+dotproduct_entry_val = StringVar()
+dotproduct_entry = Entry(frame, textvariable=dotproduct_entry_val, font=("Calibri", 8))
+dotproduct_entry.configure(state='readonly')
+dotproduct_entry.place(x=80, y=11, width=50)
+
+# Cross Product
+crossproduct_lbl = Label(frame, text="Cross Product:", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+crossproduct_lbl.place(x=10, y=40)
+crossproduct_x_lbl = Label(frame, text="X (i) > ", anchor=E, bg="#708090", fg="black", font=("Calibri", 8))
+crossproduct_y_lbl = Label(frame, text="Y (j) > ", anchor=E, bg="#708090", fg="black", font=("Calibri", 8))
+crossproduct_z_lbl = Label(frame, text="Z (k) > ", anchor=E, bg="#708090", fg="black", font=("Calibri", 8))
+crossproduct_x_lbl.place(x=30, y=60)
+crossproduct_y_lbl.place(x=30, y=90)
+crossproduct_z_lbl.place(x=30, y=120)
+crossproduct_x_val = StringVar()
+crossproduct_y_val = StringVar()
+crossproduct_z_val = StringVar()
+crossproduct_x = Entry(frame, textvariable=crossproduct_x_val, font=("Calibri", 8))
+crossproduct_x.configure(state='readonly')
+crossproduct_x.place(x=65, y=61, width=50)
+crossproduct_y = Entry(frame, textvariable=crossproduct_y_val, font=("Calibri", 8))
+crossproduct_y.configure(state='readonly')
+crossproduct_y.place(x=65, y=91, width=50)
+crossproduct_z = Entry(frame, textvariable=crossproduct_z_val, font=("Calibri", 8))
+crossproduct_z.configure(state='readonly')
+crossproduct_z.place(x=65, y=121, width=50)
+
+# Angle between both vectors
+angle_lbl = Label(frame, text="Angle:", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+angle_lbl.place(x=10, y=160)
+angle_val = StringVar()
+angle = Entry(frame, textvariable=angle_val, font=("Calibri", 8))
+angle.configure(state='readonly')
+angle.place(x=50, y=161, width=80)
+
+# Components
+component_lbl = Label(frame, text="Components:", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+component_lbl.place(x=170, y=10)
+a_on_b_lbl = Label(frame, text="A on B:", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+a_on_b_val = StringVar()
+a_on_b_ent = Entry(frame, textvariable=a_on_b_val, font=("Calibri", 8))
+a_on_b_ent.configure(state='readonly')
+b_on_a_lbl = Label(frame, text="B on A:", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+b_on_a_val = StringVar()
+b_on_a_ent = Entry(frame, textvariable=b_on_a_val, font=("Calibri", 8))
+b_on_a_ent.configure(state='readonly')
+a_on_b_lbl.place(x=190, y=30)
+a_on_b_ent.place(x=230, y=31, width=50)
+b_on_a_lbl.place(x=190, y=60)
+b_on_a_ent.place(x=230, y=61, width=50)
+
+# Projection
+comp_per_lbl = Label(frame, text="Projection:", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+a_on_b_proj_lbl = Label(frame, text="A on B:", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+b_on_a_proj_lbl = Label(frame, text="B on A:", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+res_x_lbl = Label(frame, text="X", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+res_y_lbl = Label(frame, text="Y", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+res_z_lbl = Label(frame, text="Z", anchor=W, bg="#708090", fg="black", font=("Calibri", 8))
+comp_per_lbl.place(x=170, y=90)
+a_on_b_proj_lbl.place(x=190, y=130)
+b_on_a_proj_lbl.place(x=190, y=160)
+res_x_lbl.place(x=250, y=110)
+res_y_lbl.place(x=310, y=110)
+res_z_lbl.place(x=370, y=110)
+a_on_b_proj_x_val = StringVar()
+a_on_b_proj_x = Entry(frame, textvariable=a_on_b_proj_x_val, font=("Calibri", 8))
+a_on_b_proj_x.configure(state='readonly')
+a_on_b_proj_y_val = StringVar()
+a_on_b_proj_y = Entry(frame, textvariable=a_on_b_proj_y_val, font=("Calibri", 8))
+a_on_b_proj_y.configure(state='readonly')
+a_on_b_proj_z_val = StringVar()
+a_on_b_proj_z = Entry(frame, textvariable=a_on_b_proj_z_val, font=("Calibri", 8))
+a_on_b_proj_z.configure(state='readonly')
+a_on_b_proj_x.place(x=230, y=131, width=50)
+a_on_b_proj_y.place(x=290, y=131, width=50)
+a_on_b_proj_z.place(x=350, y=131, width=50)
+
+b_on_a_proj_x_val = StringVar()
+b_on_a_proj_x = Entry(frame, textvariable=b_on_a_proj_x_val, font=("Calibri", 8))
+b_on_a_proj_x.configure(state='readonly')
+b_on_a_proj_y_val = StringVar()
+b_on_a_proj_y = Entry(frame, textvariable=b_on_a_proj_y_val, font=("Calibri", 8))
+b_on_a_proj_y.configure(state='readonly')
+b_on_a_proj_z_val = StringVar()
+b_on_a_proj_z = Entry(frame, textvariable=b_on_a_proj_z_val, font=("Calibri", 8))
+b_on_a_proj_z.configure(state='readonly')
+b_on_a_proj_x.place(x=230, y=161, width=50)
+b_on_a_proj_y.place(x=290, y=161, width=50)
+b_on_a_proj_z.place(x=350, y=161, width=50)
+
+# Single vector button entry point
+Vec_1 = Button(main, text="Vec A Properties", font=("Calibri", 9), command= lambda: Show_Vec_Frame(1, values))
+Vec_2 = Button(main, text="Vec B Properties", font=("Calibri", 9), command= lambda: Show_Vec_Frame(2, values))
+
+# Status Bar
+Status = Label(main, text="Hello!! :D", fg="green", font=("Calibri", 8), bd=1, relief=SUNKEN, anchor=W, padx=3)
+Status.pack(side=BOTTOM, fill=X)
+
+main.mainloop()
+# <----- GUI Code Block End ----->
diff --git a/Video to PDF/README.md b/Video to PDF/README.md
new file mode 100644
index 0000000000..4091155f6b
--- /dev/null
+++ b/Video to PDF/README.md
@@ -0,0 +1,14 @@
+# Video to PDF Converter
+
+Using this tool, you can convert any video of your choice into a PDF.
+
+To run the script, install the dependencies using
+``
+pip install -r requirements.txt
+``
+
+[Sample Video Link](https://www.youtube.com/watch?v=rGHrKkieqCY)
+
+
+## Author
+[Tanvi Bugdani](https://github.com/tanvi355)
diff --git a/Video to PDF/requirements.txt b/Video to PDF/requirements.txt
new file mode 100644
index 0000000000..79e6879637
--- /dev/null
+++ b/Video to PDF/requirements.txt
@@ -0,0 +1,3 @@
+fpdf==1.7.2
+speech_recognition==3.7.1
+moviepy==1.0.1
diff --git a/Video to PDF/script.py b/Video to PDF/script.py
new file mode 100644
index 0000000000..04356b8e72
--- /dev/null
+++ b/Video to PDF/script.py
@@ -0,0 +1,113 @@
+from tkinter import *
+from moviepy.editor import VideoFileClip
+from moviepy.editor import AudioFileClip
+from tkinter import filedialog
+from tkinter import messagebox
+from tkinter import ttk
+from fpdf import FPDF
+import threading
+import speech_recognition as sr
+import os
+
+
+#variables
+video_clip = ''
+audio_clip = ''
+
+#function to get video
+def get_video():
+ global video_filepath, video_clip
+ try:
+ video_filepath.set(filedialog.askopenfilename(title="Select your video file"))
+ video_clip = VideoFileClip(str(video_filepath.get()))
+ except:
+ messagebox.showerror("Error", "No video selected")
+
+
+#function to convert audio to pdf
+def audio_to_pdf():
+ global audio_clip
+ try :
+ audio_clip = video_clip.audio.write_audiofile(r"my_audio.wav")
+ r = sr.Recognizer()
+ with sr.AudioFile("my_audio.wav") as source:
+ audio_data = r.record(source)
+ text = r.recognize_google(audio_data)
+ write_file = open('my_text.txt', 'w')
+ write_file.write(text)
+ write_file.close()
+ text_to_pdf('my_text.txt')
+ messagebox.showinfo("Message", "Conversion Successfull")
+ except :
+ messagebox.showerror( "Error", "Conversion not performed")
+
+ video_filepath.set('')
+
+ progress_bar['value'] = 0
+ progress_bar.stop()
+
+ os.remove("my_audio.wav")
+ os.remove("my_text.txt")
+
+#function to convert text to pdf
+def text_to_pdf(file):
+ pdf = FPDF(format='letter', unit='in')
+ pdf.add_page()
+ pdf.set_font("Arial", size = 12)
+ effective_page_width = pdf.w - 2*pdf.l_margin
+
+ f = open(file, "r")
+
+ for x in f:
+ pdf.multi_cell(effective_page_width, 0.15, x)
+ pdf.ln(0.5)
+
+ pdf.output("../Video to PDF/my_pdf.pdf")
+
+
+
+#function to run the script
+def run():
+ global progress_bar
+ t1 = threading.Thread(target = progress_bar.start)
+ t2 = threading.Thread(target = audio_to_pdf)
+ t2.start()
+ t1.start()
+
+
+# GUI CODE
+# Intializing main program settings
+root = Tk()
+root.title("Video to PDF Converter")
+
+# Variables for file paths
+video_filepath = StringVar()
+
+# Creating UI Frame
+UI_frame = Frame(root, width=500, height=500, relief = "raised")
+UI_frame.grid(row=0, column=0)
+
+convert_frame = Frame(root, width=500, height=500, relief="raised")
+convert_frame.grid(row=1, column=0)
+
+# Labels and buttons
+select = Label(UI_frame, text="Select Video : ", font = ("Arial", 12))
+select.grid(row=1, column=1, padx=5, pady=5, sticky=W)
+
+browse = Button(UI_frame, text="Browse", command = get_video, font = ("Arial", 12))
+browse.grid(row=1, column=2, padx=5, pady=5)
+
+video_selected = Label(UI_frame, text = "Selected video : ", font = ("Arial", 12))
+video_selected.grid(row = 2, column = 1, padx = 5, pady = 5, sticky = E)
+
+video_path = Label(UI_frame, textvariable=video_filepath)
+video_path.grid(row=2, column=2, padx=2, pady=5, sticky=W)
+
+convert = Button(convert_frame, text="Convert", command = run, font = ("Arial", 12))
+convert.grid(row=3, column=1, pady=5)
+
+progress_bar = ttk.Progressbar(root, orient=HORIZONTAL, mode='indeterminate', length=500)
+progress_bar.grid(padx=25, pady=25)
+
+# Calling main program
+root.mainloop()
diff --git a/Voice Calculator/README.md b/Voice Calculator/README.md
new file mode 100644
index 0000000000..9cdca96cad
--- /dev/null
+++ b/Voice Calculator/README.md
@@ -0,0 +1,24 @@
+# Voice Calculator
+
+This is voice calculator capable enough to do difficult trigonometric probelms and simple arithmatic calculation and also Linear Expression.
+This will run in the terminal and all the instruction will be given while running it.
+
+## Setup instructions
+
+There way to run it on your Linux,MAC or Windows
+
+- Run the program in your IDE or terminal/command line.
+
+Click on the **Click Here** to see the Voice Calculator Demo on YouTube.
+
+| Name of Script | YouTube Link | Author | Tools Used |
+| ---------------- | ------------------------------------------ | --------------------------------------------- | --------------------------------- |
+| Voice Calculator | [Click Here](https://youtu.be/cOgujLzl9zg) | [Arnab Ray](https://github.com/Arnab11917676) | Speech Recognition , Wolframalpha |
+
+## Output
+
+
+
+## Author(s)
+
+- [Arnab Ray](https://github.com/Arnab11917676)
diff --git a/Voice Calculator/requirements.txt b/Voice Calculator/requirements.txt
new file mode 100644
index 0000000000..1ac74ea93e
--- /dev/null
+++ b/Voice Calculator/requirements.txt
@@ -0,0 +1,3 @@
+speech_recognition
+pyttsx3
+wolframalpha
diff --git a/Voice Calculator/voiceCalc.py b/Voice Calculator/voiceCalc.py
new file mode 100644
index 0000000000..0c01f54134
--- /dev/null
+++ b/Voice Calculator/voiceCalc.py
@@ -0,0 +1,105 @@
+import os
+import pyttsx3
+import speech_recognition as sr
+import tkinter.messagebox as tmessage
+import wolframalpha
+
+from os.path import exists
+
+listener = sr.Recognizer()
+engine = pyttsx3.init()
+voices = engine.getProperty('voices')
+engine.setProperty('voice', voices[0].id)
+wolfprimeaplahe_app = input('Enter the API Token')
+
+
+def audio(audio):
+ engine.say(audio)
+ engine.runAndWait()
+
+
+def welcomeInst():
+ print('Welcome to Calculator :)')
+ audio('Welcome to Calculator :)')
+ print('If you want calculate something please tell calcualte and then your expression')
+ audio('If you want calculate something please tell calcualte and then your expression')
+ print('For example CALCULATE 7 PLUS 8 or CALCULATE sin30 plus cot20')
+ audio('For example CALCULATE 7 PLUS 8 or CALCULATE sin30 plus cot20')
+
+
+def _takeCommand():
+ r = sr.Recognizer()
+ with sr.Microphone() as source:
+ print("Listening....")
+ audio("Listning...")
+ r.pause_threshold = 2
+ r.energy_threshold = 3000
+ audio = r.listen(source)
+
+ try:
+ print("Recognizing...")
+ audio("Recognizing...")
+ query = r.recognize_google(audio, language='en-In')
+ print(query)
+
+ except Exception as e:
+ tmessage.showinfo('Error', f'{e}')
+ print("Didn't understand you...\nCan you repeat?...")
+ return "NONE"
+
+ return query
+
+
+def _calculate():
+ client = wolframalpha.Client(wolfprimeaplahe_app)
+ indx = spech.lower().split().index('calculate')
+ query = spech.split()[indx + 1:]
+ res = client.query(''.join(query))
+ answerr = next(res.results).text
+ space = '\n'
+ ourQuery = ''.join(query)
+ Question = 'Your Query was :- '
+ Answer = 'Your answer was :- '
+ finalAnswer = Question + str(ourQuery) + \
+ space + Answer + str(answerr) + space
+
+ if exists('./Voice Calculator/maths.txt'):
+ with open('./Voice Calculator/maths.txt', 'a', encoding='utf-8') as mth:
+ mth.write(finalAnswer)
+ mth.close()
+ else:
+ history = open('./Voice Calculator/maths.txt', 'w', encoding='utf-8')
+ history.write(finalAnswer)
+ history.close()
+ print("The answer is " + answerr)
+ audio("the answer is %s" % answerr)
+
+
+welcomeInst()
+
+while True:
+
+ spech = _takeCommand().lower()
+
+ if 'calculate' in spech:
+ _calculate()
+
+ elif 'clear' in spech:
+
+ if exists('./Voice Calculator/maths.txt'):
+ with open('./Voice Calculator/maths.txt', 'r+') as file:
+ file.truncate(0)
+ file.close()
+ print('done')
+
+ else:
+ tmessage.showinfo('Error', 'No file exists with this name')
+
+ elif 'history' in spech:
+ os.system('./Voice Calculator/maths.txt')
+
+ elif 'quit' in spech or 'exit' in spech:
+ quit()
+
+ else:
+ tmessage.showinfo('Opps', "Didn't understand")
diff --git a/Zoom-Auto-Attend/requirements.txt b/Zoom-Auto-Attend/requirements.txt
index d8969cb718..3b1181bc83 100644
--- a/Zoom-Auto-Attend/requirements.txt
+++ b/Zoom-Auto-Attend/requirements.txt
@@ -5,7 +5,7 @@ clint==0.5.1
MouseInfo==0.1.3
mypy-extensions==0.4.3
pathspec==0.8.0
-Pillow==8.1.1
+Pillow==8.2.0
prompt-toolkit==1.0.14
PyAutoGUI==0.9.50
pyfiglet==0.8.post1
@@ -23,5 +23,5 @@ six==1.15.0
toml==0.10.1
typed-ast==1.4.1
typing-extensions==3.7.4.3
-urllib3==1.25.10
+urllib3==1.26.5
wcwidth==0.2.5