Update from Digitizing paper label system with Python
I have implemented a username and password log in and main application to be used after successful log in.
I am ready for some more feedback.
My main troubles is error handling. For example log in screen, I'll need to implement statement to show if user does not exist etc.. Nothing too fancy. Also, maybe add a scroll bar and center the screen for both classes when opened up.
Also, if there is nothing inside a folder, the drop down menu dissapears and shows nothing, I'll need to work on that too. Maybe pop another screen saying 'No files in folder, come back later'.
Here is my full code:
from tkinter import *
from tkinter import DISABLED, messagebox
import tkinter.ttk as ttk
import os
import glob
from PIL import Image, ImageTk, ImageGrab
from pathlib import Path
import pyautogui
import time
def main():
root = Tk()
app = Window1(root)
root.mainloop()
class Window1:
def __init__(self,master):
self.master = master
self.master.title("User Log In")
self.master.geometry('400x150')
self.frame = Frame(self.master)
self.frame.pack(fill="both", expand=True)
self.label_username = Label(self.frame, text="Username: ",font=("bold",16))
self.entry_username = Entry(self.frame, font = ("bold", 14))
self.label_password = Label(self.frame, text="Password: ",font=("bold",16))
self.entry_password = Entry(self.frame, show="*", font = ("bold", 14))
self.label_username.pack()
self.entry_username.pack()
self.label_password.pack()
self.entry_password.pack()
self.logbtn = Button(self.frame, text="Login", font = ("bold", 10), command=self._login_btn_clicked)
self.logbtn.pack()
#close and stop tkinter running in backround, also see line #64
def on_closing(self):
self.master.destroy()
def _login_btn_clicked(self):
# print("Clicked")
username = self.entry_username.get()
password = self.entry_password.get()
# print(username, password)
account_list = [line.split(":", maxsplit=1) for line in open("passwords.txt")]
# list of 2-tuples. Usersnames with colons inside not supported.
accounts = {key: value.rstrip() for key, value in account_list}
# Convert to dict[username] = password, and slices off the line ending.
# Does not support passwords ending in whitespace.
if accounts[username] == password:
self.master.withdraw()
self.newWindow = Toplevel(self.master)
self.newWindow.protocol("WM_DELETE_WINDOW", self.on_closing)
self.app = Window2(self.newWindow, window1 = self)
else:
messagebox.showinfo("User message", "Invalid username or password specified please try again")
class Window2:
def __init__(self,master, window1):
notebook = ttk.Notebook(master)
notebook.pack(expand = 1, fill = "both")
#Frames
main = ttk.Frame(notebook)
manual = ttk.Frame(notebook)
notebook.add(main, text='Main-Screen')
notebook.add(manual, text='Manual')
self.window1 = window1
def clock():
t=time.strftime('%d/%m/%Y, %H:%M:%S, ',time.localtime())
if t!='':
self.display_time.config(text=t,font='times 15')
main.after(100,clock)
self.display_time=Label(main)
self.display_time.grid(column = 3, row = 0)
clock()
username = self.window1.entry_username.get()
self.User = Label(main, text = 'User: '+ username, font = ('15'))
self.User.grid(column = 4, row = 0)
var1 = IntVar()
var2 = IntVar()
var3 = IntVar()
var4 = IntVar()
var5 = IntVar()
var6 = IntVar()
var7 = IntVar()
var8 = IntVar()
var9 = IntVar()
var10 = IntVar()
var11 = IntVar()
var12 = IntVar()
#Displaying checkboxes and assigning to variables
self.Checkbox1 = Checkbutton(main, text="Ingredients present in full (any allergens in bold with allergen warning if necessary)", variable=var1)
self.Checkbox1.grid(column = 2, row = 1, sticky = W)
self.Checkbox2 = Checkbutton(main, text="May Contain Statement.", variable=var2)
self.Checkbox2.grid(column = 2, row = 2, sticky = W)
self.Checkbox3 = Checkbutton(main, text="Cocoa Content (%).", variable=var3)
self.Checkbox3.grid(column = 2, row = 3, sticky = W)
self.Checkbox4 = Checkbutton(main, text="Vegetable fat in addition to Cocoa butter", variable=var4)
self.Checkbox4.grid(column = 2, row = 4, sticky = W)
self.Checkbox5 = Checkbutton(main, text="Instructions for Use.", variable=var5)
self.Checkbox5.grid(column = 2, row = 5, sticky = W)
self.Checkbox6 = Checkbutton(main, text="Additional warning statements (pitt/stone, hyperactivity etc)", variable=var6)
self.Checkbox6.grid(column = 2, row = 6, sticky = W)
self.Checkbox7 = Checkbutton(main, text="Nutritional Information Visible", variable=var7)
self.Checkbox7.grid(column = 2, row = 7, sticky = W)
self.Checkbox8 = Checkbutton(main, text="Storage Conditions", variable=var8)
self.Checkbox8.grid(column = 2, row = 8, sticky = W)
self.Checkbox9 = Checkbutton(main, text="Best Before & Batch Information", variable=var9)
self.Checkbox9.grid(column = 2, row = 9, sticky = W)
self.Checkbox10 = Checkbutton(main, text="Net Weight & Correct Font Size.", variable=var10)
self.Checkbox10.grid(column = 2, row = 10, sticky = W)
self.Checkbox11 = Checkbutton(main, text="Barcode - Inner", variable=var11)
self.Checkbox11.grid(column = 2, row = 11, sticky = W)
self.Checkbox12 = Checkbutton(main, text="Address & contact details correct", variable=var12)
self.Checkbox12.grid(column = 2, row = 12, sticky = W)
#PrintScreen
def PrintScreen():
pyautogui.keyDown('alt')
pyautogui.keyDown('printscreen')
pyautogui.keyUp('printscreen')
pyautogui.keyUp('alt')
self.dataSend['state'] = 'normal'
def var_states():
text_file = open("logfile.txt", "a")
text_file.write("Username: [%s], option 1: [%d], option 2: [%d], option 3: [%d], option 4: [%d], option 5: [%d], option 6: [%d], option 7: [%d], option 8: [%d], option 9: [%d], option 10: [%d], option 11: [%d], option 12: [%d], Original Sign Off: [%s]\n" % (username,var1.get(), var2.get(), var3.get(), var4.get(), var5.get(), var6.get(), var7.get(), var8.get(), var9.get(), var10.get(), var11.get(), var12.get(), self.p))
text_file.close()
self.img = ImageGrab.grabclipboard()
self.img.save("%s" % ('//SERVER/shared_data/Technical/Label Sign Off Sheets/sign off project/Signed/'+ os.path.basename(self.p).strip('- to sign.jpg') + ' ' + username+ '.jpg'), 'JPEG')
ed = ('//SERVER/shared_data/Technical/Label Sign Off Sheets/sign off project/Signed/'+ os.path.basename(self.p).strip('- to sign.jpg') +' ed'+ '.jpg')
Nb = ('//SERVER/shared_data/Technical/Label Sign Off Sheets/sign off project/Signed/'+ os.path.basename(self.p).strip('- to sign.jpg') +' Nb'+ '.jpg')
jj = ('//SERVER/shared_data/Technical/Label Sign Off Sheets/sign off project/Signed/'+ os.path.basename(self.p).strip('- to sign.jpg') +' jj'+ '.jpg')
kl = ('//SERVER/shared_data/Technical/Label Sign Off Sheets/sign off project/Signed/'+ os.path.basename(self.p).strip('- to sign.jpg') +' kl'+ '.jpg')
if os.path.exists(ed) and os.path.exists(Nb) or os.path.exists(jj) or os.path.exists(kl):
os.remove('//SERVER/shared_data/Technical/Label Sign Off Sheets/sign off project/To sign/' + os.path.basename(self.p))
else:
print("False")
self.dataSend = Button(main, text = "Send", command = var_states, state = DISABLED)
self.dataSend.grid(column = 1, row = 13, sticky = W)
self.CaptureScreen = Button(main, text = "PrintScreen", command = PrintScreen, state = DISABLED)
self.CaptureScreen.grid(column = 1, row = 14, sticky = W)
###################################################################################################################################
##Load Image##
###################################################################################################################################
# Create a Tkinter variable
self.tkvar = StringVar()
# Directory
self.nonedisplayed = "N/A"
self.directory = "//SERVER/shared_data/Technical/Label Sign Off Sheets/sign off project/To Sign"
self.choices = glob.glob(os.path.join(self.directory, "*- to sign.jpg"))
self.tkvar.set('...To Sign Off...') # set the default option
# Images
def change_dropdown():
imgpath = self.tkvar.get()
img = Image.open(imgpath)
photo = ImageTk.PhotoImage(img)
label2.image = photo
label2.configure(image=photo)
self.CaptureScreen['state'] = 'normal'
#return path value
self.p = None
def func(value):
global p
self.p = Path(value)
print(self.p)
#widgets
self.msg1 = Label(main, text = "Choose here")
self.msg1.grid(column = 0, row = 0)
self.popupMenu = OptionMenu(main, self.tkvar, *self.choices, command = func)
self.popupMenu.grid(row=1, column=0)
self.display_label = label2 = Label(main, image=None)
self.display_label.grid(row=2, column=0, rowspan = 500)
self.open_button = Button(main, text="Open", command=change_dropdown)
self.open_button.grid(row=502, column=0)
###################################################################################################################################
##TAB 2 - MANUAL##
###################################################################################################################################
def manualopen():
os.startfile('//SERVER/shared_data/Technical/Food Safety & Quality Manual/Section 21 - Process Control/21.LABL.02 - Labelling notes.docx')
self.manualBtn = Button(manual, text= "open doc", command = manualopen)
self.manualBtn.pack()
if __name__ == '__main__':
main()
Also, my passwords.txt file looks like this:
ed:password1
Nb:rother
jj:4spaces
kl:timepass