From: xf0r3m Date: Sat, 25 May 2024 17:05:36 +0000 (+0200) Subject: Dalszy rozwój. X-Git-Url: https://gitweb.morketsmerke.org/?a=commitdiff_plain;h=5472b33b0b500ccafb105170a0c417ffaf605d33;p=ML.git Dalszy rozwój. 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. --- diff --git a/db.py b/db.py index 8508a53..d6ce15f 100755 --- 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() diff --git a/window.py b/window.py index ca62ee6..5aa8ebf 100755 --- 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('<>', 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)