Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # imports
- from functools import partial
- from tkinter import *
- from tkinter import messagebox
- from multiprocessing import Process, Queue
- import tkinter.ttk
- import pymysql
- import time
- import traceback
- from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
- from matplotlib.figure import Figure
- import threading
- import pythoncom
- import sys
- import psutil
- import os
- import math
- import win32event, win32api, winerror, win32con
- import win32gui
- import re
- import datetime, time
- import ctypes
- import pymysql
- import io
- import traceback
- import PyHook3
- global database
- database = "testdb2"
- def relax(m_relax):
- m_relax = 1
- messagebox.showinfo("Message", "Now you in relax mode" + str(m_relax))
- class Relaxmode(Frame):
- def __init__(self, master=None):
- super().__init__(master)
- self.toggle1 = tkinter.ttk.Button(text="Off",
- command=lambda *args: self.toggle(self.toggle1))
- self.toggle1.pack(padx=5, pady=5)
- self.toggle2 = tkinter.ttk.Button(text="Off", style="Toolbutton",
- command=lambda *args: self.toggle(self.toggle2))
- self.toggle2.pack(padx=5, pady=5)
- self.toggle3 = tkinter.ttk.Button(text="Off",
- command=lambda *args: self.toggle(self.toggle3))
- self.toggle3.pack(padx=5, pady=5)
- style = tkinter.ttk.Style()
- style.configure("Toggle.TButton")
- style.map("Toggle.TButton", relief=[("pressed", "sunken"),
- ("selected", "sunken"), ("!selected", "raised")])
- self.toggle3.config(style="Toggle.TButton")
- tkinter.ttk.Button(text="Quit",
- command=self.master.destroy).pack(padx=5, pady=5)
- self.pack()
- def toggle(self, button):
- if button.instate(("!selected",)):
- button.state(("selected",))
- button.config(text="On")
- else:
- button.state(("!selected",))
- button.config(text="Off")
- class Clock(Label):
- """ Class that contains the clock widget and clock refresh """
- def __init__(self, parent=None, seconds=True, colon=False):
- """
- Create and place the clock widget into the parent element
- It's an ordinary Label element with two additional features.
- """
- Label.__init__(self, parent)
- self.display_seconds = seconds
- if self.display_seconds:
- self.time = time.strftime('%H:%M:%S')
- else:
- self.time = time.strftime('%I:%M %p').lstrip('0')
- self.display_time = self.time
- self.configure(text=self.display_time)
- if colon:
- self.blink_colon()
- self.after(200, self.tick)
- def tick(self):
- """ Updates the display clock every 200 milliseconds """
- if self.display_seconds:
- new_time = time.strftime('%H:%M:%S')
- else:
- new_time = time.strftime('%I:%M %p').lstrip('0')
- if new_time != self.time:
- self.time = new_time
- self.display_time = self.time
- self.configure(text=self.display_time)
- self.after(200, self.tick)
- def blink_colon(self):
- """ Blink the colon every second """
- if ':' in self.display_time:
- self.display_time = self.display_time.replace(':', ' ')
- else:
- self.display_time = self.display_time.replace(' ', ':', 1)
- self.config(text=self.display_time)
- self.after(1000, self.blink_colon)
- class Aboutscreen(Frame):
- def __init__(self, parent):
- Frame.__init__(self, parent)
- Lfont = ('helvetica', 14)
- l1 = Label(self, text="A Personal Assistant Program for Monitoring Computer Usages", font=Lfont)
- l2 = Label(self, text="CPE KMUTT COMPANY", font=Lfont)
- l3 = Label(self, text="Contact", font=Lfont)
- l4 = Label(self, text="Mr. Pubodee Kamonmasmatakul Tel. 0123456789", font=Lfont)
- l5 = Label(self, text="Mr. Tanasit Tuangcharoentip Tel. 0123456789", font=Lfont)
- l1.grid(row=1, column=1)
- l2.grid(row=2, column=1)
- l3.grid(row=3, column=1)
- l4.grid(row=4, column=1)
- l5.grid(row=5, column=1)
- self.grid_rowconfigure(0, weight=1)
- self.grid_rowconfigure(6, weight=1)
- self.grid_columnconfigure(0, weight=1)
- self.grid_columnconfigure(6, weight=1)
- # main Class
- class UI:
- def __init__(self, master):
- # Window
- self.master = master
- # Some Usefull variables
- self.database = 'testdb2'
- self.username = StringVar()
- self.password = StringVar()
- self.n_username = StringVar()
- self.n_password = StringVar()
- self.n_firstname = StringVar()
- self.n_lastname = StringVar()
- self.n_age = IntVar()
- self.n_gender = StringVar()
- self.c_id = IntVar()
- self.status = IntVar()
- self.minrating = IntVar()
- self.maxrating = IntVar()
- self.worktime = IntVar()
- self.m_relax = IntVar()
- self.screen_w = root.winfo_screenmmwidth()
- self.screen_h = root.winfo_screenmmheight()
- self.date = StringVar()
- self.logintime = StringVar()
- # Create Widgets
- self.widgets()
- menu = Menu(self.master)
- self.master.config(menu=menu)
- file = Menu(menu)
- file.add_command(label="Exit", command=self.client_exit)
- menu.add_cascade(label="File", menu=file)
- edit = Menu(menu)
- edit.add_command(label="Undo")
- menu.add_cascade(label="Edit", menu=edit)
- help = Menu(menu)
- help.add_command(label="About", command=self.about)
- menu.add_cascade(label="Help", menu=help)
- def client_exit(self):
- exit()
- def close_tab(self, window):
- window.destroy()
- def dashboard(self):
- global x1
- global x2
- global x3
- self.logintime = StringVar()
- self.logofftime = StringVar()
- # x1 = float(entry1.get())
- # x2 = float(entry2.get())
- # x3 = float(entry3.get())
- db = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=self.database,
- use_unicode=True,
- charset='utf8')
- c = db.cursor()
- find_avr = ('SELECT * FROM avrdata WHERE id = %s and date = %s')
- c.execute(find_avr, (self.c_id, '2019-02-23'))
- result = c.fetchall()
- self.logofftime.set('')
- self.logintime.set('')
- for row in result:
- self.logintime = row[3]
- self.logofftime = row[4]
- x1 = 1
- x2 = 2
- x3 = 3
- db.close()
- window = Toplevel(root)
- window.title("Dashboard")
- width_value = root.winfo_screenwidth()
- height_value = root.winfo_screenheight()
- window.geometry('%dx%d+0+0' % (width_value, height_value))
- window.configure(padx=10, pady=10)
- # scrollbar = Scrollbar(window, orient="vertical")
- # scrollbar.pack(side=RIGHT, fill=Y)
- wframe = Canvas(window, width=1920, height=1080)
- topframe = Frame(wframe, bd=1, relief="solid")
- topframe.pack(fill=X, anchor=W, padx=10, pady=10)
- botframe = Frame(wframe, width=1920, height=2000, bd=1, relief="solid")
- bbtn = Button(botframe, text="Show more", font=('', 15))
- bbtn.pack()
- botframe.pack(padx=10, pady=10, fill=X)
- time = Frame(topframe, padx=100, pady=10, bg="white")
- time.pack(side=LEFT, anchor=NW, padx=10, pady=30)
- toptime = Frame(time, bg="white")
- toptime.pack(anchor=W, padx=10, pady=30)
- bottime = Frame(time, bg="white")
- bottime.pack(anchor=W, padx=10, pady=30)
- atime = Frame(toptime, padx=10, pady=10, bg="white", bd=1, relief="solid")
- atime.pack(side=LEFT, anchor=W, padx=10, pady=30)
- Label(atime, text="Arrive time", font=('', 20), pady=5, padx=5, bg="white").grid(sticky="W", row=0, column=0)
- Label(atime, text=self.logintime, font=('', 40), pady=5, padx=5, bg="white", fg="green").grid(sticky=W, \
- row=1, column=0)
- ltime = Frame(toptime, padx=10, pady=10, bg="white", bd=1, relief="solid")
- ltime.pack(side=LEFT, anchor=W, padx=10, pady=30)
- Label(ltime, text="Left time", font=('', 20), pady=5, padx=5, bg="white").grid(sticky=W, row=0, column=0)
- Label(ltime, text=self.logofftime, font=('', 40), pady=5, padx=5, bg="white", fg="green").grid(sticky=W, \
- row=1, column=0)
- ttime = Frame(bottime, padx=10, pady=10, bg="white", bd=1, relief="solid")
- ttime.pack(side=LEFT, anchor=W, padx=10, pady=30)
- Label(ttime, text="Total time", font=('', 20), pady=5, padx=5, bg="white").grid(sticky=W, row=0, column=0)
- Label(ttime, text="9.00 hr.", font=('', 40), pady=5, padx=5, bg="white", fg="green").grid(sticky=W, \
- row=1, column=0)
- figure2 = Figure(figsize=(5, 4))
- subplot2 = figure2.add_subplot(111)
- labels2 = 'Relax', 'Hard Work', 'Working'
- pieSizes = [float(x1), float(x2), float(x3)]
- explode2 = (0, 0.1, 0)
- subplot2.pie(pieSizes, explode=explode2, labels=labels2, autopct='%1.1f%%', shadow=True, startangle=90)
- subplot2.axis('equal')
- pie2 = FigureCanvasTkAgg(figure2, master=topframe)
- pie2.get_tk_widget().pack(anchor=E, padx=10, pady=30, fill=BOTH)
- figure1 = Figure(figsize=(5, 4), dpi=100)
- subplot1 = figure1.add_subplot(111)
- xAxis = [float(x1), float(x2), float(x3)]
- yAxis = [float(x1), float(x2), float(x3)]
- subplot1.bar(xAxis, yAxis, color='g')
- bar1 = FigureCanvasTkAgg(figure1, master=botframe)
- # bar1.get_tk_widget().pack(fill=BOTH, expand=TRUE)
- # wframe.configure(yscrollcommand=scrollbar.set)
- # scrollbar.configure(command=wframe.yview)
- wframe.pack(fill=BOTH)
- # print(self.logintime)
- # print(self.logofftime)
- # Login Function
- def login(self):
- # Establish Connection
- # Open database connection
- db = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=self.database,
- use_unicode=True,
- charset='utf8')
- c = db.cursor()
- # Find user If there is any take proper action
- find_user = ('SELECT * FROM employee WHERE uname = %s and password = %s')
- find_avr = ('SELECT * FROM avrdatahour WHERE id = %s and date = %s')
- timestamp = ("INSERT INTO avrdatahour(ID,date,starttime) VALUES(%s,%s,%s)")
- c.execute(find_user, [(self.username.get()), (self.password.get())])
- result = c.fetchall()
- if result:
- for row in result:
- # save current id and stamp login time
- self.c_id = row[0]
- # Get Date
- self.date = time.strftime('%Y-%m-%d')
- self.logintime = time.strftime('%H:%M:%S')
- showtime = time.strftime('%I:%M %p').lstrip('0')
- messagebox.showinfo("Message",
- "You log in when " + str(self.date) + " " + str(showtime) + " with user " + str(
- self.username.get()))
- c.execute(find_avr, (self.c_id, self.date))
- result1 = c.fetchall()
- if not result1:
- c.execute(timestamp, (self.c_id, self.date, self.logintime))
- db.commit()
- else:
- traceback.print_exc()
- db.rollback()
- # self.head['pady'] = 150
- db.close()
- self.home()
- else:
- messagebox.showerror('Oops!', 'Username Not Found.')
- def new_user(self):
- # Establish Connection
- db = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=self.database,
- use_unicode=True,
- charset='utf8')
- c = db.cursor()
- # Find Existing username if any take proper action
- find_user = ('SELECT * FROM employee WHERE uname = %s')
- c.execute(find_user, [(self.n_username.get())])
- if c.fetchall():
- messagebox.showerror('Error!', 'Username Taken Try a Diffrent One.')
- else:
- messagebox.showinfo('Success!', 'Account Created!')
- self.log()
- # Create New Account
- insert = ('INSERT INTO employee(uname,password,fname,lname,gender,age) VALUES(%s,%s,%s,%s,%s,%s)')
- c.execute(insert, (
- (self.n_username.get()), (self.n_password.get()), (self.n_firstname.get()), (self.n_lastname.get()),
- (self.n_gender.get()), (self.n_age.get())))
- db.commit()
- # Frame Packing Methods
- def log(self):
- root.geometry("")
- self.username.set('')
- self.password.set('')
- self.crf.pack_forget()
- self.logf.pack()
- def relog(self):
- if (messagebox.askokcancel("Log Out", "Are you sure to log out ?")):
- db = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=self.database,
- use_unicode=True,
- charset='utf8')
- c = db.cursor()
- self.topFrame.pack_forget()
- self.clock2.pack_forget()
- self.homef.pack_forget()
- # self.username = StringVar()
- # self.password = StringVar()
- # self.username.set('')
- # self.password.set('')
- logofftime = time.strftime('%H:%M:%S')
- showtime = time.strftime('%I:%M %p').lstrip('0')
- timestamp = ("UPDATE avrdatahour SET endtime = %s WHERE ID = %s and date = %s")
- # self.logf.pack_forget()
- try:
- c.execute(timestamp, (logofftime, self.c_id, self.date))
- db.commit()
- messagebox.showinfo("Message", "You log off when " + str(self.date) + " " + str(showtime))
- except:
- traceback.print_exc()
- db.rollback()
- # exit()
- self.log()
- def cr(self):
- self.n_username.set('')
- self.n_password.set('')
- self.n_firstname.set('')
- self.n_lastname.set('')
- self.n_age.set(0)
- self.n_gender.set('Male')
- self.logf.pack_forget()
- # self.head['text'] = 'Create Account'
- self.crf.pack()
- def home(self):
- root.geometry("500x320")
- root.title("Home")
- self.p1 = Process(target=Tracking)
- self.p1.start()
- self.m_relax.set(0)
- self.logf.pack_forget()
- self.topFrame = Frame(self.master, padx=10, pady=10)
- self.topFrame.pack(fill=X)
- self.lFrame = Frame(self.topFrame)
- self.lFrame.pack(side=LEFT)
- self.rFrame = Frame(self.topFrame)
- self.rFrame.pack(side=RIGHT)
- Checkbutton(self.lFrame, text="Relax Mode", font=("", 20), variable=self.m_relax, onvalue=1, offvalue=0,
- command=lambda: relax(self.m_relax)).grid(sticky=W)
- Label(self.rFrame, textvariable=self.username, font=('', 20), pady=5, padx=5).grid(row=0, column=1, sticky=E)
- Button(self.rFrame, text='Log Out ', bd=3, font=('', 15), padx=5, pady=5, command=self.relog).grid(row=0,
- column=2,
- sticky=E)
- self.clock2 = Clock(seconds=False, colon=True)
- self.clock2.pack(pady=20)
- self.clock2.configure(bg='black', fg='lightgreen', font=("", 20))
- self.homef.pack()
- def about(self):
- window = Toplevel(root)
- window_w = 600
- window_h = 300
- window.title("about")
- window.geometry("%dx%d" % (window_w, window_h))
- Aboutscreen(window).grid(sticky="nsew")
- window.grid_rowconfigure(0, weight=1)
- window.grid_columnconfigure(0, weight=1)
- def set(self):
- window = Toplevel(root)
- window.configure(padx=10, pady=10)
- Label(window, text='Min Rating: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(window, textvariable=self.n_username, bd=5, font=('', 15)).grid(row=0, column=1)
- Label(window, text='Max Rating: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(window, textvariable=self.n_password, bd=5, font=('', 15), show='*').grid(row=1, column=1)
- Label(window, text='Work Time: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(window, textvariable=self.n_username, bd=5, font=('', 15)).grid(row=2, column=1)
- Button(window, text='Save', bd=3, font=('', 15), padx=5, pady=5, command=partial(self.close_tab, window)).grid(
- sticky=W + E + N + S)
- Button(window, text='Add Program List', bd=3, font=('', 15), padx=5, pady=5, command=self.close_tab).grid(row=3,
- column=1,
- sticky=E)
- # Draw Widgets
- def widgets(self):
- # self.head = Label(self.master, text='LOGIN', font=('', 35), pady=10)
- # self.head = Label(self.master, text='HOME', font=('', 35), pady=10)
- # self.head.pack()
- self.logf = Frame(self.master, padx=10, pady=10)
- Label(self.logf, text='Username: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(self.logf, textvariable=self.username, bd=5, font=('', 15)).grid(row=0, column=1)
- Label(self.logf, text='Password: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(self.logf, textvariable=self.password, bd=5, font=('', 15), show='*').grid(row=1, column=1)
- Button(self.logf, text=' Login ', bd=3, font=('', 15), padx=5, pady=5, command=self.login).grid(
- sticky=W + E + N + S)
- Button(self.logf, text=' Create Account ', bd=3, font=('', 15), padx=5, pady=5, command=self.cr).grid(row=2,
- column=1,
- sticky=E)
- self.logf.pack()
- self.crf = Frame(self.master, padx=10, pady=10)
- Label(self.crf, text='Username: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(self.crf, textvariable=self.n_username, bd=5, font=('', 15)).grid(row=0, column=1)
- Label(self.crf, text='Password: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(self.crf, textvariable=self.n_password, bd=5, font=('', 15), show='*').grid(row=1, column=1)
- Label(self.crf, text='Firstname: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(self.crf, textvariable=self.n_firstname, bd=5, font=('', 15)).grid(row=2, column=1)
- Label(self.crf, text='Lastname: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(self.crf, textvariable=self.n_lastname, bd=5, font=('', 15)).grid(row=3, column=1)
- Label(self.crf, text='Age: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Entry(self.crf, textvariable=self.n_age, bd=5, font=('', 15)).grid(row=4, column=1)
- Label(self.crf, text='Gender: ', font=('', 20), pady=5, padx=5).grid(sticky=W)
- Radiobutton(self.crf, text='Male', variable=self.n_gender, value='Male', font=('', 20)).grid(row=5, column=1)
- Radiobutton(self.crf, text='Female', variable=self.n_gender, value='Female', font=('', 20)).grid(row=5,
- column=2)
- Button(self.crf, text='Create Account', bd=3, font=('', 15), padx=5, pady=5, command=self.new_user).grid()
- Button(self.crf, text='Go to Login', bd=3, font=('', 15), padx=5, pady=5, command=self.log).grid(row=6,
- column=1)
- self.homef = Frame(self.master, padx=10, pady=10)
- Button(self.homef, text='Dashboard', bd=3, font=('', 15), padx=5, pady=5, command=self.dashboard).grid()
- Button(self.homef, text='Setting', bd=3, font=('', 15), padx=5, pady=5, command=self.set).grid(row=0,
- column=1)
- # self.home()
- # self.homef.pack()
- def Tracking():
- global database
- database = "testdb2"
- thread1 = threading.Thread(target=mouse_key)
- thread2 = threading.Thread(target=Timetracking)
- thread3 = threading.Thread(target=Apptracking)
- thread1.start()
- thread2.start()
- thread3.start()
- def Apptracking():
- global database
- print("Apptrack")
- def addAppandTime(applist, timelist):
- myString = ",".join(applist)
- myTime = ",".join(map(str, timelist))
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- try:
- with connection.cursor() as cursor:
- sql = "INSERT INTO applicationlist (`ID`, `applist`, `timelist`) VALUES (%s,%s,%s)"
- try:
- cursor.execute(sql, (1, myString, myTime))
- print("AppandTime List added successfully")
- except:
- traceback.print_exc()
- connection.rollback()
- print("Oops! Something wrong with adding appandtimelist")
- connection.commit()
- finally:
- connection.close()
- def uploadAppandTime(applist, timelist):
- myString = ",".join(applist)
- myTime = ",".join(map(str, timelist))
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- try:
- with connection.cursor() as cursor:
- sql = "UPDATE applicationlist SET `applist`= %s , `timelist`= %s WHERE `id` = %s"
- try:
- cursor.execute(sql, (myString, myTime, 1))
- print("AppandTime List updated successfully")
- except:
- traceback.print_exc()
- connection.rollback()
- print("Oops! Something wrong with updating appandtimelist")
- connection.commit()
- finally:
- connection.close()
- num = [] # int
- relaxlist = []
- i = 0
- check = 0
- record = []
- titles = []
- count = []
- # get text from active window
- def enumWindowsProc(hwnd, lParam):
- if win32gui.IsWindowVisible(hwnd):
- text = win32gui.GetWindowText(hwnd)
- text = re.sub(r" ?\([^)]+\)", "", text)
- # text = text.decode("utf-8")
- program = text.rsplit('- ', 2)
- program.reverse()
- if text.find("Google Chrome") >= 0:
- program[1] = program[1].strip()
- titles.append(program[0] + "||" + program[1])
- else:
- titles.append(program[0])
- def readData():
- record = []
- count = []
- relaxlist = []
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- try:
- with connection.cursor() as cursor:
- sql = "SELECT `applist`, `timelist` FROM applicationlist WHERE `id` = %s"
- sqlrelax = "SELECT `relaxlist` FROM setting WHERE `id` = %s"
- try:
- cursor.execute(sql, (1))
- result = cursor.fetchall()
- for row in result:
- record = row[0]
- print(record)
- count = row[1]
- print(count)
- cursor.execute(sqlrelax, (1))
- result = cursor.fetchall()
- for row in result:
- relaxlist = row[0]
- except:
- traceback.print_exc()
- connection.rollback()
- print("Oops! Something wrong can't read")
- connection.commit()
- finally:
- connection.close()
- if not record:
- check = 0
- else:
- check = 1
- return record, count, relaxlist, check
- # record to applog.txt
- open('applog.txt', 'w').close()
- record, count, relaxlist, check = readData()
- if relaxlist:
- relaxlist = relaxlist.split(",")
- while True:
- time.sleep(60)
- # read file as number
- # file = open("setting.txt", "r")
- # data = file.readline()
- # data = data.rstrip("\n")
- # while data != "":
- # data = int(data)
- # num.append(data)
- # data = file.readline()
- # file.close()
- # relax = num[3]
- relax = UI.m_relax
- win32gui.EnumWindows(enumWindowsProc, 0)
- timecheck = time.ctime()
- while '' in titles:
- titles.remove('')
- if check == 0:
- record = titles
- for i in range(len(record)):
- count.append(0)
- elif check == 1:
- record = record.split(",")
- count = count.split(",")
- count = list(map(int, count))
- titles = list(dict.fromkeys(titles))
- record = list(dict.fromkeys(record))
- for i in range(len(titles)):
- for j in range(len(record)):
- if (titles[i] == record[j]):
- count[j] += 1
- break
- if (titles[i] != record[j] and j == len(record) - 1):
- record.append(titles[i])
- count.append(1)
- print("List Added")
- while 0 in count:
- count.remove(0)
- fp = io.open("applog.txt", "a+", encoding='utf-8')
- fp.write(repr(timecheck) + "\n")
- fp.write("Record" + "\n" + "\n")
- for j in range(len(record)):
- fp.write("%s" % record[j])
- fp.write(" minutes used = " + repr(count[j]) + "\n")
- fp.write("\n" + "Titles" + "\n" + "\n")
- for i in range(len(titles)):
- fp.write(repr(titles[i]) + "\n")
- # check relaxlist with current active programs
- if relax == 0:
- for i in range(len(relaxlist)):
- for j in range(len(titles)):
- re.findall(relaxlist[i], titles[j])
- if re.findall(relaxlist[i], titles[j]):
- fp.write("Found = " + repr(titles[j]) + "\n")
- ctypes.windll.user32.MessageBoxW(0, titles[j], "Match Program Detected", 0)
- # finish
- fp.write("\n")
- fp.close()
- if check == 0:
- addAppandTime(record, count)
- check = 2
- else:
- uploadAppandTime(record, count)
- check = 2
- titles.clear()
- def Timetracking():
- global database
- record = [] # int
- print("TimeTrack")
- # Establish Connection
- # Open database connection
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- c = connection.cursor()
- # Find user If there is any take proper action
- find_user = ('SELECT * FROM setting WHERE ID = 1')
- c.execute(find_user)
- result = c.fetchall()
- if result:
- for row in result:
- for count in range(0, len(row)):
- record.append(row[count])
- connection.close()
- global id
- global number
- global minute
- global actualminute
- global currentround
- global rating
- global key
- global mouseclick
- global mousetravel
- global mousescroll
- global total_cpu
- global total_memory
- global total_disk
- global relax_count
- global work_count
- global hard_count
- global hour_cpu
- global hour_memory
- global hour_disk
- global hour_key
- global hour_mouseclick
- global hour_mousetravel
- global hour_mousescroll
- global hour_rating
- global hour_count
- global check
- global checkstatuslastround
- global lowerthreshold
- global higherthreshold
- global limit
- global relax_streak
- global start
- global last_minute
- global workingdate
- global timecheckbefore
- global oldx, oldy
- id = 1
- number = 0
- minute = 1
- actualminute = 0
- currentround = 0
- rating = 0
- key = 0
- mouseclick = 0
- mousetravel = 0
- mousescroll = 0
- total_cpu = 0
- total_memory = 0
- total_disk = 0
- relax_count = 0
- work_count = 0
- hard_count = 0
- hour_cpu = 0
- hour_memory = 0
- hour_disk = 0
- hour_key = 0
- hour_mouseclick = 0
- hour_mousetravel = 0
- hour_mousescroll = 0
- hour_rating = 0
- hour_count = 0
- check = 0
- checkstatuslastround = 0
- lowerthreshold = 2000
- higherthreshold = 4000
- limit = record[1]
- relax_streak = 0
- start = time.time()
- last_minute = 0
- workingdate = 0
- # workingdate = time.strftime('%Y-%m-%d')
- timecheckbefore = 0
- oldx, oldy = win32api.GetCursorPos()
- def showwarning(count): # warn at 90 and 10 relax streak
- global check
- global relax_streak
- global limit
- if relax_streak == 10:
- result = ctypes.windll.user32.MessageBoxW(0,
- "You have been relaxing for 10 minutes. Do you want to stop using the computer?",
- "Lack of usage detected", 4)
- if result == 6:
- check = 1
- elif result == 7:
- check = 0
- relax_streak = 0
- if count == limit:
- result = ctypes.windll.user32.MessageBoxW(0,
- "You have been using computer for %d minutes. Do you want to rest right now?" % limit,
- "Health Warning", 4)
- if result == 6:
- check = 1
- elif result == 7:
- check = 2
- elif check != 0:
- ctypes.windll.user32.MessageBoxW(0, "Your computer will lock itself in 1 minute.", "Time Warning", 0)
- def readData():
- global actualminute
- global hour_cpu
- global hour_memory
- global hour_disk
- global hour_key
- global hour_mouseclick
- global hour_mousetravel
- global hour_mousescroll
- global hour_rating
- global hour_count
- global relax_count
- global work_count
- global hard_count
- global timecheckbefore
- global workingdate
- global id
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- try:
- with connection.cursor() as cursor:
- sql = "SELECT `date`, `starttime`, `totaltime`, `avrkey_p`, `avrmouse_clk`, `avrmouse_trav`, " \
- "`avrmouse_scr`, `avrcpu`, `avrmem`, `avrdisk`, `avrrating`, `relaxcount` , `workcount` , " \
- "`hardcount` FROM avrdatahour WHERE `id` = %s "
- try:
- cursor.execute(sql, (id,))
- result = cursor.fetchall()
- for row in result:
- workingdate = row[0]
- timecheckbefore = row[1]
- actualminute = int(row[2])
- hour_key = int(row[3]) * actualminute
- hour_mouseclick = int(row[4]) * actualminute
- hour_mousetravel = int(row[5]) * actualminute
- hour_mousescroll = int(row[6]) * actualminute
- hour_cpu = int(row[7]) * actualminute
- hour_memory = int(row[8]) * actualminute
- hour_disk = int(row[9]) * actualminute
- hour_rating = int(row[10]) * actualminute
- relax_count = int(row[11])
- work_count = int(row[12])
- hard_count = int(row[13])
- hour_count += 1
- print("Current total time is %d" % actualminute)
- print("Current hour is %d" % hour_count)
- timecheckbefore = (datetime.datetime.min + timecheckbefore).time()
- timecheckbefore = datetime.datetime.combine(workingdate, timecheckbefore)
- except:
- traceback.print_exc()
- connection.rollback()
- print("No data yet!")
- connection.commit()
- finally:
- connection.close()
- def addData(timecheckbefore, timecheckafter, average_key, average_mouseclick, average_mousetravel,
- average_mousescroll, average_cpu, average_memory, average_disk, average_rating, relax_count,
- work_count,
- hard_count):
- global id
- global hour_count
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- if hour_count == 0:
- hour_count = 1
- number = ((id * 24) - 24) + hour_count
- datetoday = timecheckbefore.strftime("%Y-%m-%d")
- timebefore = timecheckbefore.strftime("%H:%M:%S")
- timenow = timecheckafter.strftime("%H:%M:%S")
- try:
- with connection.cursor() as cursor:
- sql = "INSERT INTO avrdatahour (`No`, `ID`, `date`, `starttime`, `endtime`, `totaltime`, `avrkey_p`, `avrmouse_clk`, `avrmouse_trav`, `avrmouse_scr`, `avrcpu`, `avrmem`, `avrdisk`, `avrrating`, `relaxcount`, `workcount`, `hardcount`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
- try:
- cursor.execute(sql, (
- number, id, datetoday, timebefore, timenow, 1, average_key, average_mouseclick,
- average_mousetravel,
- average_mousescroll, average_cpu, average_memory, average_disk, average_rating, relax_count,
- work_count, hard_count))
- print("Task added successfully")
- except:
- traceback.print_exc()
- connection.rollback()
- print("Oops! Something wrong with adding data")
- connection.commit()
- except:
- traceback.print_exc()
- connection.rollback()
- finally:
- connection.close()
- def updateData(timecheckafter, average_key, average_mouseclick, average_mousetravel, average_mousescroll,
- average_cpu, average_memory, average_disk, average_rating, relax_count, work_count, hard_count,
- actualminute):
- global id
- global hour_count
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- number = ((id * 24) - 24) + hour_count
- timenow = timecheckafter.strftime("%H:%M:%S")
- try:
- with connection.cursor() as cursor:
- sql = "UPDATE avrdatahour SET `endtime`= %s, `totaltime`= %s, `avrkey_p`= %s, `avrmouse_clk`= %s, `avrmouse_trav`= %s, `avrmouse_scr`= %s, `avrcpu`= %s, `avrmem`= %s, `avrdisk`= %s, `avrrating`= %s, `relaxcount`= %s, `workcount`= %s, `hardcount`= %s WHERE `No` = %s"
- try:
- cursor.execute(sql, (
- timenow, actualminute, average_key, average_mouseclick, average_mousetravel,
- average_mousescroll,
- average_cpu, average_memory, average_disk, average_rating, relax_count, work_count,
- hard_count,
- number))
- print("Updated successfully")
- except:
- traceback.print_exc()
- connection.rollback()
- print("Oops! Something wrong with updating data")
- connection.commit()
- finally:
- connection.close()
- def replaceData(numread, numreplace):
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- try:
- with connection.cursor() as cursor:
- sql = "SELECT `starttime`, `endtime`, `totaltime`, `avrkey_p`, `avrmouse_clk`, `avrmouse_trav`, `avrmouse_scr`, `avrcpu`, `avrmem`, `avrdisk`, `avrrating`, `relaxcount` , `workcount` , `hardcount` FROM avrdatahour WHERE `No` = %s"
- sqlr = "UPDATE avrdatahour SET `starttime`= %s, `endtime`= %s, `totaltime`= %s, `avrkey_p`= %s, `avrmouse_clk`= %s, `avrmouse_trav`= %s, `avrmouse_scr`= %s, `avrcpu`= %s, `avrmem`= %s, `avrdisk`= %s, `avrrating`= %s, `relaxcount`= %s, `workcount`= %s, `hardcount`= %s WHERE `No` = %s"
- try:
- cursor.execute(sql, (numread,))
- result = cursor.fetchall()
- for row in result:
- restime = row[0]
- reetime = row[1]
- reminute = int(row[2])
- rekey = int(row[3])
- remouseclick = int(row[4])
- remousetravel = int(row[5])
- remousescroll = int(row[6])
- recpu = int(row[7])
- rememory = int(row[8])
- redisk = int(row[9])
- rerating = int(row[10])
- rerelaxcount = int(row[11])
- reworkcount = int(row[12])
- rehardcount = int(row[13])
- cursor.execute(sqlr, (
- restime, reetime, reminute, rekey, remouseclick, remousetravel, remousescroll, recpu,
- rememory,
- redisk, rerating, rerelaxcount, reworkcount, rehardcount, numreplace))
- print("Replaced successfully")
- except:
- traceback.print_exc()
- connection.rollback()
- print("replace error!")
- connection.commit()
- finally:
- connection.close()
- def deleteData(numdelete):
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- try:
- with connection.cursor() as cursor:
- sql = "DELETE FROM avrdatahour WHERE No = %s"
- try:
- cursor.execute(sql, (numdelete))
- print("Successfully Deleted...")
- except:
- traceback.print_exc()
- connection.rollback()
- print("Oops! Something wrong with updating data")
- connection.commit()
- finally:
- connection.close()
- def truncateData():
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- try:
- with connection.cursor() as cursor:
- sql = "TRUNCATE TABLE avrdatahour"
- try:
- cursor.execute(sql, ())
- print("Successfully Deleted...")
- except:
- traceback.print_exc()
- connection.rollback()
- print("Oops! Something wrong with truncating data")
- connection.commit()
- finally:
- connection.close()
- def averageallData():
- global id
- timedaybefore = 0
- timedayafter = 0
- actualminute = 0
- day_key = 0
- day_mouseclick = 0
- day_mousetravel = 0
- day_mousescroll = 0
- day_cpu = 0
- day_memory = 0
- day_disk = 0
- day_rating = 0
- day_relax_count = 0
- day_work_count = 0
- day_hard_count = 0
- hour_count = 0
- connection = pymysql.connect(
- host='localhost',
- user='root',
- password='',
- db=database,
- use_unicode=True,
- charset='utf8')
- try:
- with connection.cursor() as cursor:
- sql = "SELECT `date`, `starttime`, `endtime`, `totaltime`, `avrkey_p`, `avrmouse_clk`, `avrmouse_trav`, " \
- "`avrmouse_scr`, `avrcpu`, `avrmem`, `avrdisk`, `avrrating`, `relaxcount` , `workcount` , " \
- "`hardcount` FROM avrdatahour WHERE `id` = %s "
- sqlday = "INSERT INTO avrdataday (`ID`, `date`, `logintime`, `logouttime`, `avrkey_p`, `avrmouse_clk`, `avrmouse_trav`, `avrmouse_scr`, `avrcpu`, `avrmem`, `avrdisk`, `avrrating`, `relaxcount`, `workcount`, `hardcount`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
- try:
- cursor.execute(sql, (id,))
- result = cursor.fetchall()
- for row in result:
- yesterday = row[0]
- if hour_count == 0:
- timedaybefore = row[1]
- timedayafter = row[2]
- actualminute += int(row[3])
- day_key += int(row[4])
- day_mouseclick += int(row[5])
- day_mousetravel += int(row[6])
- day_mousescroll += int(row[7])
- day_cpu += int(row[8])
- day_memory += int(row[9])
- day_disk += int(row[10])
- day_rating += int(row[11])
- day_relax_count += int(row[12])
- day_work_count += int(row[13])
- day_hard_count += int(row[14])
- hour_count += 1
- actualminute = actualminute / hour_count
- day_key = day_key / hour_count
- day_mouseclick = day_mouseclick / hour_count
- day_mousetravel = day_mousetravel / hour_count
- day_mousescroll = day_mousescroll / hour_count
- day_cpu = day_cpu / hour_count
- day_memory = day_memory / hour_count
- day_disk = day_disk / hour_count
- day_rating = day_rating / hour_count
- cursor.execute(sqlday, (
- id, yesterday, timedaybefore, timedayafter, day_key, day_mouseclick, day_mousetravel,
- day_mousescroll, day_cpu, day_memory, day_disk, day_rating, day_relax_count, day_work_count,
- day_hard_count))
- print("Updated day data successfully")
- except:
- traceback.print_exc()
- connection.rollback()
- print("No data calculate the average!")
- connection.commit()
- finally:
- connection.close()
- def TimeTrack(count):
- global total_cpu
- global total_memory
- global total_disk
- global keypress
- global mouseclick
- global mousetravel
- global mousescroll
- global rating
- global start
- global oldx, oldy
- global relax_count
- global work_count
- global hard_count
- global lowerthreshold
- global higherthreshold
- global relax_streak
- global timecheckbefore
- global last_minute
- global workingdate
- global checkstatuslastround
- if timecheckbefore == 0:
- timecheckbefore = datetime.datetime.now()
- print("Time check updated")
- last_minute = datetime.datetime.now()
- while True:
- ''' Resource tracker '''
- cpu_percent = psutil.cpu_percent(interval=0.1)
- memory_percent = psutil.virtual_memory()[2]
- disk_percent = psutil.disk_usage('/')[3]
- total_cpu += cpu_percent
- total_memory += memory_percent
- total_disk += disk_percent
- ''' Mouse tracker '''
- x, y = win32api.GetCursorPos()
- if x - oldx != 0:
- diffx = x - oldx
- oldx = x
- else:
- diffx = 0
- if y - oldy != 0:
- diffy = y - oldy
- oldy = y
- else:
- diffy = 0
- dis = math.pow(diffx, 2) + math.pow(diffy, 2)
- mousetravel += math.sqrt(dis) * 0.1
- if time.time() > start + (60 * count): break
- rating += keypress * 100
- rating += mouseclick * 50
- rating += mousescroll * 10
- mousetravel = round(mousetravel)
- rating += mousetravel
- average_cpu = total_cpu / 600
- average_memory = total_memory / 600
- average_disk = total_disk / 600
- average_cpu = round(average_cpu)
- average_memory = round(average_memory)
- average_disk = round(average_disk)
- rating += average_cpu + average_memory + average_disk
- if rating < lowerthreshold:
- wstate = 'Relax'
- relax_count += 1
- relax_streak += 1
- checkstatuslastround = 0
- elif rating < higherthreshold:
- wstate = 'Working'
- work_count += 1
- relax_streak = 0
- checkstatuslastround = 1
- else:
- wstate = 'Hard Working'
- hard_count += 1
- relax_streak = 0
- checkstatuslastround = 2
- rating = round(rating)
- fp = open("log.txt", "a+")
- fp.write(repr(timecheckbefore) + "\n")
- fp.write("Keyboard Press = " + repr(keypress) + "\n")
- fp.write("Mouse Click = " + repr(mouseclick) + "\n")
- fp.write("Mouse Travel = " + repr(mousetravel) + "\n")
- fp.write("Mouse Scroll = " + repr(mousescroll) + "\n")
- fp.write("Average CPU Usage = " + repr(average_cpu) + "\n")
- fp.write("Average Memory Usage = " + repr(average_memory) + "\n")
- fp.write("Average Disk Usage = " + repr(average_disk) + "\n")
- fp.write("Rating = " + repr(rating) + "\n")
- fp.write("State = " + repr(wstate) + "\n" + "\n")
- fp.close()
- # put in database
- def average(minute): # hourly
- global id
- global actualminute
- global total_cpu
- global total_memory
- global total_disk
- global keypress
- global mouseclick
- global mousetravel
- global mousescroll
- global rating
- global relax_count
- global work_count
- global hard_count
- global hour_cpu
- global hour_memory
- global hour_disk
- global hour_key
- global hour_mouseclick
- global hour_mousetravel
- global hour_mousescroll
- global hour_rating
- global hour_count
- global timecheckbefore
- global workingdate
- global last_minute
- global currentround
- global checkstatuslastround
- letskip = 0
- timecheckafter = datetime.datetime.now()
- if actualminute == 0:
- actualminute = 1
- currentround += 1
- count = actualminute + currentround
- tdelta = timecheckafter - timecheckbefore
- tdeltaday = timecheckafter.day - timecheckbefore.day
- print(tdelta.seconds)
- if count > 60 or tdeltaday > 0 or tdelta.seconds > 3600: # when passed one hour or a day, set this round as the first round of the next hour --> letskip = 1
- hour_cpu = 0
- hour_memory = 0
- hour_disk = 0
- hour_key = 0
- hour_mouseclick = 0
- hour_mousetravel = 0
- hour_mousescroll = 0
- hour_rating = 0
- count = 1
- letskip = 1
- if tdeltaday > 0:
- print("we made it next day!")
- averageallData()
- truncateData()
- # average data
- hour_cpu = hour_cpu + (total_cpu / 600)
- hour_memory = hour_memory + (total_memory / 600)
- hour_disk = hour_memory + (total_disk / 600)
- hour_key = hour_key + keypress
- hour_mouseclick = hour_mouseclick + mouseclick
- hour_mousetravel = hour_mousetravel + mousetravel
- hour_mousescroll = hour_mousescroll + mousescroll
- hour_rating = hour_rating + rating
- average_cpu = round(hour_cpu / count)
- average_memory = round(hour_memory / count)
- average_disk = round(hour_disk / count)
- average_key = round(hour_key / count)
- average_mouseclick = round(hour_mouseclick / count)
- average_mousetravel = round(hour_mousetravel / count)
- average_mousescroll = round(hour_mousescroll / count)
- average_rating = round(hour_rating / count)
- wstate = 'Relax'
- if work_count > relax_count:
- wstate = 'Working'
- if hard_count > work_count:
- wstate = 'Hard Working'
- elif work_count == hard_count:
- wstate = 'Balanced(Working,Hard Working)'
- elif hard_count > relax_count:
- wstate = 'Hard Working'
- if work_count > hard_count:
- wstate = 'Working'
- elif work_count == hard_count:
- wstate = 'Balanced(Working,Hard Working)'
- elif work_count == relax_count:
- wstate = 'Balanced(Relax,Working)'
- if hard_count > relax_count:
- wstate = 'Hard Working'
- elif work_count == hard_count:
- wstate = 'Balanced(All)'
- elif hard_count == relax_count:
- wstate = 'Balanced(Relax,Hard Working)'
- if work_count > relax_count:
- wstate = 'Working'
- elif work_count == hard_count:
- wstate = 'Balanced(All)'
- # first minute without any data
- if hour_count == 0:
- currentround = 0
- addData(timecheckbefore, timecheckafter, average_key, average_mouseclick, average_mousetravel,
- average_mousescroll, average_cpu, average_memory, average_disk, average_rating, relax_count,
- work_count, hard_count)
- elif letskip == 1: # add new line in database
- # next hour
- if tdeltaday > 0:
- hour_count = 0
- timecheckbefore = datetime.datetime.now()
- hour_cpu = 0
- hour_memory = 0
- hour_disk = 0
- hour_key = 0
- hour_mouseclick = 0
- hour_mousetravel = 0
- hour_mousescroll = 0
- hour_rating = 0
- actualminute = 0
- currentround = 0
- relax_count = 0
- work_count = 0
- hard_count = 0
- if checkstatuslastround == 0:
- relax_count += 1
- print("I have added relax count by one from compensation!")
- elif checkstatuslastround == 1:
- work_count += 1
- print("I have added work count by one from compensation!")
- elif checkstatuslastround == 2:
- hard_count += 1
- print("I have added hard count by one from compensation!")
- fp = open("log.txt", "a+")
- fp.write("Average to next line" + "\n")
- fp.write("Total time = " + repr(count) + "\n")
- fp.write("Keyboard Press = " + repr(average_key) + "\n")
- fp.write("Mouse Click = " + repr(average_mouseclick) + "\n")
- fp.write("Mouse Travel = " + repr(average_mousetravel) + "\n")
- fp.write("Mouse Scroll = " + repr(average_mousescroll) + "\n")
- fp.write("Average CPU Usage = " + repr(average_cpu) + "\n")
- fp.write("Average Memory Usage = " + repr(average_memory) + "\n")
- fp.write("Average Disk Usage = " + repr(average_disk) + "\n")
- fp.write("Rating = " + repr(average_rating) + "\n" + "\n")
- fp.write("Relax = " + repr(relax_count) + "\n")
- fp.write("Working = " + repr(work_count) + "\n")
- fp.write("Hard-work = " + repr(hard_count) + "\n" + "\n")
- fp.write("Most Used = " + repr(wstate) + "\n" + "\n")
- fp.close()
- if hour_count < 24:
- hour_count += 1
- addData(last_minute, timecheckafter, average_key, average_mouseclick, average_mousetravel,
- average_mousescroll, average_cpu, average_memory, average_disk, average_rating, relax_count,
- work_count, hard_count)
- else:
- num = id * 24
- deleteData(num)
- addData(last_minute, timecheckafter, average_key, average_mouseclick, average_mousetravel,
- average_mousescroll, average_cpu, average_memory, average_disk, average_rating, relax_count,
- work_count, hard_count)
- else:
- updateData(timecheckafter, average_key, average_mouseclick, average_mousetravel, average_mousescroll,
- average_cpu, average_memory, average_disk, average_rating, relax_count, work_count,
- hard_count,
- count)
- # reset per round
- rating = 0
- keypress = 0
- mouseclick = 0
- mousetravel = 0
- mousescroll = 0
- total_cpu = 0
- total_memory = 0
- total_disk = 0
- readData()
- print(limit)
- open('log.txt', 'w').close()
- while check == 0:
- TimeTrack(minute)
- average(minute)
- showwarning(minute)
- minute += 1
- minute = minute - 1
- if check == 1:
- ctypes.windll.user32.LockWorkStation()
- else:
- for i in range(minute, minute + 11):
- TimeTrack(i)
- average(i)
- if i == minute + 9:
- showwarning(i)
- ctypes.windll.user32.LockWorkStation()
- def mouse_key():
- print("Moue_key")
- def OnMouseEvent(event):
- global mouseclick
- global mousescroll
- if (event.Message == 514) or (event.Message == 517) or (event.Message == 520):
- mouseclick += 1
- if (event.Wheel):
- mousescroll += 1
- return True
- def OnKeyboardEvent(event):
- global keypress
- keypress += 1
- return True
- global mouseclick
- global mousescroll
- global keypress
- mousescroll = 0
- mouseclick = 0
- keypress = 0
- # hm = pyHook.HookManager()
- hm = PyHook3.HookManager()
- hm.MouseAll = OnMouseEvent
- hm.HookMouse()
- hm.KeyDown = OnKeyboardEvent
- hm.HookKeyboard()
- pythoncom.PumpMessages()
- hm.UnhookMouse()
- hm.UnHookKeyboard()
- if __name__ == '__main__':
- # create window and application object
- root = Tk()
- # root.title("Login Form")
- UI(root)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement