...come avrai certamente capito sono un autodidatta ma con tanta voglia di imparare.
Si, l'avevo immaginato e valutato che stai cercando di darTi da fare, mi ricordi me stesso un po' di tempo fa ... intanto rispondiamo al quesito che hai posto, ossia :
come ricavare ed esporre i dati selezionati nella Treeview?Per farlo devi intercettare l'evento di variazione della selezione nell'ambito della tabella (fare il
binding, in gergo) e definire una funzione di callback che effettui le opportune operazioni, ieri ho cominciato a scrivere un breve esempio, da poco concluso, che simula la tabella da Te prodotta, ed alcuni controlli dati e reagisce al cambio di selezione, per i dati ho creato un file di testo riportante alcuni dei dati da Te esposti:
NzP:~$ cat dati
8888;Mirco;2023-01-21 12:56:49;;;2023-01-21 12:56:54;C;;
7777;Andrea;2023-01-21 13:01:19;;;2023-01-21 13:01:25;C;;
545;Andrea;2023-01-21 13:16:59;2023-01-21 13:17:30;2023-01-21 13:17:30;2023-01-21 13:17:38;C;;Riavviato
654;Mirko;0000-00-00 00:00:00;;;0000-00-00 00:00:00;C;;
909;Andrea;0000-00-00 00:00:00;2023-01-22 22:25:10;2023-01-22 22:25:19;0000-00-00 00:00:00;C;;Riavviato
333;Mirko;0000-00-00 00:00:00;2023-01-22 22:42:12;2023-01-22 22:42:20;0000-00-00 00:00:00;C;;Riavviato
444;Mirko;0000-00-00 00:00:00;2023-01-22 22:53:45;2023-01-22 22:54:19;0000-00-00 00:00:00;C;;Riavviato
222;Mirko;0000-00-00 00:00:00;;;0000-00-00 00:00:00;A;;
1111;;2023-01-23 00:23:07;2023-01-23 00:30:38;2023-01-23 00:30:52;2021-01-23 00:27:13;R;;Riavviato
5555;Stefano;23-01-2023 00:40:27;;;23-01-2023 00:40:44;C;;
NzP:~$
Tale file che ho denominato "dati", senza estensione (in linux non serve), copiati i dati nella direttrice da dove lancerai lo script per fare la prova, se nomini diversamente il file adegua nella funzione "on_data"
Lo scrip esemplificativo è questo:
# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk
col_ref = [['numero_commessa', 'Commessa', 80], ['meccanico', 'Meccanico', 100],
['inizio_lavoro', 'Iniziato', 160], ['pausa_lavoro', 'Pausa', 160],
['riavvio_lavoro', 'Riavviato', 160], ['fine_lavoro', 'Finito', 160],
['stato', 'Stato', 60], ['durata', 'Tempo Totale\nriparazione', 120],
['note', 'Informazioni sulla lavorazione', 520]]
# funzioni di callback
def on_data(evt=None): # carica i dati da un file di testo
with open('dati') as f:
data = f.readlines()
mecc = []
for r in data:
vals = r.rstrip('\n').split(';')
mecc.append(vals[1])
tbl.insert('', tk.END, values=vals)
mecc = sorted(list(set(mecc)))
cmb_mecc['values'] = mecc
cmb:mecc.select_set(0)
bt_data.configure(state='disabled')
def on_select(evt): # espone i dati selezionati nella treeview
#print(tbl.item(tbl.focus()))
data = tbl.item(tbl.focus())['values']
if not data: return
e_comm.delete(0, tk.END)
e_comm.insert(tk.END, str(data[0]))
v_state.set(data[6])
e_date.delete(0, tk.END)
match data[6]:
case 'A':
e_date.insert(tk.END, data[2])
case 'P':
e_date.insert(tk.END, data[3])
case 'R':
e_date.insert(tk.END, data[4])
case 'C':
e_date.insert(tk.END, data[5])
case _:
pass
cmb_mecc.set(data[1])
e_note.delete(0, tk.END)
e_note.insert(tk.END, data[8])
# sbrigativa creazione della GUI
root = tk.Tk()
cols = [x[0] for x in col_ref] # se oscuro vedere le comprehension's
tbl = ttk.Treeview(root, columns=cols, show='headings',
height=10, selectmode='browse')
tbl.heading('#0', text='\n\n')
tbl.grid(row=0, column=0, sticky='nsew')
for c in col_ref:
if c[0] != 'note':
tbl.heading(c[0], text=c[1])
tbl.column(c[0], width=c[2], anchor='c', stretch=tk.NO)
else:
tbl.heading(c[0], text=c[1])
tbl.column(c[0], minwidth=c[2], anchor='c')
vscroll = ttk.Scrollbar(root, orient=tk.VERTICAL, command=tbl.yview)
vscroll.grid(row=0, column=1, sticky='ns')
tbl.configure(yscrollcommand=vscroll.set)
hscroll = ttk.Scrollbar(root, orient=tk.HORIZONTAL, command=tbl.xview)
hscroll.grid(row=1, column=0, sticky='ew')
tbl.configure(xscrollcommand=hscroll.set)
pn_data = tk.Frame(root) # pannello per dati
pn_data.grid(row=2, column=0, columnspan=2, sticky='ew')
lbl = tk.Label(pn_data, text='Commessa :')
lbl.grid(row=0, column=0, padx=6, pady=6, sticky='w')
e_comm = tk.Entry(pn_data, width=5)
e_comm.grid(row=0, column=1, padx=6, pady=6, sticky='w')
lbl = tk.Label(pn_data, text='Stato :')
lbl.grid(row=0, column=2, padx=6, pady=6, sticky='w')
v_state = tk.StringVar(root)
r_a = tk.Radiobutton(pn_data, text='Aperta', variable=v_state, value='A')
r_a.grid(row=0, column=3, padx=6, pady=6, sticky='w')
r_p = tk.Radiobutton(pn_data, text='Pausa', variable=v_state, value='P')
r_p.grid(row=0, column=4, padx=6, pady=6, sticky='w')
r_r = tk.Radiobutton(pn_data, text='Riavviata', variable=v_state, value='R')
r_r.grid(row=0, column=5, padx=6, pady=6, sticky='w')
r_c = tk.Radiobutton(pn_data, text='Chiusa', variable=v_state, value='C')
r_c.grid(row=0, column=6, padx=6, pady=6, sticky='w')
e_date = tk.Entry(pn_data, width=22)
e_date.grid(row=0, column=7, padx=6, pady=6, sticky='w')
lbl = tk.Label(pn_data, text='Meccanico :')
lbl.grid(row=0, column=8, padx=6, pady=6, sticky='w')
cmb_mecc = ttk.Combobox(pn_data, state='ReadOnly')
cmb_mecc.grid(row=0, column=9, padx=6, pady=6, sticky='w')
lbl = tk.Label(pn_data, text='Note :')
lbl.grid(row=0, column=10, padx=6, pady=6, sticky='w')
e_note = tk.Entry(pn_data, width=22)
e_note.grid(row=0, column=11, padx=6, pady=6, sticky='ew')
pn_data.grid_columnconfigure(11, weight=1)
pn_cmd = tk.Frame(root) # pannello per pulsanti comando
pn_cmd.grid(row=3, column=0, columnspan=2, sticky='ew')
bt_data = tk.Button(pn_cmd, text='Carica dati', command=on_data)
bt_data.grid(row=0, column=0, padx=6, pady=6, sticky='ew')
bt_close = tk.Button(pn_cmd, text='Chiudi programma', command=root.destroy)
bt_close.grid(row=0, column=1, padx=6, pady=6, sticky='ew')
pn_cmd.grid_columnconfigure(0, weight=1, uniform='a')
pn_cmd.grid_columnconfigure(1, weight=1, uniform='a')
tbl.bind('<<TreeviewSelect>>', on_select) # binding cambio di selezione
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)
root.mainloop()
Prevede il caricamento dati tramite la pressione del pulsante "Carica dati" (non è bene mischiare logica di visualizzazione con logica dati) ed una volta che i dati saranno caricati il cambio di selezione invocherà la funzione di callback "on_select" che provvederà ad invocare l'item di riga selezionato ed a operare sui dati.
L'item selezionato è un dizionario
============ RESTART: /home/nuzzopippo/src/posts/ibooms/esempio_01.py ===========
{'text': '', 'image': '', 'values': [654, 'Mirko', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', 'C', '', ''], 'open': 0, 'tags': ''}
vi è un print commentato nella funzione, inserito per mostrarTi cosa stai trattando, del dizionario interessano i dati della chiave "values" che vengono letti ed interpretare per decidere quali dati mostrare. In particolare, viene mostrata la sola data associata allo stato della commessa.
Spero Ti sia utile.
.... hai qualche miglioria da consigliarmi a riguardo?
... sig ... da dove comincio?
@iBooma, stai iniziando a studiare python apparentemente digiuno su ben due argomenti complessi (interfacce grafiche e database relazionali), prescindendo dalle cognizioni design applicativo non valutabili, temo Ti aspettino numerosi momenti di frustrazione.
Ti posso solo suggerire di non aver fretta a "produrre" ed acquisire quanto meglio Ti riesce le basi del linguaggio con particolare riferimento alle classi, reputo la programmazione funzionale un patter inadeguato alle GUI, la OOP è quasi obbligata per esse.
Poi, studiati bene i dati che vuoi gestire, se sono le Tue procedure ad aver registrato quei dati devi affinare la logica, non è ammissibile una chiusura antecedente una ripresa (vedi commessa 1111) o una data di inizio non impostata ... non parliamo dei meccanici mancanti

Comunque, per quel che si può si è qua