· 5 years ago · May 25, 2020, 02:20 AM
1#!/usr/bin/env python3
2import webbrowser, socket, sys, os, shutil, json, multiprocessing, cv2, atexit, threading, re, time, imutils, argparse
3from imutils.video import VideoStream
4from os.path import isfile, join
5from functools import partial
6from datetime import datetime
7from natsort import natsorted
8from os import listdir
9from IPy import IP
10from flask import Response, render_template, Flask, g, request
11from PyQt5.QtWidgets import *
12from PyQt5.QtCore import *
13from PyQt5.QtGui import *
14from PyQt5 import *
15import urllib, requests
16import urllib.request
17from urllib.parse import *
18# sudo -H python3 -m pip install --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --trusted-host pypi.org [NAME]
19
20# CAMERA SCRIPT
21import camera1
22import camera2
23
24
25# CONFIGURATION variables
26cascade_files_dir = os.path.dirname(os.path.realpath(__file__)) + '/Data Models'
27cascade_files = [f for f in listdir(cascade_files_dir) if isfile(join(cascade_files_dir, f))]
28isActive = False
29
30settings_file = os.path.dirname(os.path.realpath(__file__)) + '/settings1.json'
31settings_json = []
32
33saved_color = []
34send_email = []
35cap_screen = []
36
37record_video = []
38smiley_face = []
39dark_mode = []
40face_detect = []
41
42email_address = []
43
44is_ip_cam_on = []
45ip_cam_url = []
46ip_cam_usrname = []
47ip_cam_pswd = []
48is_ip_cam_working = True
49
50email_delay = []
51picture_delay = []
52selected_data_index = []
53button_css = ''
54frame = None
55ret = None
56rgbImage = None
57outputFrame = None
58
59# CYCLE variables
60cycles_file = os.path.dirname(os.path.realpath(__file__)) + '/cycles.json'
61cycles_json = []
62
63OnToList = []
64OnFromList = []
65OffToList = []
66OffFromList = []
67alwaysOn = []
68all_textboxes = []
69OnTo_textboxes = []
70OnFrom_textboxes = []
71OffTo_textboxes = []
72OffFrom_textboxes = []
73
74isTimeToSendEmail = False
75running = True
76
77# SERVER variables
78framesPerSecond = 0
79lock = threading.Lock()
80appWeb = Flask(__name__)
81auto_start_server = []
82ip = []
83class MainMenu(QMainWindow):
84 def __init__(self, parent = None):
85 super(MainMenu, self).__init__(parent)
86 mainlay = QWidget(self)
87 mainlay.setContentsMargins(5, 5, 5, 5)
88 lay = QVBoxLayout()
89 top = QHBoxLayout()
90 bottom = QHBoxLayout()
91 self.setWindowTitle('J-Detection - Main Menu')
92 self.setWindowIcon(self.style().standardIcon(getattr(QStyle, 'SP_MessageBoxInformation')))
93 self.cameraScreen1 = QLabel(self)
94 self.cameraScreen1.setStyleSheet('border-radius: 3px; border-style: none; border: 1px solid black; background-color: rgb(10,10,10);')
95 self.cameraScreen1.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
96 self.cameraScreen1.setAlignment(Qt.AlignCenter)
97 top.addWidget(self.cameraScreen1)
98 self.cameraScreen2 = QLabel(self)
99 self.cameraScreen2.setStyleSheet('border-radius: 3px; border-style: none; border: 1px solid black; background-color: rgb(10,10,10);')
100 self.cameraScreen2.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
101 self.cameraScreen2.setAlignment(Qt.AlignCenter)
102 top.addWidget(self.cameraScreen2)
103 self.grid = QGridLayout()
104 self.grid.setRowStretch(0, 1)
105 self.grid.addWidget(self.ComboBox(), 1, 0)
106 bottom.addLayout(self.grid)
107 lay.addLayout(top)
108 lay.addLayout(bottom)
109 mainlay.setLayout(lay)
110 self.setCentralWidget(mainlay)
111 self.menu()
112 th1 = Thread1(self)
113 th1.changePixmap.connect(self.setImageCam1)
114 camera1.start_cam()
115 th1.start()
116
117 th2 = Thread2(self)
118 th2.changePixmap.connect(self.setImageCam2)
119 camera2.start_cam()
120 th2.start()
121 def open_cycle_menu(self):
122 self.c = CycleMenu()
123 self.c.show()
124 def open_add_usr_pass_menu(self):
125 self.m = IpCamLogin()
126 self.m.show()
127 def closeEvent(self, event):
128 exit_handler()
129 @pyqtSlot(QImage)
130 def setImageCam1(self, image):
131 self.setWindowTitle("J-Detection - Main Menu - {0:.2f} FPS".format(round(framesPerSecond,2)))
132 self.cameraScreen1.setPixmap(QPixmap.fromImage(image))
133 @pyqtSlot(QImage)
134 def setImageCam2(self, image):
135 self.setWindowTitle("J-Detection - Main Menu - {0:.2f} FPS".format(round(framesPerSecond,2)))
136 self.cameraScreen2.setPixmap(QPixmap.fromImage(image))
137 def menu(self):
138 global saved_color, send_email, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, selected_data_index, face_detect, email_address
139 self.menubar = self.menuBar()
140 self.statusbar = self.statusBar()
141 serverMenu = QMenu('Server', self)
142 self.autoStartServer = QAction('Auto start.', self, checkable=True)
143 self.autoStartServer.setStatusTip('Start the server when program is executed. (Program restart is required!)')
144 self.autoStartServer.setChecked(True if auto_start_server[0] == 'True' else False)
145 self.autoStartServer.triggered.connect(self.auto_start)
146 serverMenu.addAction(self.autoStartServer)
147 if auto_start_server[0] == 'True':
148 viewServer = QAction('Visit', self)
149 viewServer.setStatusTip(f"Opens a new tab on your default browser to where the server is hosted. http://{ip[0]}:5000")
150 viewServer.triggered.connect(self.visitServer)
151 serverMenu.addAction(viewServer)
152 self.setIP = QAction(f'Change host IP address', self)
153 self.setIP.setStatusTip(f'The server will connect to the current IP address - {ip[0]}')
154 self.setIP.triggered.connect(partial(self.change_ip_address, ''))
155 serverMenu.addAction(self.setIP)
156
157 viewMenu = QMenu('View', self)
158 themesMenu = QMenu('Themes', self)
159
160 self.systemmode = QAction('System default', self, checkable = True)
161 self.systemmode.setStatusTip('enable/disable System mode')
162 self.systemmode.setChecked(True if dark_mode[0] == '0' else False)
163 self.systemmode.triggered.connect(partial(self.checkboxClicked, self.systemmode, 'System mode'))
164
165 self.darkmode = QAction('Dark mode', self, checkable = True)
166 self.darkmode.setStatusTip('enable/disable Dark mode')
167 self.darkmode.setChecked(True if dark_mode[0] == '1' else False)
168 self.darkmode.triggered.connect(partial(self.checkboxClicked, self.darkmode, 'Dark mode'))
169
170 self.lightmode = QAction('Light mode', self, checkable = True)
171 self.lightmode.setStatusTip('enable/disable Light mode')
172 self.lightmode.setChecked(True if dark_mode[0] == '2' else False)
173 self.lightmode.triggered.connect(partial(self.checkboxClicked, self.lightmode, 'Light mode'))
174
175 themesMenu.addAction(self.systemmode)
176 themesMenu.addAction(self.darkmode)
177 themesMenu.addAction(self.lightmode)
178 viewMenu.addMenu(themesMenu)
179
180 self.settingsMenu = QMenu('Configuration', self)
181 self.email = QAction(self)
182
183 self.removeEmail = QAction('Remove Email Address', self)
184 self.removeEmail.triggered.connect(self.removeEmailAddress)
185 self.removeEmail.setStatusTip(f'Remove an email address from {email_address[0]}.')
186
187 if email_address[0] == '':
188 self.email.setText('Set Email')
189 self.email.triggered.connect(partial(self.verifyEmailAddress, '@gmail.com', True))
190 self.email.setStatusTip('Your email address is currently set too: None')
191 else:
192 self.email.setText('Add Email')
193 self.email.triggered.connect(partial(self.verifyEmailAddress, '@gmail.com', True))
194 self.email.setStatusTip(f'Your email address is currently set too: {email_address[0]}')
195
196 self.emailDelay = QAction(f'Set Email send delay - {email_delay[0]}')
197 self.emailDelay.triggered.connect(partial(self.verifyEmailDelay))
198 if email_delay[0] == '': self.emailDelay.setStatusTip('Your email send delay is currently set too: None')
199 else: self.emailDelay.setStatusTip(f'Your email send delay is currently set too: {email_delay[0]}')
200
201 self.colorMenu = QAction('Color')
202 self.colorMenu.triggered.connect(partial(self.Open_Color_Dialog))
203 self.colorMenu.setStatusTip('Change the color of the bounding boxes in program.')
204
205 self.cycleMenu = QAction('Cycle Menu')
206 self.cycleMenu.triggered.connect(partial(self.open_cycle_menu))
207 self.cycleMenu.setStatusTip('Custimze when the program is active.')
208
209 recordvideo = QAction('Record Video', self, checkable=True)
210 recordvideo.setChecked(True if record_video[0] == 'True' else False)
211 recordvideo.triggered.connect(partial(self.checkboxClicked, recordvideo, 'Record Video'))
212 recordvideo.setStatusTip('Record footage of the webcam.')
213
214 captureScreen = QAction('Capture Screen', self, checkable=True)
215 captureScreen.setChecked(True if cap_screen[0] == 'True' else False)
216 captureScreen.triggered.connect(partial(self.checkboxClicked, captureScreen, 'Capture Screen'))
217 captureScreen.setStatusTip('Take screenshot of main moniter instead of the webcam.')
218
219 self.sendEmails = QAction('Send Emails', self, checkable=True)
220 self.sendEmails.setChecked(True if send_email[0] == 'True' else False)
221 self.sendEmails.triggered.connect(partial(self.checkboxClicked, self.sendEmails, 'Send Emails'))
222 self.sendEmails.setStatusTip('Send emails when Motion/Face detected.')
223
224 self.IpCam = QAction('IP Camera', self, checkable=True)
225 self.IpCam.setChecked(True if is_ip_cam_on[0] == 'True' else False)
226 self.IpCam.triggered.connect(partial(self.checkboxClicked, self.IpCam, 'IP Cam'))
227 self.IpCam.setStatusTip('Connects to a camera with an IP Address')
228
229 self.ChangeIpCam = QAction('Change IP Login', self)
230 self.ChangeIpCam.triggered.connect(self.open_add_usr_pass_menu)
231 self.ChangeIpCam.setStatusTip('Change Logins to IP Camera')
232
233 smileyFace = QAction('Smiley Face Addon', self, checkable=True)
234 smileyFace.setChecked(True if smiley_face[0] == 'True' else False)
235 smileyFace.triggered.connect(partial(self.checkboxClicked, smileyFace, 'Smiley Face Addon'))
236 smileyFace.setStatusTip('Make smiley face when *Face detected.')
237
238 self.faceDetection = QAction(f'{self.cascadeList.currentText()} Detection', self, checkable=True)
239 self.faceDetection.setChecked(True if face_detect[0] == 'True' else False)
240 self.faceDetection.triggered.connect(partial(self.checkboxClicked, self.faceDetection, 'Face Detection'))
241 self.faceDetection.setStatusTip(f'Enable: {self.cascadeList.currentText()} detection. Disable: Motion detection.')
242
243 self.motionDetection = QAction('Motion Detection', self, checkable=True)
244 self.motionDetection.setChecked(True if face_detect[0] == 'False' else False)
245 self.motionDetection.triggered.connect(partial(self.checkboxClicked, self.motionDetection, 'Motion Detection'))
246 self.motionDetection.setStatusTip(f'Enable: Motion detection. Disable: {self.cascadeList.currentText()} detection.')
247
248 detectionMenu = QMenu('Detection', self)
249 detectionMenu.addAction(self.faceDetection)
250 detectionMenu.addAction(self.motionDetection)
251
252 self.settingsMenu.addAction(self.cycleMenu)
253 self.settingsMenu.addSeparator()
254 self.settingsMenu.addAction(self.colorMenu)
255 # self.settingsMenu.addAction(recordvideo)
256 self.settingsMenu.addAction(captureScreen)
257 self.settingsMenu.addSeparator()
258 self.settingsMenu.addAction(self.IpCam)
259 self.settingsMenu.addAction(self.ChangeIpCam)
260 self.settingsMenu.addSeparator()
261 self.settingsMenu.addAction(smileyFace)
262 self.settingsMenu.addSeparator()
263 self.settingsMenu.addMenu(detectionMenu)
264 self.settingsMenu.addSeparator()
265 self.settingsMenu.addAction(self.sendEmails)
266 self.settingsMenu.addAction(self.emailDelay)
267 self.settingsMenu.addAction(self.email)
268 if not email_address[0] == '': self.settingsMenu.addAction(self.removeEmail)
269 self.menubar.addMenu(viewMenu)
270 self.menubar.addMenu(self.settingsMenu)
271 self.menubar.addMenu(serverMenu)
272 def resizeEvent(self, event):
273 super(MainMenu, self).resizeEvent(event)
274 self.menubar.resize(self.width(), self.menubar.height())
275 def change_ip_address(self, t):
276 global saved_color, auto_start_server, ip, send_email, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, button_css, selected_data_index, face_detect, email_address, ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
277 if t == '': inputIP, done1 = QInputDialog.getText(self, 'Change IP', 'IP Address:', echo=QLineEdit.Normal, text=str(ip[0]))
278 else: inputIP, done1 = QInputDialog.getText(self, 'Change IP', 'IP Address:', echo=QLineEdit.Normal, text=t)
279 if done1:
280 try:
281 if IP(inputIP):
282 settings_json.pop(0)
283 settings_json.append({
284 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
285 "capture screen": [cap_screen[0]],
286 "record video": [record_video[0]],
287 "smiley face": [smiley_face[0]],
288 "dark mode": [dark_mode[0]],
289 "send email": [send_email[0]],
290 "email delay": [email_delay[0]],
291 "picture delay": [picture_delay[0]],
292 "selected data index": [int(self.cascadeList.currentIndex())],
293 "face detect":[face_detect[0]],
294 "email address": [email_address[0]],
295 "server auto start": [auto_start_server[0]],
296 "host address": [inputIP],
297 "IP Camera URL": [ip_cam_url[0]],
298 "IP Camera Username": [ip_cam_usrname[0]],
299 "IP Camera Password": [ip_cam_pswd[0]],
300 "is IP Camera on": [is_ip_cam_on[0]]
301 })
302 with open(settings_file, mode='w+', encoding='utf-8') as file:
303 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
304 with open(settings_file) as file:
305 saved_color.clear()
306 send_email.clear()
307 cap_screen.clear()
308 record_video.clear()
309 smiley_face.clear()
310 dark_mode.clear()
311 email_delay.clear()
312 picture_delay.clear()
313 face_detect.clear()
314 email_address.clear()
315 auto_start_server.clear()
316 ip_cam_url.clear()
317 ip_cam_usrname.clear()
318 ip_cam_pswd.clear()
319 is_ip_cam_on.clear()
320 ip.clear()
321 settings_json = json.load(file)
322 for info in settings_json:
323 for ind in info['selected data index']: selected_data_index.append(ind)
324 for dark in info['dark mode']: dark_mode.append(dark)
325 for face in info['face detect']: face_detect.append(face)
326 for color in info['saved color']: saved_color.append(color)
327 for video in info['record video']: record_video.append(video)
328 for smile in info['smiley face']: smiley_face.append(smile)
329 for email in info['email address']: email_address.append(email)
330 for screen in info['capture screen']: cap_screen.append(screen)
331 for email_b in info['send email']: send_email.append(email_b)
332 for email_d in info['email delay']: email_delay.append(email_d)
333 for picture in info['picture delay']: picture_delay.append(picture)
334 for autostart in info['server auto start']: auto_start_server.append(autostart)
335 for ipaddress in info['host address']: ip.append(ipaddress)
336 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
337 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
338 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
339 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
340
341 self.setIP.setStatusTip(f'The server will connect to the current IP address - {ip[0]}')
342 return
343 else: return
344 except ValueError:
345 button = QMessageBox.critical(self, "Attention", f"The IP address: \"{inputIP}\" is not a valid IP address.\n\nWould you like to try again?", QMessageBox.Yes | QMessageBox.Cancel, QMessageBox.Yes)
346 if button == QMessageBox.Yes: self.change_ip_address(inputIP)
347 else: return
348 else: return
349 def verifyEmailAddress(self, s, add):
350 global saved_color, auto_start_server, ip, send_email, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, button_css, selected_data_index, face_detect, email_address, ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
351 rx = re.compile(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]*$")
352 email, done1 = QInputDialog.getText(self, 'Add Email', 'Email Address:', echo=QLineEdit.Normal, text=s)
353 if done1:
354 t = email
355 if rx.match(email):
356 if add:
357 temp = email_address
358 temp.append(email)
359 temp = ", ".join(email_address)
360 if temp[0] == ",":
361 temp = temp[2:]
362 email = temp
363 settings_json.pop(0)
364 settings_json.append({
365 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
366 "capture screen": [cap_screen[0]],
367 "record video": [record_video[0]],
368 "smiley face": [smiley_face[0]],
369 "dark mode": [dark_mode[0]],
370 "send email": ['True'],
371 "email delay": [email_delay[0]],
372 "picture delay": [picture_delay[0]],
373 "selected data index": [int(self.cascadeList.currentIndex())],
374 "face detect":[face_detect[0]],
375 "email address": [email],
376 "server auto start": [auto_start_server[0]],
377 "host address": [ip[0]],
378 "IP Camera URL": [ip_cam_url[0]],
379 "IP Camera Username": [ip_cam_usrname[0]],
380 "IP Camera Password": [ip_cam_pswd[0]],
381 "is IP Camera on": [is_ip_cam_on[0]]
382 })
383
384 with open(settings_file, mode='w+', encoding='utf-8') as file:
385 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
386 with open(settings_file) as file:
387 saved_color.clear()
388 send_email.clear()
389 cap_screen.clear()
390 record_video.clear()
391 smiley_face.clear()
392 dark_mode.clear()
393 email_delay.clear()
394 picture_delay.clear()
395 face_detect.clear()
396 email_address.clear()
397 auto_start_server.clear()
398 ip_cam_url.clear()
399 ip_cam_usrname.clear()
400 ip_cam_pswd.clear()
401 is_ip_cam_on.clear()
402 ip.clear()
403 settings_json = json.load(file)
404 for info in settings_json:
405 for ind in info['selected data index']: selected_data_index.append(ind)
406 for dark in info['dark mode']: dark_mode.append(dark)
407 for face in info['face detect']: face_detect.append(face)
408 for color in info['saved color']: saved_color.append(color)
409 for video in info['record video']: record_video.append(video)
410 for smile in info['smiley face']: smiley_face.append(smile)
411 for email in info['email address']: email_address.append(email)
412 for screen in info['capture screen']: cap_screen.append(screen)
413 for email_b in info['send email']: send_email.append(email_b)
414 for email_d in info['email delay']: email_delay.append(email_d)
415 for picture in info['picture delay']: picture_delay.append(picture)
416 for autostart in info['server auto start']: auto_start_server.append(autostart)
417 for ipaddress in info['host address']: ip.append(ipaddress)
418 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
419 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
420 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
421 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
422 self.email.setText(f'Add Email')
423 self.email.setStatusTip(f'Your email address\'s is currently set too: {email_address[0]}')
424 self.removeEmail.setStatusTip(f'Remove an email address from {email_address[0]}.')
425 self.settingsMenu.addAction(self.removeEmail)
426 self.sendEmails.setChecked(True if send_email[0] == 'True' else False)
427 else:
428 button = QMessageBox.critical(self, "Wrong Email address.", f"\"{email}\" is an Invalid email address, please try again.", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
429 if button == QMessageBox.Yes:
430 self.verifyEmailAddress(t, add)
431 else:
432 return
433 def removeEmailAddress(self):
434 global saved_color, auto_start_server, ip, send_email, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, button_css, selected_data_index, face_detect, email_address, ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
435 email_typed = ''
436 email_typed, done1 = QInputDialog.getText(self, 'Remove Email', f'Which email would you like to remve?\n\n{email_address[0]}', echo=QLineEdit.Normal, text='')
437 found = False
438 if done1:
439 temp = email_address[0].split(', ')
440 for i, j in enumerate(temp):
441 if email_typed == j and not found:
442 temp.pop(i)
443 found = True
444 continue
445 if found: continue
446 if not found:
447 button = QMessageBox.critical(self, "Email address not found.", f"\"{email_typed}\" is an Invalid email address, please try again.", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
448 if button == QMessageBox.Yes: self.removeEmailAddress()
449 else: return
450 if found:
451 temp = ", ".join(temp)
452 if any((c in temp) for c in temp) and temp[0] == ",": temp = temp[2:]
453 email = temp
454 settings_json.pop(0)
455 settings_json.append({
456 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
457 "capture screen": [cap_screen[0]],
458 "record video": [record_video[0]],
459 "smiley face": [smiley_face[0]],
460 "dark mode": [dark_mode[0]],
461 "send email": [send_email[0]],
462 "email delay": [email_delay[0]],
463 "picture delay": [picture_delay[0]],
464 "selected data index": [int(self.cascadeList.currentIndex())],
465 "face detect":[face_detect[0]],
466 "email address": [email],
467 "server auto start": [auto_start_server[0]],
468 "host address": [ip[0]],
469 "IP Camera URL": [ip_cam_url[0]],
470 "IP Camera Username": [ip_cam_usrname[0]],
471 "IP Camera Password": [ip_cam_pswd[0]],
472 "is IP Camera on": [is_ip_cam_on[0]]
473 })
474 with open(settings_file, mode='w+', encoding='utf-8') as file:
475 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
476 with open(settings_file) as file:
477 saved_color.clear()
478 send_email.clear()
479 cap_screen.clear()
480 record_video.clear()
481 smiley_face.clear()
482 dark_mode.clear()
483 email_delay.clear()
484 picture_delay.clear()
485 face_detect.clear()
486 email_address.clear()
487 auto_start_server.clear()
488 ip_cam_url.clear()
489 ip_cam_usrname.clear()
490 ip_cam_pswd.clear()
491 is_ip_cam_on.clear()
492 ip.clear()
493 settings_json = json.load(file)
494 for info in settings_json:
495 for ind in info['selected data index']: selected_data_index.append(ind)
496 for dark in info['dark mode']: dark_mode.append(dark)
497 for face in info['face detect']: face_detect.append(face)
498 for color in info['saved color']: saved_color.append(color)
499 for video in info['record video']: record_video.append(video)
500 for smile in info['smiley face']: smiley_face.append(smile)
501 for email in info['email address']: email_address.append(email)
502 for screen in info['capture screen']: cap_screen.append(screen)
503 for email_b in info['send email']: send_email.append(email_b)
504 for email_d in info['email delay']: email_delay.append(email_d)
505 for picture in info['picture delay']: picture_delay.append(picture)
506 for autostart in info['server auto start']: auto_start_server.append(autostart)
507 for ipaddress in info['host address']: ip.append(ipaddress)
508 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
509 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
510 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
511 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
512 self.email.setText(f'Add Email')
513 self.email.setStatusTip(f'Your email address is currently set too: {email_address[0]}')
514 self.removeEmail.setStatusTip(f'Remove an email address from {email_address[0]}.')
515 self.settingsMenu.addAction(self.removeEmail)
516 def ComboBox(self):
517 global selected_data_index
518 groupBox = QGroupBox("Recognition type")
519
520 self.cascadeList = QComboBox()
521 for i, j in enumerate(cascade_files):
522 j = j.replace('haarcascade_', '')
523 j = j.replace('.xml', '')
524 j = j.replace('_', ' ')
525 j = list(j)
526 j[0] = j[0].capitalize()
527 j = ''.join(j)
528 self.cascadeList.addItem(j)
529 self.cascadeList.setCurrentIndex(int(selected_data_index[0]))
530 self.cascadeList.setToolTip('A list of diffrent recognition types.')
531 self.cascadeList.currentTextChanged.connect(self.comboBoxChanged)
532 vbox = QVBoxLayout()
533 vbox.addWidget(self.cascadeList)
534 vbox.addStretch(1)
535 groupBox.setLayout(vbox)
536 return groupBox
537 def comboBoxChanged(self):
538 global saved_color, send_email, ip, auto_start_server, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, button_css, selected_data_index, face_detect, email_address, ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
539 self.motionDetection.setStatusTip(f'Enable: Motion detection. Disable: {self.cascadeList.currentText()} detection.')
540 self.faceDetection.setStatusTip(f'Enable: {self.cascadeList.currentText()} detection. Disable: Motion detection.')
541 self.faceDetection.setText(f'{self.cascadeList.currentText()} Detection')
542 settings_json.pop(0)
543 settings_json.append({
544 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
545 "capture screen": [cap_screen[0]],
546 "record video": [record_video[0]],
547 "smiley face": [smiley_face[0]],
548 "dark mode": [dark_mode[0]],
549 "send email": [send_email[0]],
550 "email delay": [email_delay[0]],
551 "picture delay": [picture_delay[0]],
552 "selected data index": [int(self.cascadeList.currentIndex())],
553 "face detect":[face_detect[0]],
554 "email address": [email_address[0]],
555 "server auto start": [auto_start_server[0]],
556 "host address": [ip[0]],
557 "IP Camera URL": [ip_cam_url[0]],
558 "IP Camera Username": [ip_cam_usrname[0]],
559 "IP Camera Password": [ip_cam_pswd[0]],
560 "is IP Camera on": [is_ip_cam_on[0]]
561 })
562 with open(settings_file, mode='w+', encoding='utf-8') as file:
563 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
564 with open(settings_file) as file:
565 saved_color.clear()
566 send_email.clear()
567 cap_screen.clear()
568 record_video.clear()
569 smiley_face.clear()
570 dark_mode.clear()
571 email_delay.clear()
572 picture_delay.clear()
573 selected_data_index.clear()
574 face_detect.clear()
575 email_address.clear()
576 auto_start_server.clear()
577 ip_cam_url.clear()
578 ip_cam_usrname.clear()
579 ip_cam_pswd.clear()
580 is_ip_cam_on.clear()
581 ip.clear()
582 settings_json = json.load(file)
583 for info in settings_json:
584 for ind in info['selected data index']: selected_data_index.append(ind)
585 for dark in info['dark mode']: dark_mode.append(dark)
586 for face in info['face detect']: face_detect.append(face)
587 for color in info['saved color']: saved_color.append(color)
588 for video in info['record video']: record_video.append(video)
589 for smile in info['smiley face']: smiley_face.append(smile)
590 for email in info['email address']: email_address.append(email)
591 for screen in info['capture screen']: cap_screen.append(screen)
592 for email_b in info['send email']: send_email.append(email_b)
593 for email_d in info['email delay']: email_delay.append(email_d)
594 for picture in info['picture delay']: picture_delay.append(picture)
595 for autostart in info['server auto start']: auto_start_server.append(autostart)
596 for ipaddress in info['host address']: ip.append(ipaddress)
597 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
598 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
599 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
600 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
601 def verifyEmailDelay(self):
602 global saved_color, auto_start_server, ip, send_email, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, button_css, selected_data_index, face_detect, email_address, ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
603 delay, done1 = QInputDialog.getDouble(self, "Email Delay (seconds)","Value:", int(email_delay[0]), 10, 999999, 0)
604 if done1:
605 if delay >= 10:
606 settings_json.pop(0)
607 settings_json.append({
608 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
609 "capture screen": [cap_screen[0]],
610 "record video": [record_video[0]],
611 "smiley face": [smiley_face[0]],
612 "dark mode": [dark_mode[0]],
613 "send email": [send_email[0]],
614 "email delay": [delay],
615 "picture delay": [picture_delay[0]],
616 "selected data index": [int(self.cascadeList.currentIndex())],
617 "face detect":[face_detect[0]],
618 "email address": [email_address[0]],
619 "server auto start": [auto_start_server[0]],
620 "host address": [ip[0]],
621 "IP Camera URL": [ip_cam_url[0]],
622 "IP Camera Username": [ip_cam_usrname[0]],
623 "IP Camera Password": [ip_cam_pswd[0]],
624 "is IP Camera on": [is_ip_cam_on[0]]
625 })
626 with open(settings_file, mode='w+', encoding='utf-8') as file:
627 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
628 with open(settings_file) as file:
629 saved_color.clear()
630 send_email.clear()
631 cap_screen.clear()
632 record_video.clear()
633 smiley_face.clear()
634 dark_mode.clear()
635 email_delay.clear()
636 picture_delay.clear()
637 face_detect.clear()
638 email_address.clear()
639 auto_start_server.clear()
640 ip_cam_url.clear()
641 ip_cam_usrname.clear()
642 ip_cam_pswd.clear()
643 is_ip_cam_on.clear()
644 ip.clear()
645 settings_json = json.load(file)
646 for info in settings_json:
647 for ind in info['selected data index']: selected_data_index.append(ind)
648 for dark in info['dark mode']: dark_mode.append(dark)
649 for face in info['face detect']: face_detect.append(face)
650 for color in info['saved color']: saved_color.append(color)
651 for video in info['record video']: record_video.append(video)
652 for smile in info['smiley face']: smiley_face.append(smile)
653 for email in info['email address']: email_address.append(email)
654 for screen in info['capture screen']: cap_screen.append(screen)
655 for email_b in info['send email']: send_email.append(email_b)
656 for email_d in info['email delay']: email_delay.append(email_d)
657 for picture in info['picture delay']: picture_delay.append(picture)
658 for autostart in info['server auto start']: auto_start_server.append(autostart)
659 for ipaddress in info['host address']: ip.append(ipaddress)
660 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
661 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
662 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
663 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
664 # button = QMessageBox.information(self, "Success", f"The email: \"{email}\" has been successfully saved!", QMessageBox.Ok, QMessageBox.Ok)
665 self.emailDelay.setText(f'Set Email send delay - {email_delay[0]}')
666 self.emailDelay.setStatusTip(f'Your email send delay is currently set too: {email_delay[0]}')
667 @pyqtSlot()
668 def Open_Color_Dialog(self):
669 global saved_color, auto_start_server, ip, send_email, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, button_css, selected_data_index, face_detect, email_address, ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
670 color = QColorDialog.getColor()
671 if color.isValid():
672 settings_json.pop(0)
673 settings_json.append({
674 "saved color": [color.red(), color.green(), color.blue()],
675 "capture screen": [cap_screen[0]],
676 "record video": [record_video[0]],
677 "smiley face": [smiley_face[0]],
678 "dark mode": [dark_mode[0]],
679 "send email": [send_email[0]],
680 "email delay": [email_delay[0]],
681 "picture delay": [picture_delay[0]],
682 "selected data index": [selected_data_index[0]],
683 "face detect":[face_detect[0]],
684 "email address": [email_address[0]],
685 "server auto start": [auto_start_server[0]],
686 "host address": [ip[0]],
687 "IP Camera URL": [ip_cam_url[0]],
688 "IP Camera Username": [ip_cam_usrname[0]],
689 "IP Camera Password": [ip_cam_pswd[0]],
690 "is IP Camera on": [is_ip_cam_on[0]]
691 })
692 with open(settings_file, mode='w+', encoding='utf-8') as file:
693 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
694 with open(settings_file) as file:
695 saved_color.clear()
696 send_email.clear()
697 cap_screen.clear()
698 record_video.clear()
699 smiley_face.clear()
700 dark_mode.clear()
701 email_delay.clear()
702 picture_delay.clear()
703 selected_data_index.clear()
704 face_detect.clear()
705 email_address.clear()
706 auto_start_server.clear()
707 ip_cam_url.clear()
708 ip_cam_usrname.clear()
709 ip_cam_pswd.clear()
710 is_ip_cam_on.clear()
711 ip.clear()
712 settings_json = json.load(file)
713 for info in settings_json:
714 for ind in info['selected data index']: selected_data_index.append(ind)
715 for dark in info['dark mode']: dark_mode.append(dark)
716 for face in info['face detect']: face_detect.append(face)
717 for color in info['saved color']: saved_color.append(color)
718 for video in info['record video']: record_video.append(video)
719 for smile in info['smiley face']: smiley_face.append(smile)
720 for email in info['email address']: email_address.append(email)
721 for screen in info['capture screen']: cap_screen.append(screen)
722 for email_b in info['send email']: send_email.append(email_b)
723 for email_d in info['email delay']: email_delay.append(email_d)
724 for picture in info['picture delay']: picture_delay.append(picture)
725 for autostart in info['server auto start']: auto_start_server.append(autostart)
726 for ipaddress in info['host address']: ip.append(ipaddress)
727 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
728 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
729 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
730 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
731 button_css = 'background-color: rgb(' + str(saved_color[0]) + ', ' + str(saved_color[1]) + ', ' + str(saved_color[2]) + ');'
732 def checkboxClicked(self, b, name, m):
733 global auto_start_server, saved_color, ip, send_email, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, selected_data_index, face_detect, email_address, ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
734 # b.setStyleSheet('background-color: hsl(126, 81%, 29%)') if b.isChecked() == True else b.setStyleSheet('background-color: rgb(106, 11, 11)')
735 if name == "Capture Screen":
736 if b.isChecked() == True:
737 settings_json.pop(0)
738 settings_json.append({
739 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
740 "capture screen": ["True"],
741 "record video": [record_video[0]],
742 "smiley face": [smiley_face[0]],
743 "dark mode": [dark_mode[0]],
744 "send email": [send_email[0]],
745 "email delay": [email_delay[0]],
746 "picture delay": [picture_delay[0]],
747 "selected data index": [selected_data_index[0]],
748 "face detect":[face_detect[0]],
749 "email address": [email_address[0]],
750 "server auto start": [auto_start_server[0]],
751 "host address": [ip[0]],
752 "IP Camera URL": [ip_cam_url[0]],
753 "IP Camera Username": [ip_cam_usrname[0]],
754 "IP Camera Password": [ip_cam_pswd[0]],
755 "is IP Camera on": [is_ip_cam_on[0]]
756 })
757 with open(settings_file, mode='w+', encoding='utf-8') as file:
758 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
759 else:
760 settings_json.pop(0)
761 settings_json.append({
762 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
763 "capture screen": ["False"],
764 "record video": [record_video[0]],
765 "smiley face": [smiley_face[0]],
766 "dark mode": [dark_mode[0]],
767 "send email": [send_email[0]],
768 "email delay": [email_delay[0]],
769 "picture delay": [picture_delay[0]],
770 "selected data index": [selected_data_index[0]],
771 "face detect":[face_detect[0]],
772 "email address": [email_address[0]],
773 "server auto start": [auto_start_server[0]],
774 "host address": [ip[0]],
775 "IP Camera URL": [ip_cam_url[0]],
776 "IP Camera Username": [ip_cam_usrname[0]],
777 "IP Camera Password": [ip_cam_pswd[0]],
778 "is IP Camera on": [is_ip_cam_on[0]]
779 })
780 with open(settings_file, mode='w+', encoding='utf-8') as file:
781 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
782 if name == "Record Video":
783 if b.isChecked() == True:
784 settings_json.pop(0)
785 settings_json.append({
786 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
787 "capture screen": [cap_screen[0]],
788 "record video": ['True'],
789 "smiley face": [smiley_face[0]],
790 "dark mode": [dark_mode[0]],
791 "send email": [send_email[0]],
792 "email delay": [email_delay[0]],
793 "picture delay": [picture_delay[0]],
794 "selected data index": [selected_data_index[0]],
795 "face detect":[face_detect[0]],
796 "email address": [email_address[0]],
797 "server auto start": [auto_start_server[0]],
798 "host address": [ip[0]],
799 "IP Camera URL": [ip_cam_url[0]],
800 "IP Camera Username": [ip_cam_usrname[0]],
801 "IP Camera Password": [ip_cam_pswd[0]],
802 "is IP Camera on": [is_ip_cam_on[0]]
803 })
804 with open(settings_file, mode='w+', encoding='utf-8') as file:
805 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
806 else:
807 settings_json.pop(0)
808 settings_json.append({
809 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
810 "capture screen": [cap_screen[0]],
811 "record video": ['False'],
812 "smiley face": [smiley_face[0]],
813 "dark mode": [dark_mode[0]],
814 "send email": [send_email[0]],
815 "email delay": [email_delay[0]],
816 "picture delay": [picture_delay[0]],
817 "selected data index": [selected_data_index[0]],
818 "face detect":[face_detect[0]],
819 "email address": [email_address[0]],
820 "server auto start": [auto_start_server[0]],
821 "host address": [ip[0]],
822 "IP Camera URL": [ip_cam_url[0]],
823 "IP Camera Username": [ip_cam_usrname[0]],
824 "IP Camera Password": [ip_cam_pswd[0]],
825 "is IP Camera on": [is_ip_cam_on[0]]
826 })
827 with open(settings_file, mode='w+', encoding='utf-8') as file:
828 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
829 if name == "Send Emails":
830 if b.isChecked() == True:
831 if not email_address[0] == '':
832 settings_json.pop(0)
833 settings_json.append({
834 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
835 "capture screen": [cap_screen[0]],
836 "record video": [record_video[0]],
837 "smiley face": [smiley_face[0]],
838 "dark mode": [dark_mode[0]],
839 "send email": ['True'],
840 "email delay": [email_delay[0]],
841 "picture delay": [picture_delay[0]],
842 "selected data index": [selected_data_index[0]],
843 "face detect":[face_detect[0]],
844 "email address": [email_address[0]],
845 "server auto start": [auto_start_server[0]],
846 "host address": [ip[0]],
847 "IP Camera URL": [ip_cam_url[0]],
848 "IP Camera Username": [ip_cam_usrname[0]],
849 "IP Camera Password": [ip_cam_pswd[0]],
850 "is IP Camera on": [is_ip_cam_on[0]]
851 })
852 with open(settings_file, mode='w+', encoding='utf-8') as file:
853 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
854 if email_address[0] == '':
855 self.verifyEmailAddress('@gmail.com', False)
856 # self.sendEmails.setChecked(False)
857
858 else:
859 settings_json.pop(0)
860 settings_json.append({
861 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
862 "capture screen": [cap_screen[0]],
863 "record video": [record_video[0]],
864 "smiley face": [smiley_face[0]],
865 "dark mode": [dark_mode[0]],
866 "send email": ['False'],
867 "email delay": [email_delay[0]],
868 "picture delay": [picture_delay[0]],
869 "selected data index": [selected_data_index[0]],
870 "face detect":[face_detect[0]],
871 "email address": [email_address[0]],
872 "server auto start": [auto_start_server[0]],
873 "host address": [ip[0]],
874 "IP Camera URL": [ip_cam_url[0]],
875 "IP Camera Username": [ip_cam_usrname[0]],
876 "IP Camera Password": [ip_cam_pswd[0]],
877 "is IP Camera on": [is_ip_cam_on[0]]
878 })
879 with open(settings_file, mode='w+', encoding='utf-8') as file:
880 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
881 if name == "Smiley Face Addon":
882 if b.isChecked() == True:
883 if face_detect[0] == 'False' or not self.cascadeList.currentText() == 'frontalface alt tree' and not self.cascadeList.currentText() == 'frontalface default' and not self.cascadeList.currentIndex() == 'frontalface alt2' and not self.cascadeList.currentIndex() == 'profileface':
884 buttonReply = QMessageBox.question(self, "Enable 'face detection'", "You currently do not have 'face detection' enabled, if you want to get the best result, I would suggest you enable it.\nDo you want to enable 'face detection'?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
885 if buttonReply == QMessageBox.Yes:
886 for i, j in enumerate(cascade_files):
887 if j == 'haarcascade_frontalface_default.xml':
888 self.cascadeList.setCurrentIndex(i)
889 self.faceDetection.setChecked(True)
890 self.checkboxClicked(self.faceDetection, 'Face Detection', '')
891 settings_json.pop(0)
892 settings_json.append({
893 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
894 "capture screen": [cap_screen[0]],
895 "record video": [record_video[0]],
896 "smiley face": ['True'],
897 "dark mode": [dark_mode[0]],
898 "send email": [send_email[0]],
899 "email delay": [email_delay[0]],
900 "picture delay": [picture_delay[0]],
901 "selected data index": [selected_data_index[0]],
902 "face detect":[face_detect[0]],
903 "email address": [email_address[0]],
904 "server auto start": [auto_start_server[0]],
905 "host address": [ip[0]],
906 "IP Camera URL": [ip_cam_url[0]],
907 "IP Camera Username": [ip_cam_usrname[0]],
908 "IP Camera Password": [ip_cam_pswd[0]],
909 "is IP Camera on": [is_ip_cam_on[0]]
910 })
911 with open(settings_file, mode='w+', encoding='utf-8') as file:
912 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
913 else:
914 settings_json.pop(0)
915 settings_json.append({
916 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
917 "capture screen": [cap_screen[0]],
918 "record video": [record_video[0]],
919 "smiley face": ['False'],
920 "dark mode": [dark_mode[0]],
921 "send email": [send_email[0]],
922 "email delay": [email_delay[0]],
923 "picture delay": [picture_delay[0]],
924 "selected data index": [selected_data_index[0]],
925 "face detect":[face_detect[0]],
926 "email address": [email_address[0]],
927 "server auto start": [auto_start_server[0]],
928 "host address": [ip[0]],
929 "IP Camera URL": [ip_cam_url[0]],
930 "IP Camera Username": [ip_cam_usrname[0]],
931 "IP Camera Password": [ip_cam_pswd[0]],
932 "is IP Camera on": [is_ip_cam_on[0]]
933 })
934 with open(settings_file, mode='w+', encoding='utf-8') as file:
935 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
936 if name == "Dark mode":
937 if b.isChecked() == True:
938 self.lightmode.setChecked(False)
939 self.systemmode.setChecked(False)
940 app.setStyle("Fusion")
941 palette = QPalette()
942 gradient = QLinearGradient(0, 0, 0, 400)
943 gradient.setColorAt(0.0, QColor(40, 40, 40))
944 gradient.setColorAt(1.0, QColor(30, 30, 30))
945 palette.setBrush(QPalette.Window, QBrush(gradient))
946 palette.setColor(QPalette.WindowText, Qt.white)
947 palette.setColor(QPalette.Base, QColor(25, 25, 25))
948 palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
949 palette.setColor(QPalette.ToolTipBase, Qt.white)
950 palette.setColor(QPalette.ToolTipText, Qt.white)
951 palette.setColor(QPalette.Text, Qt.white)
952 palette.setColor(QPalette.Button, QColor(30, 30, 30))
953 palette.setColor(QPalette.ButtonText, Qt.white)
954 palette.setColor(QPalette.BrightText, Qt.red)
955 palette.setColor(QPalette.Link, QColor(42, 130, 218))
956 palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
957 palette.setColor(QPalette.HighlightedText, Qt.black)
958 app.setPalette(palette)
959 settings_json.pop(0)
960 settings_json.append({
961 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
962 "capture screen": [cap_screen[0]],
963 "record video": [record_video[0]],
964 "smiley face": [smiley_face[0]],
965 "dark mode": ['1'],
966 "send email": [send_email[0]],
967 "email delay": [email_delay[0]],
968 "picture delay": [picture_delay[0]],
969 "selected data index": [selected_data_index[0]],
970 "face detect":[face_detect[0]],
971 "email address": [email_address[0]],
972 "server auto start": [auto_start_server[0]],
973 "host address": [ip[0]],
974 "IP Camera URL": [ip_cam_url[0]],
975 "IP Camera Username": [ip_cam_usrname[0]],
976 "IP Camera Password": [ip_cam_pswd[0]],
977 "is IP Camera on": [is_ip_cam_on[0]]
978 })
979 with open(settings_file, mode='w+', encoding='utf-8') as file:
980 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
981 else:
982 self.lightmode.setChecked(False)
983 self.systemmode.setChecked(True)
984 app.setPalette(QApplication.style().standardPalette())
985 settings_json.pop(0)
986 settings_json.append({
987 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
988 "capture screen": [cap_screen[0]],
989 "record video": [record_video[0]],
990 "smiley face": [smiley_face[0]],
991 "dark mode": ['0'],
992 "send email": [send_email[0]],
993 "email delay": [email_delay[0]],
994 "picture delay": [picture_delay[0]],
995 "selected data index": [selected_data_index[0]],
996 "face detect":[face_detect[0]],
997 "email address": [email_address[0]],
998 "server auto start": [auto_start_server[0]],
999 "host address": [ip[0]],
1000 "IP Camera URL": [ip_cam_url[0]],
1001 "IP Camera Username": [ip_cam_usrname[0]],
1002 "IP Camera Password": [ip_cam_pswd[0]],
1003 "is IP Camera on": [is_ip_cam_on[0]]
1004 })
1005 with open(settings_file, mode='w+', encoding='utf-8') as file:
1006 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1007 if name == "Light mode":
1008 if b.isChecked() == True:
1009 self.darkmode.setChecked(False)
1010 self.systemmode.setChecked(False)
1011 app.setStyle("Fusion")
1012 app.setPalette(QApplication.style().standardPalette())
1013 palette = QPalette()
1014 gradient = QLinearGradient(0, 0, 0, 400)
1015 gradient.setColorAt(0.0, QColor(240, 240, 240))
1016 gradient.setColorAt(1.0, QColor(215, 215, 215))
1017 palette.setColor(QPalette.ButtonText, Qt.black)
1018 palette.setBrush(QPalette.Window, QBrush(gradient))
1019 app.setPalette(palette)
1020 settings_json.pop(0)
1021 settings_json.append({
1022 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1023 "capture screen": [cap_screen[0]],
1024 "record video": [record_video[0]],
1025 "smiley face": [smiley_face[0]],
1026 "dark mode": ['2'],
1027 "send email": [send_email[0]],
1028 "email delay": [email_delay[0]],
1029 "picture delay": [picture_delay[0]],
1030 "selected data index": [selected_data_index[0]],
1031 "face detect":[face_detect[0]],
1032 "email address": [email_address[0]],
1033 "server auto start": [auto_start_server[0]],
1034 "host address": [ip[0]],
1035 "IP Camera URL": [ip_cam_url[0]],
1036 "IP Camera Username": [ip_cam_usrname[0]],
1037 "IP Camera Password": [ip_cam_pswd[0]],
1038 "is IP Camera on": [is_ip_cam_on[0]]
1039 })
1040 with open(settings_file, mode='w+', encoding='utf-8') as file:
1041 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1042 else:
1043 self.darkmode.setChecked(False)
1044 self.systemmode.setChecked(True)
1045 app.setPalette(QApplication.style().standardPalette())
1046 settings_json.pop(0)
1047 settings_json.append({
1048 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1049 "capture screen": [cap_screen[0]],
1050 "record video": [record_video[0]],
1051 "smiley face": [smiley_face[0]],
1052 "dark mode": ['0'],
1053 "send email": [send_email[0]],
1054 "email delay": [email_delay[0]],
1055 "picture delay": [picture_delay[0]],
1056 "selected data index": [selected_data_index[0]],
1057 "face detect":[face_detect[0]],
1058 "email address": [email_address[0]],
1059 "server auto start": [auto_start_server[0]],
1060 "host address": [ip[0]],
1061 "IP Camera URL": [ip_cam_url[0]],
1062 "IP Camera Username": [ip_cam_usrname[0]],
1063 "IP Camera Password": [ip_cam_pswd[0]],
1064 "is IP Camera on": [is_ip_cam_on[0]]
1065 })
1066 with open(settings_file, mode='w+', encoding='utf-8') as file:
1067 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1068 if name == "System mode":
1069 if b.isChecked() == True:
1070 self.darkmode.setChecked(False)
1071 self.lightmode.setChecked(False)
1072 app.setPalette(QApplication.style().standardPalette())
1073 settings_json.pop(0)
1074 settings_json.append({
1075 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1076 "capture screen": [cap_screen[0]],
1077 "record video": [record_video[0]],
1078 "smiley face": [smiley_face[0]],
1079 "dark mode": ['0'],
1080 "send email": [send_email[0]],
1081 "email delay": [email_delay[0]],
1082 "picture delay": [picture_delay[0]],
1083 "selected data index": [selected_data_index[0]],
1084 "face detect":[face_detect[0]],
1085 "email address": [email_address[0]],
1086 "server auto start": [auto_start_server[0]],
1087 "host address": [ip[0]],
1088 "IP Camera URL": [ip_cam_url[0]],
1089 "IP Camera Username": [ip_cam_usrname[0]],
1090 "IP Camera Password": [ip_cam_pswd[0]],
1091 "is IP Camera on": [is_ip_cam_on[0]]
1092 })
1093 with open(settings_file, mode='w+', encoding='utf-8') as file:
1094 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1095 else:
1096 self.darkmode.setChecked(False)
1097 self.lightmode.setChecked(False)
1098 self.systemmode.setChecked(True)
1099 app.setPalette(QApplication.style().standardPalette())
1100 settings_json.pop(0)
1101 settings_json.append({
1102 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1103 "capture screen": [cap_screen[0]],
1104 "record video": [record_video[0]],
1105 "smiley face": [smiley_face[0]],
1106 "dark mode": ['0'],
1107 "send email": [send_email[0]],
1108 "email delay": [email_delay[0]],
1109 "picture delay": [picture_delay[0]],
1110 "selected data index": [selected_data_index[0]],
1111 "face detect":[face_detect[0]],
1112 "email address": [email_address[0]],
1113 "server auto start": [auto_start_server[0]],
1114 "host address": [ip[0]],
1115 "IP Camera URL": [ip_cam_url[0]],
1116 "IP Camera Username": [ip_cam_usrname[0]],
1117 "IP Camera Password": [ip_cam_pswd[0]],
1118 "is IP Camera on": [is_ip_cam_on[0]]
1119 })
1120 with open(settings_file, mode='w+', encoding='utf-8') as file:
1121 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1122 if name == "Face Detection":
1123 if b.isChecked() == True:
1124 self.motionDetection.setChecked(False)
1125 settings_json.pop(0)
1126 settings_json.append({
1127 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1128 "capture screen": [cap_screen[0]],
1129 "record video": [record_video[0]],
1130 "smiley face": [smiley_face[0]],
1131 "dark mode": [dark_mode[0]],
1132 "send email": [send_email[0]],
1133 "email delay": [email_delay[0]],
1134 "picture delay": [picture_delay[0]],
1135 "selected data index": [selected_data_index[0]],
1136 "face detect":['True'],
1137 "email address": [email_address[0]],
1138 "server auto start": [auto_start_server[0]],
1139 "host address": [ip[0]],
1140 "IP Camera URL": [ip_cam_url[0]],
1141 "IP Camera Username": [ip_cam_usrname[0]],
1142 "IP Camera Password": [ip_cam_pswd[0]],
1143 "is IP Camera on": [is_ip_cam_on[0]]
1144 })
1145 with open(settings_file, mode='w+', encoding='utf-8') as file:
1146 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1147 else:
1148 self.motionDetection.setChecked(True)
1149 settings_json.pop(0)
1150 settings_json.append({
1151 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1152 "capture screen": [cap_screen[0]],
1153 "record video": [record_video[0]],
1154 "smiley face": [smiley_face[0]],
1155 "dark mode": [dark_mode[0]],
1156 "send email": [send_email[0]],
1157 "email delay": [email_delay[0]],
1158 "picture delay": [picture_delay[0]],
1159 "selected data index": [selected_data_index[0]],
1160 "face detect":['False'],
1161 "email address": [email_address[0]],
1162 "server auto start": [auto_start_server[0]],
1163 "host address": [ip[0]],
1164 "IP Camera URL": [ip_cam_url[0]],
1165 "IP Camera Username": [ip_cam_usrname[0]],
1166 "IP Camera Password": [ip_cam_pswd[0]],
1167 "is IP Camera on": [is_ip_cam_on[0]]
1168 })
1169 with open(settings_file, mode='w+', encoding='utf-8') as file:
1170 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1171 if name == 'Motion Detection':
1172 if b.isChecked() == True:
1173 self.faceDetection.setChecked(False)
1174 self.faceDetection.setChecked(False)
1175 settings_json.pop(0)
1176 settings_json.append({
1177 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1178 "capture screen": [cap_screen[0]],
1179 "record video": [record_video[0]],
1180 "smiley face": [smiley_face[0]],
1181 "dark mode": [dark_mode[0]],
1182 "send email": [send_email[0]],
1183 "email delay": [email_delay[0]],
1184 "picture delay": [picture_delay[0]],
1185 "selected data index": [selected_data_index[0]],
1186 "face detect":['False'],
1187 "email address": [email_address[0]],
1188 "server auto start": [auto_start_server[0]],
1189 "host address": [ip[0]],
1190 "IP Camera URL": [ip_cam_url[0]],
1191 "IP Camera Username": [ip_cam_usrname[0]],
1192 "IP Camera Password": [ip_cam_pswd[0]],
1193 "is IP Camera on": [is_ip_cam_on[0]]
1194 })
1195 with open(settings_file, mode='w+', encoding='utf-8') as file:
1196 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1197 else:
1198 self.faceDetection.setChecked(True)
1199 settings_json.pop(0)
1200 settings_json.append({
1201 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1202 "capture screen": [cap_screen[0]],
1203 "record video": [record_video[0]],
1204 "smiley face": [smiley_face[0]],
1205 "dark mode": [dark_mode[0]],
1206 "send email": [send_email[0]],
1207 "email delay": [email_delay[0]],
1208 "picture delay": [picture_delay[0]],
1209 "selected data index": [selected_data_index[0]],
1210 "face detect":['True'],
1211 "email address": [email_address[0]],
1212 "server auto start": [auto_start_server[0]],
1213 "host address": [ip[0]],
1214 "IP Camera URL": [ip_cam_url[0]],
1215 "IP Camera Username": [ip_cam_usrname[0]],
1216 "IP Camera Password": [ip_cam_pswd[0]],
1217 "is IP Camera on": [is_ip_cam_on[0]]
1218 })
1219 with open(settings_file, mode='w+', encoding='utf-8') as file:
1220 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1221 if name == 'IP Cam':
1222 if b.isChecked() == True:
1223 QMessageBox.information(self, "Attention", "If the IP Camera doesn't connect automaticly,\ntry restarting the program.\nIf it still doesn't work, your Camera URL isn't correct.", QMessageBox.Ok, QMessageBox.Ok)
1224 settings_json.pop(0)
1225 settings_json.append({
1226 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1227 "capture screen": [cap_screen[0]],
1228 "record video": [record_video[0]],
1229 "smiley face": [smiley_face[0]],
1230 "dark mode": [dark_mode[0]],
1231 "send email": [send_email[0]],
1232 "email delay": [email_delay[0]],
1233 "picture delay": [picture_delay[0]],
1234 "selected data index": [selected_data_index[0]],
1235 "face detect":[face_detect[0]],
1236 "email address": [email_address[0]],
1237 "server auto start": [auto_start_server[0]],
1238 "host address": [ip[0]],
1239 "IP Camera URL": [ip_cam_url[0]],
1240 "IP Camera Username": [ip_cam_usrname[0]],
1241 "IP Camera Password": [ip_cam_pswd[0]],
1242 "is IP Camera on": ['True']
1243 })
1244 with open(settings_file, mode='w+', encoding='utf-8') as file:
1245 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1246 # else: self.IpCam.setChecked(True if is_ip_cam_on[0] == 'True' else False); return
1247 if get_cam_image() == False:
1248 QMessageBox.information(self, "Attention", "IP/URL is incorrect.", QMessageBox.Ok, QMessageBox.Ok)
1249 self.open_add_usr_pass_menu()
1250 else:
1251 QMessageBox.information(self, "Attention", "If the Local Camera doesn't connect automaticly,\ntry restarting the program.", QMessageBox.Ok, QMessageBox.Ok)
1252 settings_json.pop(0)
1253 settings_json.append({
1254 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1255 "capture screen": [cap_screen[0]],
1256 "record video": [record_video[0]],
1257 "smiley face": [smiley_face[0]],
1258 "dark mode": [dark_mode[0]],
1259 "send email": [send_email[0]],
1260 "email delay": [email_delay[0]],
1261 "picture delay": [picture_delay[0]],
1262 "selected data index": [selected_data_index[0]],
1263 "face detect":[face_detect[0]],
1264 "email address": [email_address[0]],
1265 "server auto start": [auto_start_server[0]],
1266 "host address": [ip[0]],
1267 "IP Camera URL": [ip_cam_url[0]],
1268 "IP Camera Username": [ip_cam_usrname[0]],
1269 "IP Camera Password": [ip_cam_pswd[0]],
1270 "is IP Camera on": ["False"]
1271 })
1272 with open(settings_file, mode='w+', encoding='utf-8') as file:
1273 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1274
1275 with open(settings_file) as file:
1276 saved_color.clear()
1277 send_email.clear()
1278 cap_screen.clear()
1279 record_video.clear()
1280 smiley_face.clear()
1281 dark_mode.clear()
1282 email_delay.clear()
1283 picture_delay.clear()
1284 face_detect.clear()
1285 email_address.clear()
1286 auto_start_server.clear()
1287 ip_cam_url.clear()
1288 ip_cam_usrname.clear()
1289 ip_cam_pswd.clear()
1290 is_ip_cam_on.clear()
1291 ip.clear()
1292 settings_json = json.load(file)
1293 for info in settings_json:
1294 for ind in info['selected data index']: selected_data_index.append(ind)
1295 for dark in info['dark mode']: dark_mode.append(dark)
1296 for face in info['face detect']: face_detect.append(face)
1297 for color in info['saved color']: saved_color.append(color)
1298 for video in info['record video']: record_video.append(video)
1299 for smile in info['smiley face']: smiley_face.append(smile)
1300 for email in info['email address']: email_address.append(email)
1301 for screen in info['capture screen']: cap_screen.append(screen)
1302 for email_b in info['send email']: send_email.append(email_b)
1303 for email_d in info['email delay']: email_delay.append(email_d)
1304 for picture in info['picture delay']: picture_delay.append(picture)
1305 for autostart in info['server auto start']: auto_start_server.append(autostart)
1306 for ipaddress in info['host address']: ip.append(ipaddress)
1307 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
1308 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
1309 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
1310 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
1311
1312 # button = QMessageBox.information(self, "Attention", "That URL didn't work.\n\nTry the URL to the direct image,", QMessageBox.Ok, QMessageBox.Ok)
1313 def auto_start(self):
1314 global auto_start_server, ip, saved_color, send_email, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, selected_data_index, face_detect, email_address, ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
1315 button = QMessageBox.information(self, "Attention", "You must restart the program for this effect to take place.\n\n Are you sure you want to continue?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
1316 if button == QMessageBox.Yes:
1317 checked = str(self.autoStartServer.isChecked())
1318 checked = list(checked)
1319 checked[0] = checked[0].capitalize()
1320 checked = "".join(checked)
1321 settings_json.pop(0)
1322 settings_json.append({
1323 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1324 "capture screen": [cap_screen[0]],
1325 "record video": [record_video[0]],
1326 "smiley face": [smiley_face[0]],
1327 "dark mode": [dark_mode[0]],
1328 "send email": [send_email[0]],
1329 "email delay": [email_delay[0]],
1330 "picture delay": [picture_delay[0]],
1331 "selected data index": [selected_data_index[0]],
1332 "face detect":[face_detect[0]],
1333 "email address": [email_address[0]],
1334 "server auto start": [checked],
1335 "host address": [ip[0]],
1336 "IP Camera URL": [ip_cam_url[0]],
1337 "IP Camera Username": [ip_cam_usrname[0]],
1338 "IP Camera Password": [ip_cam_pswd[0]],
1339 "is IP Camera on": [is_ip_cam_on[0]]
1340 })
1341 with open(settings_file, mode='w+', encoding='utf-8') as file:
1342 json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1343 with open(settings_file) as file:
1344 saved_color.clear()
1345 send_email.clear()
1346 cap_screen.clear()
1347 record_video.clear()
1348 smiley_face.clear()
1349 dark_mode.clear()
1350 email_delay.clear()
1351 picture_delay.clear()
1352 face_detect.clear()
1353 email_address.clear()
1354 auto_start_server.clear()
1355 ip_cam_url.clear()
1356 ip_cam_usrname.clear()
1357 ip_cam_pswd.clear()
1358 is_ip_cam_on.clear()
1359 ip.clear()
1360 settings_json = json.load(file)
1361 for info in settings_json:
1362 for ind in info['selected data index']: selected_data_index.append(ind)
1363 for dark in info['dark mode']: dark_mode.append(dark)
1364 for face in info['face detect']: face_detect.append(face)
1365 for color in info['saved color']: saved_color.append(color)
1366 for video in info['record video']: record_video.append(video)
1367 for smile in info['smiley face']: smiley_face.append(smile)
1368 for email in info['email address']: email_address.append(email)
1369 for screen in info['capture screen']: cap_screen.append(screen)
1370 for email_b in info['send email']: send_email.append(email_b)
1371 for email_d in info['email delay']: email_delay.append(email_d)
1372 for picture in info['picture delay']: picture_delay.append(picture)
1373 for autostart in info['server auto start']: auto_start_server.append(autostart)
1374 for ipaddress in info['host address']: ip.append(ipaddress)
1375 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
1376 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
1377 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
1378 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
1379 else:
1380 self.autoStartServer.setChecked(True if auto_start_server[0] == 'True' else False)
1381 return
1382 # exit_handler()
1383 self.close()
1384 def visitServer(self):
1385 a_website = "http://" + str(ip[0]) + ":5000"
1386 webbrowser.open_new(a_website)
1387class Thread1(QThread):
1388 try:
1389 changePixmap = pyqtSignal(QImage)
1390 def run(self):
1391 start_time = time.time()
1392 x = 1 # displays the frame rate every 1 second
1393 counter = 0
1394 n = 0
1395 while running:
1396 global outputFrame, frame, isTimeToSendEmail, rgbImage, is_ip_cam_working
1397 counter+=1
1398 try:
1399 isTimeToSendEmail = camera1.timeToSend
1400 if running: frame = camera1.camRun()
1401 except:
1402 n += 1
1403 if n >= 2: exit_handler()
1404 try:
1405 rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
1406 h, w, ch = rgbImage.shape
1407 bytesPerLine = ch * w
1408 convertToQtFormat = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)
1409 self.changePixmap.emit(convertToQtFormat)
1410 except:
1411 print('Error getting camera')
1412 is_ip_cam_working = False
1413 image = QImage('404.png')
1414 self.changePixmap.emit(image)
1415 # break
1416 if (time.time() - start_time) > x :
1417 global framesPerSecond
1418 framesPerSecond = counter / (time.time() - start_time)
1419 counter = 0
1420 start_time = time.time()
1421 with lock:
1422 try:
1423 outputFrame = frame.copy()
1424 outputFrame = imutils.resize(outputFrame, width=360)
1425 except:
1426 is_ip_cam_working = False
1427 print('cant read image')
1428 except: running = False
1429 finally: running = False
1430class Thread2(QThread):
1431 try:
1432 changePixmap = pyqtSignal(QImage)
1433 def run(self):
1434 start_time = time.time()
1435 x = 1 # displays the frame rate every 1 second
1436 counter = 0
1437 n = 0
1438 while running:
1439 global outputFrame, frame, isTimeToSendEmail, rgbImage, is_ip_cam_working
1440 counter+=1
1441 try:
1442 isTimeToSendEmail = camera2.timeToSend
1443 if running: frame = camera2.camRun()
1444 except:
1445 n += 1
1446 if n >= 2: exit_handler()
1447 try:
1448 rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
1449 h, w, ch = rgbImage.shape
1450 bytesPerLine = ch * w
1451 convertToQtFormat = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)
1452 self.changePixmap.emit(convertToQtFormat)
1453 except:
1454 print('Error getting camera')
1455 is_ip_cam_working = False
1456 image = QImage('404.png')
1457 self.changePixmap.emit(image)
1458 # break
1459 if (time.time() - start_time) > x :
1460 global framesPerSecond
1461 framesPerSecond = counter / (time.time() - start_time)
1462 counter = 0
1463 start_time = time.time()
1464 with lock:
1465 try:
1466 outputFrame = frame.copy()
1467 outputFrame = imutils.resize(outputFrame, width=360)
1468 except:
1469 is_ip_cam_working = False
1470 print('cant read image')
1471 except: running = False
1472 finally: running = False
1473@appWeb.route("/")
1474def index():
1475 return render_template("index.html")
1476@appWeb.before_request
1477def before_request():
1478 g.request_time = lambda: datetime.now().strftime("%A %d %B %Y %I:%M:%S%p")
1479def generate():
1480 global outputFrame, lock, frame
1481 while running:
1482 with lock:
1483 if outputFrame is None: continue
1484 (flag, encodedImage) = cv2.imencode(".jpg", outputFrame)
1485 if not flag: continue
1486 yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + bytearray(encodedImage) + b'\r\n')
1487@appWeb.route("/video_feed")
1488def video_feed():
1489 return Response(generate(),
1490 mimetype = "multipart/x-mixed-replace; boundary=frame")
1491class CycleMenu(QMainWindow):
1492 def __init__(self, parent = None):
1493 super(CycleMenu, self).__init__(parent)
1494 global cycles, alwaysOn, OffFromList, OffToList, OnToList, OnFromList
1495 OffFromList.clear()
1496 OffToList.clear()
1497 OnFromList.clear()
1498 OnToList.clear()
1499 alwaysOn.clear()
1500 with open(cycles_file) as file:
1501 cycles_json = json.load(file)
1502 for info in cycles_json:
1503 for c in info['cycles']: cycles = int(c)
1504 for on in info['always on']: alwaysOn.append(on)
1505 for OnTo in info['OnTo']: OnToList.append(OnTo)
1506 for OnFrom in info['OnFrom']: OnFromList.append(OnFrom)
1507 for OffTo in info['OffTo']: OffToList.append(OffTo)
1508 for OffFrom in info['OffFrom']: OffFromList.append(OffFrom)
1509 regexp = QtCore.QRegExp('[a-z-A-Z-0-9-:_]{0,7}')
1510 self.validator = QtGui.QRegExpValidator(regexp)
1511 self.setWindowIcon(self.style().standardIcon(getattr(QStyle, 'SP_MessageBoxInformation')))
1512 mainlay = QWidget(self)
1513 mainlay.setContentsMargins(5, 5, 5, 5)
1514 self.currentTime = str(QTime.currentTime().toString(Qt.DefaultLocaleLongDate))
1515 self.grid = QGridLayout()
1516 self.grid.addWidget(self.lay(), 1, 0)
1517 mainlay.setLayout(self.grid)
1518 self.setCentralWidget(mainlay)
1519 def clearLayout(self, layout):
1520 if layout is not None:
1521 while layout.count():
1522 item = layout.takeAt(0)
1523 widget = item.widget()
1524 if widget is not None: idget.deleteLater()
1525 else: self.clearLayout(item.layout())
1526 def lay(self):
1527 global selected_data_index, cycles, all_textboxes, OnTo_textboxes, OnFrom_textboxes, OffTo_textboxes, OffFrom_textboxes
1528 self.scroll = QScrollArea(self)
1529 self.scroll.move(7, 80)
1530 self.scroll.setWidgetResizable(True)
1531 self.content = QWidget()
1532 self.scroll.setWidget(self.content)
1533 grid = QGridLayout(self.content)
1534
1535 if isTimeToSendEmail: self.setWindowTitle(f'Cycle Menu - {cycles} - Cycles - Currenly is Active')
1536 else: self.setWindowTitle(f'Cycle Menu - {cycles} - Cycles - Currenly is not Active')
1537
1538 self.radAlwaysOn = QCheckBox('Always on?')
1539 self.radAlwaysOn.clicked.connect(self.delete_save_saveCycles)
1540 self.radAlwaysOn.setChecked(True if alwaysOn[0] == 'True' else False)
1541 grid.addWidget(self.radAlwaysOn, 0, 0)
1542
1543 addCycle = QPushButton('&Add')
1544 addCycle.clicked.connect(self.btnAdd)
1545
1546 btnSubmit = QPushButton('&Submit')
1547 btnSubmit.clicked.connect(self.save_cycles)
1548 btnSubmit.setIcon(self.style().standardIcon(getattr(QStyle, 'SP_DialogApplyButton')))
1549 btnSubmit.clicked.connect(self.submit)
1550
1551 all_textboxes.clear()
1552 OnTo_textboxes.clear()
1553 OnFrom_textboxes.clear()
1554 OffTo_textboxes.clear()
1555 OffFrom_textboxes.clear()
1556 for i in range(cycles):
1557 subCycle = QPushButton('x')
1558 subCycle.clicked.connect(partial(self.delete_cycle, i))
1559
1560 btnUp = QPushButton()
1561 btnUp.clicked.connect(partial(self.up_arrow, i))
1562 btnUp.setIcon(self.style().standardIcon(getattr(QStyle, 'SP_ArrowUp')))
1563
1564 btnDown = QPushButton()
1565 btnDown.clicked.connect(partial(self.down_arrow, i))
1566 btnDown.setIcon(self.style().standardIcon(getattr(QStyle, 'SP_ArrowDown')))
1567
1568 OnFrom = QLineEdit()
1569 OnTo = QLineEdit()
1570 OffFrom = QLineEdit()
1571 OffTo = QLineEdit()
1572
1573 lblOnTo = QLabel(f'{i + 1}. On:')
1574 lblOnFrom = QLabel('to:')
1575 OnFrom.setValidator(self.validator)
1576 OnFrom.setText(str(OnFromList[i]))
1577 OnFrom.textChanged.connect(partial(self.save_cycles))
1578 OnTo.setValidator(self.validator)
1579 OnTo.setText(str(OnToList[i]))
1580 OnTo.textChanged.connect(partial(self.save_cycles))
1581
1582 lblOffTo = QLabel('Off:')
1583 lblOffFrom = QLabel('to:')
1584 OffFrom.setValidator(self.validator)
1585 OffFrom.setText(str(OffFromList[i]))
1586 OffFrom.textChanged.connect(partial(self.save_cycles))
1587 OffTo.setValidator(self.validator)
1588 OffTo.setText(str(OffToList[i]))
1589 OffTo.textChanged.connect(partial(self.save_cycles))
1590
1591 grid.addWidget(lblOnTo, i + 1, 0)
1592 grid.addWidget(lblOnFrom, i + 1, 2)
1593 grid.addWidget(OnTo, i + 1, 1)
1594 grid.addWidget(OnFrom, i + 1, 3)
1595
1596 grid.addWidget(lblOffTo, i + 1, 4)
1597 grid.addWidget(lblOffFrom, i + 1, 6)
1598 grid.addWidget(OffTo, i + 1, 5)
1599 grid.addWidget(OffFrom, i + 1, 7)
1600
1601 grid.addWidget(subCycle, i + 1, 8)
1602 if not i == 0: grid.addWidget(btnUp, i + 1, 9)
1603 if not i == cycles - 1: grid.addWidget(btnDown, i + 1, 10)
1604
1605 OnTo_textboxes.append(OnTo)
1606 OnFrom_textboxes.append(OnFrom)
1607 OffTo_textboxes.append(OffTo)
1608 OffFrom_textboxes.append(OffFrom)
1609 all_textboxes.append(OnTo)
1610 all_textboxes.append(OnFrom)
1611 all_textboxes.append(OffTo)
1612 all_textboxes.append(OffFrom)
1613
1614 grid.addWidget(addCycle, cycles + 3, 8)
1615 grid.addWidget(btnSubmit, cycles + 4, 8)
1616 return self.scroll
1617 def up_arrow(self, key):
1618 global cycles, OffFromList, OffToList, OnFromList, onToList, OnTo_textboxes, OnFrom_textboxes, OffTo_textboxes, OffFrom_textboxes
1619 up = key - 1
1620 OffTo_textboxes[key], OffTo_textboxes[up] = OffTo_textboxes[up], OffTo_textboxes[key]
1621 OffFrom_textboxes[key], OffFrom_textboxes[up] = OffFrom_textboxes[up], OffFrom_textboxes[key]
1622 OnTo_textboxes[key], OnTo_textboxes[up] = OnTo_textboxes[up], OnTo_textboxes[key]
1623 OnFrom_textboxes[key], OnFrom_textboxes[up] = OnFrom_textboxes[up], OnFrom_textboxes[key]
1624 self.delete_save_saveCycles()
1625 self.clearLayout(self.grid)
1626 self.grid.addWidget(self.lay(), 1, 0)
1627 def down_arrow(self, key):
1628 global cycles, OffFromList, OffToList, OnFromList, onToList, OnTo_textboxes, OnFrom_textboxes, OffTo_textboxes, OffFrom_textboxes
1629 down = key + 1
1630 OffTo_textboxes[key], OffTo_textboxes[down] = OffTo_textboxes[down], OffTo_textboxes[key]
1631 OffFrom_textboxes[key], OffFrom_textboxes[down] = OffFrom_textboxes[down], OffFrom_textboxes[key]
1632 OnTo_textboxes[key], OnTo_textboxes[down] = OnTo_textboxes[down], OnTo_textboxes[key]
1633 OnFrom_textboxes[key], OnFrom_textboxes[down] = OnFrom_textboxes[down], OnFrom_textboxes[key]
1634 self.delete_save_saveCycles()
1635 self.clearLayout(self.grid)
1636 self.grid.addWidget(self.lay(), 1, 0)
1637 def save_cycles(self):
1638 global cycles, OffFromList, OffToList, OnFromList, onToList, cycles_json, all_textboxes
1639 for i, j in enumerate(all_textboxes):
1640 temp = j.text()
1641 temp = temp.replace(' ', '')
1642 temp = temp.lower()
1643 rx = re.compile(r"^((2[0-3]|[01][1-9]|10):([0-5][0-9]))$")
1644 if not rx.match(temp): return
1645 self.delete_save_saveCycles()
1646 def delete_cycle(self, key):
1647 global cycles, OnTo_textboxes, OnFrom_textboxes, OffTo_textboxes, OffFrom_textboxes
1648 cycles -= 1
1649 del OnTo_textboxes[key]
1650 del OnFrom_textboxes[key]
1651 del OffTo_textboxes[key]
1652 del OffFrom_textboxes[key]
1653 self.delete_save_saveCycles()
1654 self.clearLayout(self.grid)
1655 self.grid.addWidget(self.lay(), 1, 0)
1656 def delete_save_saveCycles(self):
1657 global cycles, alwaysOn, OffFromList, OffToList, OnFromList, onToList, OnTo_textboxes, OnFrom_textboxes, OffTo_textboxes, OffFrom_textboxes
1658 OffFromList.clear()
1659 OffToList.clear()
1660 OnFromList.clear()
1661 OnToList.clear()
1662 # alwaysOn.clear()
1663
1664 with open(cycles_file) as file:
1665 cycles_json = json.load(file)
1666 for i, j in enumerate(OnTo_textboxes):
1667 temp = j.text()
1668 temp = temp.replace(' ', '')
1669 temp = temp.upper()
1670 OnToList.append(temp)
1671 for i, j in enumerate(OnFrom_textboxes):
1672 temp = j.text()
1673 temp = temp.replace(' ', '')
1674 temp = temp.upper()
1675 OnFromList.append(temp)
1676 for i, j in enumerate(OffTo_textboxes):
1677 temp = j.text()
1678 temp = temp.replace(' ', '')
1679 temp = temp.upper()
1680 OffToList.append(temp)
1681 for i, j in enumerate(OffFrom_textboxes):
1682 temp = j.text()
1683 temp = temp.replace(' ', '')
1684 temp = temp.upper()
1685 OffFromList.append(temp)
1686 cycles_json.pop(0)
1687 cycles_json.append({
1688 "cycles": [str(cycles)],
1689 "always on": [str(self.radAlwaysOn.isChecked())],
1690 "OnTo": OnToList,
1691 "OnFrom": OnFromList,
1692 "OffTo": OffToList,
1693 "OffFrom": OffFromList
1694 })
1695 with open(cycles_file, mode='w+', encoding='utf-8') as file:
1696 json.dump(cycles_json, file, ensure_ascii=True, indent=4)
1697 OffFromList.clear()
1698 OffToList.clear()
1699 OnFromList.clear()
1700 OnToList.clear()
1701 alwaysOn.clear()
1702 with open(cycles_file) as file:
1703 cycles_json = json.load(file)
1704 for info in cycles_json:
1705 for c in info['cycles']: cycles = int(c)
1706 for on in info['always on']: alwaysOn.append(on)
1707 for OnTo in info['OnTo']: OnToList.append(OnTo)
1708 for OnFrom in info['OnFrom']: OnFromList.append(OnFrom)
1709 for OffTo in info['OffTo']: OffToList.append(OffTo)
1710 for OffFrom in info['OffFrom']: OffFromList.append(OffFrom)
1711 def btnAdd(self):
1712 global cycles, OffFromList, OffToList, OnFromList, cycles_json
1713 OffFromList.clear()
1714 OffToList.clear()
1715 OnFromList.clear()
1716 OnToList.clear()
1717 alwaysOn.clear()
1718 with open(cycles_file) as file:
1719 cycles_json = json.load(file)
1720 for info in cycles_json:
1721 for c in info['cycles']: cycles = int(c)
1722 for on in info['always on']: alwaysOn.append(on)
1723 for OnTo in info['OnTo']: OnToList.append(OnTo)
1724 for OnFrom in info['OnFrom']: OnFromList.append(OnFrom)
1725 for OffTo in info['OffTo']: OffToList.append(OffTo)
1726 for OffFrom in info['OffFrom']: OffFromList.append(OffFrom)
1727 cycles_json.pop(0)
1728 OnToList.append('00:00')
1729 OnFromList.append('00:00')
1730 OffToList.append('00:00')
1731 OffFromList.append('00:00')
1732 cycles +=1
1733 cycles_json.append({
1734 "cycles": [str(cycles)],
1735 "always on": [alwaysOn[0]],
1736 "OnTo": OnToList,
1737 "OnFrom": OnFromList,
1738 "OffTo": OffToList,
1739 "OffFrom": OffFromList
1740 })
1741 with open(cycles_file, mode='w+', encoding='utf-8') as file:
1742 json.dump(cycles_json, file, ensure_ascii=True, indent=4)
1743 OffFromList.clear()
1744 OffToList.clear()
1745 OnFromList.clear()
1746 OnToList.clear()
1747 alwaysOn.clear()
1748 with open(cycles_file) as file:
1749 cycles_json = json.load(file)
1750 for info in cycles_json:
1751 for c in info['cycles']: ycles = int(c)
1752 for on in info['always on']: alwaysOn.append(on)
1753 for OnTo in info['OnTo']: OnToList.append(OnTo)
1754 for OnFrom in info['OnFrom']: nFromList.append(OnFrom)
1755 for OffTo in info['OffTo']: OffToList.append(OffTo)
1756 for OffFrom in info['OffFrom']: OffFromList.append(OffFrom)
1757 self.clearLayout(self.grid)
1758 self.grid.addWidget(self.lay(), 1, 0)
1759 def submit(self):
1760 global cycles, OffFromList, OffToList, OnFromList, onToList, cycles_json, all_textboxes
1761 for i, j in enumerate(all_textboxes):
1762 temp = j.text()
1763 temp = temp.replace(' ', '')
1764 temp = temp.lower()
1765 rx = re.compile(r"^((2[0-3]|[01][1-9]|10):([0-5][0-9]))$")
1766 if not rx.match(j.text()):
1767 QMessageBox.warning(self, 'Format error!', f"Text box number: {i}\n\"{j.text()}\" is incorrect\n\nYou don't have the correct format!\n\nThe correct format should look like:\n02:57 or 23:01.", QMessageBox.Ok, QMessageBox.Ok)
1768 return
1769 self.delete_save_saveCycles()
1770 self.close()
1771class IpCamLogin(QWidget):
1772 def __init__(self, parent = None):
1773 super(IpCamLogin, self).__init__(parent)
1774 self.setWindowTitle('IP Camera')
1775 self.grid = QGridLayout()
1776
1777 self.textURL = QLineEdit(ip_cam_url[0], self)
1778 self.textUserName = QLineEdit(ip_cam_usrname[0], self)
1779 self.textPassword = QLineEdit(ip_cam_pswd[0], self)
1780
1781 self.lblURL = QLabel('URL:',self)
1782 self.lblUsrname = QLabel('Username:',self)
1783 self.lblpswrd = QLabel('Password:',self)
1784
1785 self.btnSubmit = QPushButton('Submit', self)
1786 self.btnSubmit.clicked.connect(self.submit)
1787
1788 self.grid.addWidget(self.lblURL,0,0)
1789 self.grid.addWidget(self.textURL,1,0)
1790 self.grid.addWidget(self.lblUsrname,2,0)
1791 self.grid.addWidget(self.textUserName,3,0)
1792 self.grid.addWidget(self.lblpswrd,4,0)
1793 self.grid.addWidget(self.textPassword,5,0)
1794 self.grid.addWidget(self.btnSubmit,6,0)
1795 self.horiz = QHBoxLayout(self)
1796 self.horiz.addLayout(self.grid)
1797 self.setLayout(self.horiz)
1798 def submit(self):
1799 global saved_color, auto_start_server, ip, send_email, cap_screen, record_video, smiley_face, dark_mode, email_delay, picture_delay, saved_color, settings_json, button_css, selected_data_index, face_detect, email_address, ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
1800 settings_json.pop(0)
1801 settings_json.append({
1802 "saved color": [saved_color[0], saved_color[1], saved_color[2]],
1803 "capture screen": [cap_screen[0]],
1804 "record video": [record_video[0]],
1805 "smiley face": [smiley_face[0]],
1806 "dark mode": [dark_mode[0]],
1807 "send email": [send_email[0]],
1808 "email delay": [email_delay[0]],
1809 "picture delay": [picture_delay[0]],
1810 "selected data index": [selected_data_index[0]],
1811 "face detect":[face_detect[0]],
1812 "email address": [email_address[0]],
1813 "server auto start": [auto_start_server[0]],
1814 "host address": [ip[0]],
1815 "IP Camera URL": [self.textURL.text()],
1816 "IP Camera Username": [self.textUserName.text()],
1817 "IP Camera Password": [self.textPassword.text()],
1818 "is IP Camera on": [is_ip_cam_on[0]]
1819 })
1820 with open(settings_file, mode='w+', encoding='utf-8') as file: json.dump(settings_json, file, ensure_ascii=True, indent=4, sort_keys=False)
1821 with open(settings_file) as file:
1822 saved_color.clear()
1823 send_email.clear()
1824 cap_screen.clear()
1825 record_video.clear()
1826 smiley_face.clear()
1827 dark_mode.clear()
1828 email_delay.clear()
1829 picture_delay.clear()
1830 selected_data_index.clear()
1831 face_detect.clear()
1832 email_address.clear()
1833 auto_start_server.clear()
1834 ip_cam_url.clear()
1835 ip_cam_usrname.clear()
1836 ip_cam_pswd.clear()
1837 is_ip_cam_on.clear()
1838 ip.clear()
1839 settings_json = json.load(file)
1840 for info in settings_json:
1841 for ind in info['selected data index']: selected_data_index.append(ind)
1842 for dark in info['dark mode']: dark_mode.append(dark)
1843 for face in info['face detect']: face_detect.append(face)
1844 for color in info['saved color']: saved_color.append(color)
1845 for video in info['record video']: record_video.append(video)
1846 for smile in info['smiley face']: smiley_face.append(smile)
1847 for email in info['email address']: email_address.append(email)
1848 for screen in info['capture screen']: cap_screen.append(screen)
1849 for email_b in info['send email']: send_email.append(email_b)
1850 for email_d in info['email delay']: email_delay.append(email_d)
1851 for picture in info['picture delay']: picture_delay.append(picture)
1852 for autostart in info['server auto start']: auto_start_server.append(autostart)
1853 for ipaddress in info['host address']: ip.append(ipaddress)
1854 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
1855 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
1856 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
1857 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
1858 # exit_handler()
1859 self.close()
1860def exit_handler():
1861 running = False
1862 camera1.end_cam()
1863 camera1.cap.release()
1864 camera2.end_cam()
1865 camera2.cap.release()
1866 cv2.destroyAllWindows()
1867 sys.exit()
1868def start_server():
1869 appWeb.run(host=str(ip[0]), port='5000', debug=True, threaded=True, use_reloader=False)
1870 threading.Thread(target=generate).start()
1871def get_cam_image():
1872 global ip_cam_url, ip_cam_usrname, ip_cam_pswd, is_ip_cam_on
1873 url = ip_cam_url[0]
1874 username = ip_cam_usrname[0]
1875 password = ip_cam_pswd[0]
1876 filename = 'Pics/video_feed.jpg'
1877 try:
1878 r = requests.get(url, auth=(username,password))
1879 if r.status_code == 200:
1880 with open(filename, 'wb') as out:
1881 for bits in r.iter_content(): out.write(bits)
1882 return True
1883 except Exception as e:
1884 print('1819' + e)
1885 return False
1886if __name__ == '__main__':
1887 atexit.register(exit_handler)
1888 if not os.path.exists('Pics'): os.mkdir('Pics')
1889 if not os.path.exists(cycles_file) or os.stat(settings_file).st_size == 0:
1890 file = open(cycles_file, "w+")
1891 file.write('''[{
1892 "cycles": [
1893 "5"
1894 ],
1895 "always on": [
1896 "False"
1897 ],
1898 "OnTo": [
1899 "01:01",
1900 "11:30",
1901 "15:05",
1902 "17:45",
1903 "20:15"
1904 ],
1905 "OnFrom": [
1906 "08:30",
1907 "12:55",
1908 "15:30",
1909 "19:30",
1910 "23:59"
1911 ],
1912 "OffTo": [
1913 "08:30",
1914 "12:55",
1915 "15:30",
1916 "19:30",
1917 "01:00"
1918 ],
1919 "OffFrom": [
1920 "11:30",
1921 "15:05",
1922 "17:45",
1923 "20:15",
1924 "01:01"
1925 ]
1926 }]''')
1927 file.close()
1928 with open(cycles_file) as file:
1929 cycles_json = json.load(file)
1930 for info in cycles_json:
1931 for c in info['cycles']: cycles = int(c)
1932 for on in info['always on']: alwaysOn.append(on)
1933 for OnTo in info['OnTo']: OnToList.append(OnTo)
1934 for OnFrom in info['OnFrom']: OnFromList.append(OnFrom)
1935 for OffTo in info['OffTo']: OffToList.append(OffTo)
1936 for OffFrom in info['OffFrom']: OffFromList.append(OffFrom)
1937 if not os.path.exists(settings_file) or os.stat(settings_file).st_size == 0:
1938 file = open(settings_file, "w+")
1939 file.write('''[{
1940 "saved color":["0", "0", "255"],
1941 "capture screen": ["False"],
1942 "record video": ["False"],
1943 "smiley face": ["False"],
1944 "dark mode": ["0"],
1945 "send email": ["False"],
1946 "email delay": ["15"],
1947 "picture delay": ["5"],
1948 "selected data index": ["7"],
1949 "face detect": ["True"],
1950 "email address": [""],
1951 "server auto start":["False"],
1952 "host address": ["''' + str(socket.gethostbyname(socket.gethostname())) + '''"],
1953 "is IP Camera on": ["False"],
1954 "IP Camera URL": ["127.0.0.1"],
1955 "IP Camera Username": ["admin"],
1956 "IP Camera Password": ["password"]
1957 }]''')
1958 file.close()
1959 with open(settings_file) as file:
1960 settings_json = json.load(file)
1961 for info in settings_json:
1962 for ind in info['selected data index']: selected_data_index.append(ind)
1963 for dark in info['dark mode']: dark_mode.append(dark)
1964 for face in info['face detect']: face_detect.append(face)
1965 for color in info['saved color']: saved_color.append(color)
1966 for video in info['record video']: record_video.append(video)
1967 for smile in info['smiley face']: smiley_face.append(smile)
1968 for email in info['email address']: email_address.append(email)
1969 for screen in info['capture screen']: cap_screen.append(screen)
1970 for email_b in info['send email']: send_email.append(email_b)
1971 for email_d in info['email delay']: email_delay.append(email_d)
1972 for picture in info['picture delay']: picture_delay.append(picture)
1973 for autostart in info['server auto start']: auto_start_server.append(autostart)
1974 for ipaddress in info['host address']: ip.append(ipaddress)
1975 for ipcamurl in info['IP Camera URL']: ip_cam_url.append(ipcamurl)
1976 for ipcamusr in info['IP Camera Username']: ip_cam_usrname.append(ipcamusr)
1977 for ipcampsrw in info['IP Camera Password']: ip_cam_pswd.append(ipcampsrw)
1978 for ipcamison in info ['is IP Camera on']: is_ip_cam_on.append(ipcamison)
1979 button_css = 'background-color: rgb(' + str(saved_color[0]) + ', ' + str(saved_color[1]) + ', ' + str(saved_color[2]) + ')'
1980 app = QApplication(sys.argv)
1981 if dark_mode[0] == '1':
1982 app.setStyle("Fusion")
1983 palette = QPalette()
1984 gradient = QLinearGradient(0, 0, 0, 400)
1985 gradient.setColorAt(0.0, QColor(40, 40, 40))
1986 gradient.setColorAt(1.0, QColor(30, 30, 30))
1987 palette.setBrush(QPalette.Window, QBrush(gradient))
1988 palette.setColor(QPalette.WindowText, Qt.white)
1989 palette.setColor(QPalette.Base, QColor(25, 25, 25))
1990 palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
1991 palette.setColor(QPalette.ToolTipBase, Qt.white)
1992 palette.setColor(QPalette.ToolTipText, Qt.white)
1993 palette.setColor(QPalette.Text, Qt.white)
1994 palette.setColor(QPalette.Button, QColor(30, 30, 30))
1995 palette.setColor(QPalette.ButtonText, Qt.white)
1996 palette.setColor(QPalette.BrightText, Qt.red)
1997 palette.setColor(QPalette.Link, QColor(42, 130, 218))
1998 palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
1999 palette.setColor(QPalette.HighlightedText, Qt.black)
2000 app.setPalette(palette)
2001 elif dark_mode[0] == '2':
2002 app.setStyle("Fusion")
2003 app.setPalette(QApplication.style().standardPalette())
2004 palette = QPalette()
2005 gradient = QLinearGradient(0, 0, 0, 400)
2006 gradient.setColorAt(0.0, QColor(240, 240, 240))
2007 gradient.setColorAt(1.0, QColor(215, 215, 215))
2008 palette.setColor(QPalette.ButtonText, Qt.black)
2009 palette.setBrush(QPalette.Window, QBrush(gradient))
2010 app.setPalette(palette)
2011 if auto_start_server[0] == "True": threading.Thread(target=start_server).start()
2012 main = MainMenu()
2013 main.show()
2014 sys.exit(app.exec_())