]> gitweb.morketsmerke.org Git - ML.git/commitdiff
Dalszy rozwój.
authorxf0r3m <jakubstasinski@protonmail.com>
Sat, 25 May 2024 17:05:36 +0000 (19:05 +0200)
committerxf0r3m <jakubstasinski@protonmail.com>
Sat, 25 May 2024 17:05:41 +0000 (19:05 +0200)
Dodanie sekcji logowania, obsługa sekcji wyszukiwania, połączenie sekcji wyszukiwania z sekcją
logowania. Dodanie przycisków czyszczenia pól. Dodanie obsługi logowania. Dodanie wyświetlania logów osobnym oknie.

db.py
window.py

diff --git a/db.py b/db.py
index 8508a53a5459dad1f4b79bc8050c3bcff0e9a1aa..d6ce15fee18fe022f50a7b9f6ec1783c992da629 100755 (executable)
--- a/db.py
+++ b/db.py
@@ -30,11 +30,15 @@ def loadDataFromPAcom(pacomList):
 def checkData(phrase, pType, sqlTable):
   con = sqlite3.connect("ml-logs.db")
   cur = con.cursor()
-  if pType:
-    res = cur.execute(f"SELECT * FROM {sqlTable} WHERE sign = '{phrase}'")
+  if sqlTable == 'logs':
+    res = cur.execute(f"SELECT * FROM logs WHERE logger = '{phrase}'")
+    result = res
   else:
-    res = cur.execute(f"SELECT * FROM {sqlTable} WHERE name = '{phrase}'")
-  result = res.fetchone()
+    if pType:
+      res = cur.execute(f"SELECT * FROM {sqlTable} WHERE sign = '{phrase}'")
+    else:
+      res = cur.execute(f"SELECT * FROM {sqlTable} WHERE name = '{phrase}'")
+    result = res.fetchone()
   #print(result)
   return result
   con.close()
@@ -65,3 +69,10 @@ def updateLoggerData(phrase,sign,name,lat,lon):
     cur.execute(f"UPDATE logger SET sign = '{sign}', name = '{name}', lat = {lat}, lon = {lon} WHERE name = '{phrase}'")
   con.commit()
   con.close()
+
+def saveLog(logger, sign, name, rst, dt, eq, ch):
+  con = sqlite3.connect('ml-logs.db')
+  cur = con.cursor()
+  cur.execute(f"INSERT INTO logs VALUES ('{logger}', '{sign}', '{name}', '{rst}', '{dt}', '{eq}', '{ch}')")
+  con.commit()
+  con.close()
index ca62ee6237af0ad9a9d7d454d3f110dd99dd79bc..5aa8ebf478154a3168a1409d0a7b2a68b089d522 100755 (executable)
--- a/window.py
+++ b/window.py
@@ -4,6 +4,8 @@
 
 from tkinter import *  
 from tkinter import ttk
+from datetime import datetime
+from tkinter.messagebox import showinfo
 import re, db, pa_com
 
 """
@@ -21,21 +23,34 @@ def csCHandler(arg1):
   csTypeLabel=ttk.Label(csFrame, text=csCLValue.get())
   csTypeLabel.grid(column=2, row=0, padx=5)
   """
-def alertWindow(msg):
-  alert = Toplevel(root)
-  alert.title('Mike Lima')
-  #icon = PhotoImage(file="ml-windowicon.png")
-  #alert.call('wm','iconphoto', alert._w, icon)
-  alert.geometry('200x150')
-  mainFrame=ttk.Frame(alert)
-  alertMsg=ttk.Label(mainFrame, text=msg, justify="center", wraplength=195)
-  alertBtn=ttk.Button(mainFrame, text="OK", command=alert.destroy, width=4)
-  mainFrame.grid(column=0, row=0)
-  alertMsg.grid(column=0, row=0, padx=5, pady=5, sticky="ew")
-  alertBtn.grid(column=0, row=1, padx=5, pady=5, sticky="ew")
-  alert.columnconfigure(1, weight=1)
-  alert.rowconfigure(1, weight=1)
-  root.wait_window(alert)
+def logsWindow():
+  logger=csValue.get()
+  logs = Toplevel(root)
+  logs.title('Mike Lima - Logi')
+  logs.geometry('640x240')
+  columns = ('logger', 'sign', 'name', 'rst', 'dt', 'eq', 'ch')
+  tree = ttk.Treeview(logs, columns=columns, show='headings')
+  tree.heading('logger', text="Logujący:")
+  tree.column('logger', minwidth=0, width=75, stretch=NO)
+  tree.heading('sign', text="Znak:")
+  tree.column('sign', minwidth=0, width=60, stretch=NO)
+  tree.heading('name', text="Nazwa:")
+  tree.column('name', minwidth=0, width=100, stretch=NO)
+  tree.heading('rst', text="Raport:")
+  tree.column('rst', minwidth=0, width=60, stretch=NO)
+  tree.heading('dt', text="Data/Czas:")
+  tree.column('dt', minwidth=0, width=130, stretch=NO)
+  tree.heading('eq', text="Radio:")
+  tree.column('eq', minwidth=0, width=65, stretch=NO)
+  tree.heading('ch', text="Kanał:")
+  tree.column('ch', minwidth=0, width=65, stretch=NO)
+  logsRes=db.checkData(logger, db.isSignOrName(logger), 'logs')
+  for row in logsRes:
+    tree.insert('', END, values=row)
+  tree.grid(column=0, row=0, sticky="nsew")
+  scrollbar = ttk.Scrollbar(logs, orient=VERTICAL, command=tree.yview)
+  scrollbar.grid(column=1, row=0, sticky="ns")
+  root.wait_window(logs)
 
 def fillLoggerData(sign, name, lat, lon):
   loggerSignEntry.insert(0, sign)
@@ -73,14 +88,15 @@ def loadLoggerInfo():
         if not pacomTest == None:
            loadLoggerInfo()
         else:
-          alertWindow('Nie pobrano danych z planawaryjny.com')
+          showwarning(title='Mike Lima', message='Nie pobrano danych z planawaryjny.com')
+          #alertWindow('Nie pobrano danych z planawaryjny.com')
           logger=db.checkData(phrase, db.isSignOrName(phrase), 'logger')
           if not logger == None:
             fillLoggerData(logger[0], logger[1], logger[2], logger[3])
           else:
             fillDbWithNewLoggerData(phrase)
     else:
-      alertWindow('Baza danych nie istnieje!\nZostanie utworzona nowa.\nZostaną załadowane dane ze strony planawaryjny.com, co może chwilę potrwać.')
+      showinfo(title="Mike Lima", message='Baza danych nie istnieje!\nZostanie utworzona nowa.\nZostaną załadowane dane ze strony planawaryjny.com, co może chwilę potrwać.')
       db.dbNotFound()
       pCL=[]
       pa_com.getDataFromPAcom(pCL)
@@ -91,7 +107,7 @@ def loadLoggerInfo():
         db.updateLoggerData(phrase, pacom[0], pacom[1], pacom[2], pacom[3])
         fillLoggerData(pacom[0], pacom[1], pacom[2], pacom[3])
       else:
-        alertWindow('Nie znaleziono podanej frazy\nw bazie planawaryjny.com')
+        showwarning(title="Mike Lima", message='Nie znaleziono podanej frazy\nw bazie planawaryjny.com')
         fillDbWithNewLoggerData(phrase)
   else:
     if db.isDatabaseExist():
@@ -101,7 +117,7 @@ def loadLoggerInfo():
       else:
         fillDbWithNewLoggerData(phrase)
     else:
-      alertWindow('Baza danych nie istnieje!\nZostanie utworzona nowa.')
+      showinfo(title="Mike Lima", message='Baza danych nie istnieje!\nZostanie utworzona nowa.')
       db.dbNotFound()
       fillDbWithNewLoggerData(phrase)
   
@@ -115,7 +131,7 @@ def saveLoggerInfo():
   logger=db.checkData(phrase, db.isSignOrName(phrase), 'logger')
   if not logger == None: 
     db.updateLoggerData(phrase, sign, name, lat, lon)
-    alertWindow('Dane zostały zmienione')
+    showinfo(title="Mike Lima", message='Dane zostały zmienione')
     
 
 def loggerEqHandler(arg1):
@@ -129,9 +145,66 @@ def loggerEqHandler(arg1):
   loggerChLabel.grid(column=2, row=2, padx=5, pady=5)
   loggerChCombo.grid(column=3, row=2, padx=5, pady=5)
 
+def fillLoggingData(logger, sign, name, rst, dt, radio, ch):
+  loginLoggerEntry.insert(0, logger)
+  loginDtEntry.insert(0, dt)
+  loginSignEntry.insert(0, sign)
+  loginNameEntry.insert(0, name)
+  loginRstEntry.insert(0, rst)
+  loginEqEntry.insert(0, radio)
+  loginChEntry.insert(0, ch)
+
 def searchInfo():
-  pass
-    
+  phrase=searchQuery.get()
+  pacom=db.checkData(phrase, db.isSignOrName(phrase), 'pacom')
+  logger = loggerSign.get()
+  radio = loggerEq.get()
+  channel = loggerCh.get()
+  now = datetime.now()
+  
+  if not pacom == None:
+    fillLoggingData(logger, pacom[0], pacom[1], 0, now, radio, channel)
+  else:
+    logged=db.checkData(phrase, db.isSignOrName(phrase), 'logs')
+    if not logged == None:
+       fillLogginData(logged[0], logged[1], logged[2], 0, now, radio, channel)
+    else:
+      if db.isSignOrName(phrase):
+        fillLoggingData(logger, phrase, 'None', 0, now, radio, channel)
+      else:
+        fillLoggingData(logger, 0, phrase, 0, now, radio, channel)
+
+def cleanLoginSection():
+  searchEntry.delete(0, END)
+  loginLoggerEntry.delete(0, END)
+  loginDtEntry.delete(0, END)
+  loginSignEntry.delete(0, END)
+  loginNameEntry.delete(0, END)
+  loginRstEntry.delete(0, END)
+  loginEqEntry.delete(0, END)
+  loginChEntry.delete(0, END)
+
+def cleanLoggerSection():
+  csValueEntry.delete(0, END)
+  checkPA_com.set('0')  
+  loggerSignEntry.delete(0, END)
+  loggerNameEntry.delete(0, END)
+  loggerLatEntry.delete(0, END)
+  loggerLonEntry.delete(0, END)
+
+def saveLogs():
+  logger=loginLogger.get()
+  sign=loginSign.get()
+  name=loginName.get()
+  rst=loginRst.get()
+  dt=loginDt.get()
+  radio=loginEq.get()
+  channel=loginCh.get()
+
+  db.saveLog(logger, sign, name, rst, dt, radio, channel)
+  showinfo(title='Mike Lima', message='Łączność zapisana.')
+
+
 root = Tk()
 root.title('Mike Lima')
 icon = PhotoImage(file="ml-windowicon.png")
@@ -140,7 +213,6 @@ root.iconphoto(True, icon)
 root.geometry('640x480')
 
 content=ttk.Frame(root)
-alert=""
 
 #Frame: Imie/Znak
 csFrame=ttk.LabelFrame(content, text="Imię/(161)ML:", borderwidth=1, relief='groove', width=640, height=32)
@@ -151,7 +223,7 @@ csLogo=PhotoImage(file="ml-sign-32x32.png")
 csImage=ttk.Label(csFrame, image=csLogo)
 csValueEntry=ttk.Entry(csFrame, textvariable=csValue)
 csLoadButton=ttk.Button(csFrame, text="Załaduj", command=loadLoggerInfo)
-csCheckPAChkbox=ttk.Checkbutton(csFrame, text="Pobierz dane z planawaryjny.com", variable=checkPA_com)
+csCheckPAChkbox=ttk.Checkbutton(csFrame, text="Pobierz dane z planawaryjny.com", variable=checkPA_com, onvalue='1', offvalue='0')
 
 csImage.grid(column=1, row=0, padx=10)
 csValueEntry.grid(column=3, row=0, padx=10)
@@ -170,6 +242,7 @@ loggerCh=StringVar()
 loggerSignLabel=ttk.Label(loggerFrame, text="Znak: ")
 loggerSignEntry=ttk.Entry(loggerFrame, textvariable=loggerSign)
 loggerNameLabel=ttk.Label(loggerFrame, text="Nazwa: ")
+loggerLogsButton=ttk.Button(loggerFrame, text="Pokaż logi", command=logsWindow)
 loggerNameEntry=ttk.Entry(loggerFrame, textvariable=loggerName)
 loggerLatLabel=ttk.Label(loggerFrame, text="Lat: ")
 loggerLatEntry=ttk.Entry(loggerFrame, textvariable=loggerLat)
@@ -179,11 +252,13 @@ loggerSaveButton=ttk.Button(loggerFrame, text="Zapisz", command=saveLoggerInfo)
 loggerEqLabel=ttk.Label(loggerFrame, text="Radio: ")
 loggerEqCombo=ttk.Combobox(loggerFrame, textvariable=loggerEq, values=('CB', 'PMR'))
 loggerEqCombo.bind('<<ComboboxSelected>>', loggerEqHandler);
+loggerCleanButton=ttk.Button(loggerFrame, text="Wyczyść", command=cleanLoggerSection) 
 
 loggerSignLabel.grid(column=0, row=0, padx=5, pady=5)
 loggerSignEntry.grid(column=1, row=0, padx=5, pady=5)
 loggerNameLabel.grid(column=2, row=0, padx=5, pady=5)
 loggerNameEntry.grid(column=3, row=0, padx=5, pady=5)
+loggerCleanButton.grid(column=4, row=0, padx=5, pady=5)
 
 loggerLatLabel.grid(column=0, row=1, padx=5, pady=5)
 loggerLatEntry.grid(column=1, row=1, padx=5, pady=5)
@@ -193,18 +268,64 @@ loggerSaveButton.grid(column=4, row=1, padx=5, pady=5)
 
 loggerEqLabel.grid(column=0, row=2, padx=5, pady=5)
 loggerEqCombo.grid(column=1, row=2, padx=5, pady=5)
+loggerLogsButton.grid(column=4, row=2, padx=5, pady=5)
 
 #Frame: Szukaj
-searchFrame=ttk.LabelFrame(content, text="Szukaj:", borderwidth=1, relief='groove', width=640, height=32)
+searchFrame=ttk.LabelFrame(content, text="Szukaj: ", borderwidth=1, relief='groove', width=640, height=32)
 searchQuery=StringVar()
 
 searchEntryLabel=ttk.Label(searchFrame, text="Imię/(161)ML: ")
 searchEntry=ttk.Entry(searchFrame, textvariable=searchQuery)
 searchButton=ttk.Button(searchFrame, text="Szukaj", command=searchInfo)
+cleanButton=ttk.Button(searchFrame, text="Wyczyść", command=cleanLoginSection)
 
 searchEntryLabel.grid(column=0, row=0, padx=5, pady=5)
 searchEntry.grid(column=1, row=0, padx=5, pady=5)
 searchButton.grid(column=2, row=0, padx=5, pady=5)
+cleanButton.grid(column=3, row=0, padx=5, pady=5)
+
+#Frame: Zaloguj
+loginFrame=ttk.LabelFrame(content, text="Zaloguj: ", borderwidth=1, relief='groove', width=640)
+loginLogger=StringVar()
+loginSign=StringVar()
+loginName=StringVar()
+loginRst=StringVar()
+loginDt=StringVar()
+loginEq=StringVar()
+loginCh=StringVar()
+
+loginLoggerLabel=ttk.Label(loginFrame, text="Logujący: ")
+loginLoggerEntry=ttk.Entry(loginFrame, textvariable=loginLogger)
+loginSignLabel=ttk.Label(loginFrame, text="Znak: ")
+loginSignEntry=ttk.Entry(loginFrame, textvariable=loginSign)
+loginNameLabel=ttk.Label(loginFrame, text="Nazwa: ")
+loginNameEntry=ttk.Entry(loginFrame, textvariable=loginName)
+loginRstLabel=ttk.Label(loginFrame, text="RST: ")
+loginRstEntry=ttk.Entry(loginFrame, textvariable=loginRst, width=10)
+loginDtLabel=ttk.Label(loginFrame, text="Data/Czas: ")
+loginDtEntry=ttk.Entry(loginFrame, textvariable=loginDt)
+loginEqLabel=ttk.Label(loginFrame, text="Radio: ")
+loginEqEntry=ttk.Entry(loginFrame, textvariable=loginEq, width=10)
+loginChLabel=ttk.Label(loginFrame, text="Kanał: ")
+loginChEntry=ttk.Entry(loginFrame, textvariable=loginCh, width=10)
+loginButton=ttk.Button(loginFrame, text="Zaloguj", command=saveLogs)
+
+loginLoggerLabel.grid(column=0, row=0, padx=5, pady=5)
+loginLoggerEntry.grid(column=1, row=0, padx=5, pady=5)
+loginDtLabel.grid(column=2, row=0, padx=5, pady=5)
+loginDtEntry.grid(column=3, row=0, padx=5, pady=5)
+loginSignLabel.grid(column=0, row=1, padx=5, pady=5)
+loginSignEntry.grid(column=1, row=1, padx=5, pady=5)
+loginNameLabel.grid(column=2, row=1, padx=5, pady=5)
+loginNameEntry.grid(column=3, row=1, padx=5, pady=5)
+loginRstLabel.grid(column=0, row=3, padx=5, pady=5)
+loginRstEntry.grid(column=1, row=3, padx=5, pady=5)
+loginEqLabel.grid(column=0, row=2, padx=5, pady=5)
+loginEqEntry.grid(column=1, row=2, padx=5, pady=5)
+loginChLabel.grid(column=2, row=2, padx=5, pady=5)
+loginChEntry.grid(column=3, row=2, padx=5, pady=5)
+loginButton.grid(column=3, row=3, padx=5, pady=5)
+
 
 #Frame image: https://www.flaticon.com/free-icon/emergency-sign_2061966?term=emergency+sign&related_id=2061966
 
@@ -217,6 +338,7 @@ content.grid(column=0, row=0)
 csFrame.grid(column=0, row=0, padx=15, sticky="ew")
 loggerFrame.grid(column=0, row=1, padx=15, sticky="ew")
 searchFrame.grid(column=0, row=2, padx=15, sticky="ew")
+loginFrame.grid(column=0, row=3, padx=15, sticky="ew")
 
 root.columnconfigure(1, weight=1)
 root.rowconfigure(1, weight=1)