I don not know how to create a simpler one.
Actually, I appear to have enough space!
Full code
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
from tkinter.ttk import Button, Notebook
import os
import sys
import getpass
import smtplib
import webbrowser
import urllib.request
def AddCall():
add()
def BackupCallSave():
savefile()
def ViewCall():
viewfile()
def PrintFileCall():
printfile()
def ShareListCall():
mailInstance = MailWin()
def SettingsInstance():
settingsInstance = Settings()
def HTMLDataInstance():
createData = HTMLRawData()
def SearchInstance():
newSearch = SearchWin()
account = open("account.txt", "a+")
account.close()
login_details_user = open("loginuser.txt", "a+")
login_details_user.close()
login_details_user = open("loginuser.txt", "r")
check_char = login_details_user.read()
login_details_user.close()
login_details_passw = open("loginpassw.txt", "a+")
login_details_passw.close()
shop_name_details = open("shopnamecontainer.txt", "a+")
shop_name_details.close()
web_url = open("shopwebsite.txt", "a+")
web_url.close()
check_used = open("usedfiles.txt", "a+")
check_used.close()
save_file = open("saves.txt", "a+")
save_file.close()
if check_char == "":
account = open("account.txt", "w")
account.write("0")
account.close()
window = Tk()
window.title("AutoOrder")
#window.iconbitmap("feather.ico")
window.resizable(0, 0)
itemsvar = Variable(value = 1)
itembox = Entry(width = 50)
itemslist = Listbox(listvariable = itemsvar)
no_items_label = Label(text = "No products")
file = ""
session = 0
no_items = True
used_file = False
shop_name = ""
validate_user = ""
validate_passw = ""
target_set = False
signed_in = False
file_was_viewed = False
url_set = False
account = open("account.txt", "r+")
status = account.read()
menubar = Menu()
menubar.add_command(label = "Add", state = DISABLED, command = AddCall)
menubar.add_command(label = "Backup", state = DISABLED, command = BackupCallSave)
menubar.add_command(label = "Print", state = DISABLED, command = PrintFileCall)
menubar.add_command(label = "Email", state = DISABLED, command = ShareListCall)
menubar.add_command(label = "View", command = ViewCall)
def closeall():
global signed_in
if signed_in == False:
try:
sys.exit()
except:
raise SystemExit()
else:
exitq = messagebox.askquestion("Exit program", "Are you sure you want to exit AutoOrder?")
if exitq == "yes":
try:
sys.exit()
except:
raise SystemExit()
else:
return
def error_handle():
messagebox.showerror("An error occured", "An error occurred while setting the target file. Please set it again")
file = ""
def spacer(linesno):
for i in range(0, linesno):
space = Label(text = "")
space.pack()
def notebookspacer(linesno, tabmaster):
for i in range(0, linesno):
space = Label(tabmaster, text = "")
space.pack()
def create_account_func():
user = username.get()
passw = password.get()
if len(user and passw) == 0:
messagebox.showerror("Fields missing", "Please fill out all required fields")
pass
else:
if len(user and passw) < 10:
messagebox.showerror("Username and password", "Username and password must be 10 characters or over")
elif passw == shopNameSet.get() and len(passw and shopNameSet.get()) > 0:
messagebox.showerror("Security", "For security, password must be different from shop name")
else:
shop_name_get = shopNameSet.get()
shop_name_details = open("shopnamecontainer.txt", "w")
shop_name_details.write(shop_name_get)
shop_name_details.close()
login_details_user = open("loginuser.txt", "w")
login_details_user.write(user)
login_details_user.close()
login_details_passw = open("loginpassw.txt", "w")
login_details_passw.write(passw)
login_details_passw.close()
messagebox.showinfo("Account created", "Your account was created")
account.truncate(0)
account.close()
main_app()
def sign_in_func():
user_contents = ask_user.get()
passw_contents = ask_passw.get()
if len(user_contents and passw_contents) == 0:
messagebox.showerror("Fields missing", "Please fill out all fields")
return
else:
login_details_user = open("loginuser.txt", "r")
validate_user = login_details_user.read()
login_details_user.close()
login_details_passw = open("loginpassw.txt", "r")
validate_passw = login_details_passw.read()
if user_contents == validate_user and passw_contents == validate_passw:
messagebox.showinfo("Logged in", "Welcome!")
main_app()
else:
messagebox.showerror("Incorrect login", "Please try again")
if "0" in status:
create_account = Label(text = "Create account", font = ("Segoe UI", 32))
create_account.pack()
spacer(3)
username_label = Label(text = "Username")
username_label.pack()
spacer(1)
username = Entry(width = 50)
username.pack()
spacer(3)
password_label = Label(text = "Password")
password_label.pack()
spacer(1)
password = Entry(width = 50, show = "\u2022")
password.pack()
spacer(1)
shop_label = Label(text = "Name of shop or storeroom (optional)")
shop_label.pack()
spacer(1)
shopNameSet = Entry(width = 50)
shopNameSet.pack()
spacer(1)
create = Button(text = "Create account", width = 60, command = create_account_func)
create.pack()
else:
sign_in = Label(text = "Sign in", font = ("Segoe UI", 32))
sign_in.pack()
spacer(3)
ask_username_label = Label(text = "Username")
ask_username_label.pack()
spacer(1)
ask_user = Entry(width = 50)
ask_user.pack()
spacer(3)
ask_password_label = Label(text = "Password")
ask_password_label.pack()
ask_passw = Entry(width = 50, show = "\u2022")
ask_passw.pack()
spacer(1)
validation_system_activation = Button(text = "Sign in", width = 60, command = sign_in_func)
validation_system_activation.pack()
def settarget():
global file
global target_set
if file == "":
messagebox.showinfo("Set target file", "Please select a file")
window.filename = filedialog.askopenfilename(initialdir = "C:/Documents", title = "Set target file", filetypes = (("text files", ".txt"), ("all files","*.*")))
file = window.filename
letin = open(window.filename, "r")
get_letters = letin.read()
letin.close()
check_used = open("usedfiles.txt", "r")
check = check_used.read()
if file in check and file != "":
fileq = messagebox.askquestion("Clear data", "This file already has already been used with AutoOrder. Are you sure you want to clear it?", icon = "warning")
if fileq == "yes":
clearfile = open(window.filename, "w")
clearfile.truncate(0)
clearfile.close()
check_used.close()
menubar.entryconfigure(1, state = NORMAL)
menubar.entryconfigure(2, state = NORMAL)
menubar.entryconfigure(3, state = NORMAL)
menubar.entryconfigure(4, state = NORMAL)
target_set = True
window.title("AutoOrder - " + window.filename)
else:
messagebox.showinfo("File was not used", "File was not cleared")
check_used.close()
file = ""
window.filename = ""
else:
check_used.close()
check_used = open("usedfiles.txt", "a")
check_used.write(window.filename)
menubar.entryconfigure(1, state = NORMAL)
menubar.entryconfigure(2, state = NORMAL)
menubar.entryconfigure(3, state = NORMAL)
menubar.entryconfigure(4, state = NORMAL)
target_set = True
window.title("AutoOrder - " + window.filename)
if file != "":
itembox.pack()
else:
messagebox.showerror("Could not set target file", "Cannot set target file or target file already set")
class SearchWin:
def searchList(self):
content = self.searchTerms.get()
next_index = 0
elements = int(itembox.size())
for i in range(0, elements):
if content in itembox.get(next_index):
itembox.activate(next_index)
break
else:
if next_index <= elements:
next_index += 1
continue
else:
messagebox.showerror("Item not found", "No item could be found containing " + "'" + content + "'")
def __init__(self):
searchPrompt = Tk()
searchPrompt.title("Search list")
#searchPrompt.iconbitmap("feather.ico")
searchPrompt.resizable(0, 0)
searchText = Label(searchPrompt, text = "Search terms")
searchText.pack()
Label(searchPrompt).pack()
self.searchTerms = Entry(searchPrompt, width = 30)
self.searchTerms.pack(padx = 10)
Label(searchPrompt).pack()
searchbtn = Button(searchPrompt, text = "Search", command = self.searchList)
searchbtn.pack()
def resetapp():
setaccount = open("account.txt", "w")
setaccount.write("0")
setaccount.close()
clearuser = open("loguser.txt", "w")
clearuser.truncate(0)
clearuser.close()
clearpassw = open("loginpassw.txt", "w")
clearpassw.truncate(0)
clearpassw.close()
clearshopname = open("shopnamecontainer.txt", "w")
clearshopname.truncate(0)
clearshopname.close()
clearwebaddr = open("shopwebsite.txt", "w")
clearwebaddr.truncate(0)
clearwebaddr.close()
clearsaves = open("saves.txt", "w")
clearsaves.truncate(0)
clearused = open("usedfiles.txt", "w")
clearused.truncate(0)
clearused.close()
messagebox.showinfo("Exit", "Exit required to update")
try:
sys.exit()
except:
raise SystemExit()
class MailWin:
def __init__(self):
if self.check_connection() == True:
defaultprovider = "smtp-mail.outlook.com"
defaultport = 587
self.provider = defaultprovider
self.port = defaultport
sendMail = Tk()
sendMail.title("Email list")
sendMail.iconbitmap("feather.ico")
sendMail.resizable(0, 0)
sendMailHeader = Label(sendMail, text = "Email list", font = ("Segoe UI", 32))
sendMailHeader.pack()
defaults = Label(sendMail, text = "Default provider: smtp-mail.outlook.com\nDefault port: 587")
defaults.pack()
Label(sendMail).pack()
providerHeader = Label(sendMail, text = "Provider (optional)")
providerHeader.pack()
self.providerBox = Entry(sendMail, width = 50)
self.providerBox.pack()
Label(sendMail).pack()
portHeader = Label(sendMail, text = "Port (optional)")
portHeader.pack()
self.portBox = Entry(sendMail, width = 50)
self.portBox.pack()
Label(sendMail).pack()
mailRecLabel = Label(sendMail, text = "Recipient's email address")
mailRecLabel.pack()
self.recAddr = Entry(sendMail, width = 50)
self.recAddr.pack()
Label(sendMail).pack()
mailUserLabel = Label(sendMail, text = "From email address")
mailUserLabel.pack()
self.mailUserBox = Entry(sendMail, width = 50)
self.mailUserBox.pack()
Label(sendMail).pack()
mailPasswLabel = Label(sendMail, text = "From email password")
mailPasswLabel.pack()
self.mailPasswBox = Entry(sendMail, width = 50, show = "\u2022")
self.mailPasswBox.pack()
Label(sendMail).pack()
sendBtn = Button(sendMail, text = "Send", width = 60, command = self.send)
sendBtn.pack()
else:
messagebox.showerror("No internet", "Internet connection required. Try again later")
def check_connection(self, host = "http://google.com"):
try:
urllib.request.urlopen(host)
return True
except:
return False
def send(self):
global defaultprovider
global defaultport
if len(self.providerBox.get()) > 0:
self.provider = providerBox.get()
self.port = self.portBox.get()
mail_user = self.mailUserBox.get()
mail_passw = self.mailPasswBox.get()
mailRecAddr = self.recAddr.get()
if len(mail_user and mail_passw) > 0:
try:
get_list = open(window.filename, "r")
listContent = get_list.read()
get_list.close()
server = smtplib.SMTP(self.provider, self.port)
server.connect(self.provider, self.port)
server.ehlo()
server.starttls()
server.ehlo()
server.login(mail_user, mail_passw)
server.sendmail(mail_user, mailRecAddr, "\n" + listContent)
messagebox.showinfo("Sent", "Email sent\nProvider: " + self.provider + "\n" + "Port: " + str(self.port))
except:
messagebox.showerror("Invalid", "Invalid information")
else:
messagebox.showerror("Fields missing", "Please fill out all required fields")
def add_checker():
if target_set == True:
AddCall()
else:
messagebox.showerror("No target set", "Cannot add item to no target")
class HTMLRawData:
def createHTML(self):
HTMLRawData.path = self.filepath.get()
class FileTest:
@classmethod
def __init__(cls):
try:
test_path_file = open(HTMLRawData.path + ".txt", "a+")
test_path_file.close()
return True
except:
messagebox.showerror("Invalid path", HTMLRawData.path + " is not a valid file path")
return False
if FileTest.__init__() == True:
path_file = open(HTMLRawData.path + ".txt", "a")
path_file.write("<!DOCTYPE html>\n")
path_file.write("<html>\n")
path_file.write("<title>Raw data</title>")
get_raw_data = open("saves.txt", "r")
html_text = get_raw_data.read()
get_raw_data.close()
path_file.write("<h1>Raw data</h1>\n")
path_file.write("<p>" + str(html_text) + "</p>\n")
path_file.write("</html>\n")
path_file.close()
os.rename(HTMLRawData.path + ".txt", HTMLRawData.path + ".html")
openwebsiteq = messagebox.askquestion("Complete", "Raw data in " + HTMLRawData.path + ".html" + "\nDo you want to open it?")
if openwebsiteq == "yes":
webbrowser.open(HTMLRawData.path + ".html")
else:
pass
else:
return
def __init__(self):
setupWebsite = Tk()
setupWebsite.title("Setup HTML file name")
setupWebsite.iconbitmap("feather.ico")
setupWebsite.resizable(0, 0)
Label(setupWebsite).pack()
setupText = Label(setupWebsite, text = "HTML file name (to create)\nFull path required (without suffix)\nExample: C:/Users/username/Desktop/filename")
setupText.pack(padx = 30)
self.filepath = Entry(setupWebsite, width = 50)
self.filepath.pack()
Label(setupWebsite).pack()
createHTMLbtn = Button(setupWebsite, text = "Create", command = self.createHTML)
createHTMLbtn.pack()
Label(setupWebsite).pack()
class Settings:
@classmethod
def openwebsite(cls):
web_url = open("shopwebsite.txt", "r")
get_addr = web_url.read()
web_url.close()
if len(get_addr) > 0:
try:
webbrowser.open(get_addr)
except:
messagebox.showerror("Invalid URL", get_addr + " is not a valid URL")
else:
messagebox.showerror("No URL set", "URL has not been set")
def set_web_addr(self):
global url_set
web_addr = self.website.get()
self.website.delete(0, "end")
if len(web_addr) > 0:
web_url = open("shopwebsite.txt", "w")
web_url.truncate(0)
web_url.write(web_addr)
web_url.close()
messagebox.showinfo("Web address set", "Shop web address set to: " + web_addr)
url_set = True
return
else:
messagebox.showerror("Enter web address", "Web address required")
return
def __init__(self):
setup = Tk()
setup.title("Settings")
setup.attributes("-toolwindow", 1)
setup.attributes("-topmost", 1)
setup.resizable(0, 0)
setupTabs = Notebook(setup)
itemTab = Frame(setupTabs)
launchTab = Frame(setupTabs)
advancedTab = Frame(setupTabs)
setupTabs.add(itemTab, text = "Products")
setupTabs.add(launchTab, text = "Launch")
setupTabs.add(advancedTab, text = "Advanced")
itemsetup_label = Label(itemTab, text = "Add item")
itemsetup_label.pack()
notebookspacer(1, itemTab)
addbtn = Button(itemTab, text = "Add", command = add_checker)
addbtn.pack()
notebookspacer(1, itemTab)
createHTMLbtn = Button(itemTab, text = "Copy raw data to HTML", command = HTMLDataInstance)
createHTMLbtn.pack()
notebookspacer(1, itemTab)
url_label = Label(itemTab, text = "Shop website URL")
url_label.pack()
self.website = Entry(itemTab)
self.website.pack()
notebookspacer(1, itemTab)
set_website = Button(itemTab, text = "Set website URL", command = self.set_web_addr)
set_website.pack()
launchlabel = Label(launchTab, text = "Launch setup")
launchlabel.pack()
notebookspacer(1, launchTab)
current_username = Label(launchTab, text = "Current user: " + getpass.getuser())
current_username.pack()
notebookspacer(2, launchTab)
exitbtn = Button(launchTab, text = "Exit", command = closeall)
exitbtn.pack()
advancedlabel = Label(advancedTab, text = "Advanced setup")
advancedlabel.pack()
notebookspacer(1, advancedTab)
resetbtn = Button(advancedTab, text = "Reset app", command = resetapp)
resetbtn.pack()
setupTabs.pack()
def savefile():
get_all_items = itemsvar.get()
save_file = open("saves.txt", "r")
letters = save_file.read()
save_file.close()
if len(letters) > 0:
overq = messagebox.askquestion("Overwriting", "Are you sure you want to overwrite the existing backup file?")
if overq == "yes":
save_file = open("saves.txt", "w")
save_file.truncate(0)
save_file.write(str(get_all_items))
save_file.close()
messagebox.showinfo("Backed up", "Backup complete")
else:
messagebox.showinfo("Not overwitten", "Contents were kept")
else:
save_file = open("saves.txt", "w")
save_file.write(str(get_all_items))
save_file.close()
messagebox.showinfo("Backed up", "Backup complete")
def viewfile():
file_was_viewed = True
save_file = open("saves.txt", "r")
insert_text = save_file.read()
save_file.close()
viewer = Tk()
viewer.title("View backed up raw data")
viewer.iconbitmap("feather.ico")
viewer.resizable(0, 0)
file_contents = Text(viewer)
file_contents.config(state = NORMAL)
file_contents.insert(INSERT, insert_text)
file_contents.config(state = DISABLED)
file_contents.pack()
def add():
global session
global no_items
global itemslist
itemname = itembox.get()
if len(itemname) == 0:
messagebox.showerror("Blank item", "Cannot add blank item")
else:
try:
shop_name_details = open("shopnamecontainer.txt")
name_of_shop = shop_name_details.read()
shop_name_details.close()
itemfile = open(window.filename, "a")
session += 1
if name_of_shop != "":
itemfile.write(name_of_shop + ": " + "Product " + str(session) + ": " + itemname + "\n")
itemfile.close()
else:
itemfile.write("Product " + str(session) + ": " + itemname + "\n")
itemfile.close()
itembox.delete(0, "end")
messagebox.showinfo("Product added", "Product was added to " + window.filename + "\nProduct name: " + itemname)
if no_items == True:
no_items = False
window.update()
itembox.pack_forget()
itemslist.pack()
spacer(1)
itembox_label = Label(text = "Product name")
itembox_label.pack()
spacer(1)
itembox.pack()
no_items_label.pack_forget()
if name_of_shop != "":
itemslist.insert(session, name_of_shop + ": " + "Product " + str(session) + ": " + itemname)
else:
itemslist.insert(session, "Product " + str(session) + ": " + itemname)
except:
messagebox.showerror("Could not add", "Item could not be added to list")
def clear():
global file
if file != "":
itemfile = open(file, "r")
readfile = itemfile.read()
itemfile.close()
if len(readfile) == 0:
messagebox.showerror("Could not clear file", "File could not be cleared")
return
if file == "":
settargetq = messagebox.askquestion("No target", "Please set a target. Would you like to set a target now?")
if settargetq == "yes":
settarget()
else:
clearq = messagebox.askquestion("Clear file", "Clear " + file + " and list?")
if clearq == "yes":
itemfile = open(window.filename, "w")
itemfile.truncate(0)
itemfile.close()
itemslist.delete(0, END)
messagebox.showinfo("Cleared", "File and list was cleared")
else:
pass
def printfile():
global file
itemfile = open(window.filename, "r")
sourcecontent = itemfile.read()
itemfile.close()
if len(sourcecontent) > 0:
printq = messagebox.askokcancel("Print?", "Will print to default printer")
if printq:
try:
os.startfile(file, "print")
except:
messagebox.showerror("Cannot print", "Could not print")
else:
messagebox.showerror("Cannot print", "Cannot print blank document")
def get_login():
login_details_user = open("loginuser.txt", "r")
get_username = login_details_user.read()
login_details_user.close()
login_details_passw = open("loginpassw.txt", "r")
get_password = login_details_passw.read()
login_details_passw.close()
messagebox.showinfo("Login details", "Username: " + get_username + "\nPassword: " + get_password + "\nFor security, don't forget to close this message")
def main_app():
global signed_in
signed_in = True
window.title("AutoOrder - No target")
window.resizable(1, 1)
if "0" in status:
username.pack_forget()
password.pack_forget()
username_label.pack_forget()
password_label.pack_forget()
shop_label.pack_forget()
shopNameSet.pack_forget()
create_account.pack_forget()
create.pack_forget()
else:
sign_in.pack_forget()
ask_username_label.pack_forget()
ask_user.pack_forget()
ask_password_label.pack_forget()
ask_passw.pack_forget()
validation_system_activation.pack_forget()
menubar.add_command(label = "Login", command = get_login)
menubar.add_command(label = "Target", command = settarget)
menubar.add_command(label = "Search", command = SearchInstance)
menubar.add_command(label = "Settings", command = SettingsInstance)
menubar.add_command(label = "Exit", command = closeall)
spacer(1)
items_list_label = Label(text = "Products", font = ("Segoe UI", 32))
items_list_label.pack()
spacer(1)
no_items_label.pack()
spacer(3)
clearbtn = Button(text = "Clear", width = 10, command = clear)
clearbtn.pack(pady = 30, side = BOTTOM)
class OpenWebsiteBtn:
def __init__(self):
websitebtn = Button(text = "Open website", width = 20, command = Settings.openwebsite)
websitebtn.pack(side = BOTTOM)
show_btn = OpenWebsiteBtn()
spacer(3)
window.config(menu = menubar)
window.protocol("WM_DELETE_WINDOW", closeall)
window.mainloop()
Hope this is helpful!
The rest works fine!
Everything is important!