Grazie a tutti.
Per Acquafresca: nessuna novità.
Continuo a sperare in un programmino python per i biambi o più.
Ciao Cinzia, io ho questo fatto con IA, potrebbe essere una partenza e magari anche migliorarlo se puo' interessarti sicuramente da migliorarlo:
import sys, os, csv
from itertools import combinations
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
QHBoxLayout, QLabel, QPushButton, QGroupBox,
QTableWidget, QTableWidgetItem, QHeaderView,
QGridLayout, QSpinBox, QProgressBar, QTextEdit,
QDoubleSpinBox, QComboBox)
from PySide6.QtCore import Qt
from PySide6.QtGui import QColor
class AmbyPredictorV122(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("

AMBY PRO v12.2 - SUPER CONTRAST")
self.resize(1600, 950)
self.csv_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "estrazioni.csv")
self.ruote_nomi = ["Bari", "Cagliari", "Firenze", "Genova", "Milano", "Napoli", "Palermo", "Roma", "Torino", "Venezia", "Nazionale"]
self.setStyleSheet("""
QMainWindow { background-color: #0d0f17; }
QWidget { color: #ffffff; font-family: 'Segoe UI'; font-size: 14px; }
QGroupBox { border: 2px solid #7aa2f7; border-radius: 8px; color: #7aa2f7; font-weight: bold; }
QComboBox, QDoubleSpinBox { background-color: #1f2335; border: 1px solid #7aa2f7; color: white; min-height: 35px; }
#BtnReal { background-color: #00ff9f; color: #0d0f17; font-weight: bold; height: 50px; font-size: 16px; }
#DataNeon { color: #00ff9f; font-family: 'Consolas'; font-weight: bold; font-size: 18px; border: 2px solid #00ff9f; padding: 10px; background: #000; }
QTableWidget {
background-color: #ffffff;
gridline-color: #000000;
color: #000000;
selection-background-color: #7aa2f7;
}
QHeaderView::section {
background-color: #1f2335;
color: #ffffff;
font-weight: bold;
height: 35px;
}
""")
main_widget = QWidget(); self.setCentralWidget(main_widget)
layout = QVBoxLayout(main_widget)
header = QHBoxLayout()
header.addWidget(QLabel("

GENERATORE PREVISIONI - STABILE"))
header.addStretch()
self.label_data = QLabel("DATA: -"); self.label_data.setObjectName("DataNeon")
header.addWidget(self.label_data); layout.addLayout(header)
content = QHBoxLayout()
sidebar = QVBoxLayout()
g1 = QGroupBox("1. RUOTA FOCUS"); l1 = QVBoxLayout(g1)
self.combo_ruota = QComboBox(); self.combo_ruota.addItems(self.ruote_nomi)
l1.addWidget(self.combo_ruota); sidebar.addWidget(g1)
g2 = QGroupBox("2. RANGE IC"); l2 = QGridLayout(g2)
self.ic_min = QDoubleSpinBox(); self.ic_min.setRange(0.1, 9.9); self.ic_min.setValue(1.15)
self.ic_max = QDoubleSpinBox(); self.ic_max.setRange(0.1, 9.9); self.ic_max.setValue(1.45)
l2.addWidget(QLabel("Min:"), 0, 0); l2.addWidget(self.ic_min, 0, 1)
l2.addWidget(QLabel("Max:"), 1, 0); l2.addWidget(self.ic_max, 1, 1)
sidebar.addWidget(g2)
self.btn_prevedi = QPushButton("

GENERA PREVISIONE REALE"); self.btn_prevedi.setObjectName("BtnReal")
self.btn_prevedi.clicked.connect(self.genera_previsione)
sidebar.addWidget(self.btn_prevedi)
self.pbar = QProgressBar(); sidebar.addWidget(self.pbar)
self.results_box = QTextEdit(); self.results_box.setStyleSheet("background: #000; color: #00ff9f;"); sidebar.addWidget(self.results_box)
content.addLayout(sidebar, 1)
self.table = QTableWidget(0, 7)
self.table.setHorizontalHeaderLabels(["AMBO", "RITARDO", "MAX", "DIST", "IC", "POWER", "STATUS"])
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
content.addWidget(self.table, 4); layout.addLayout(content)
self.aggiorna_label_data()
def aggiorna_label_data(self):
if os.path.exists(self.csv_path):
with open(self.csv_path, 'r', encoding='latin1') as f:
lines = f.readlines()
if len(lines) > 1:
raw = lines[-1].split(',')[0].replace("'", "").replace("[", "").strip()
self.label_data.setText(f"ULTIMA: {raw}")
def calcola_power(self, ambo, est_rev):
rit, m_rit, c_rit, trov, f_rec = 0, 0, 0, False, 0
for ix, e in enumerate(est_rev):
if set(ambo).issubset(e):
if not trov: rit = ix; trov = True
if ix < 540: f_rec += 1
if c_rit > m_rit: m_rit = c_rit
c_rit = 0
else: c_rit += 1
if c_rit > m_rit: m_rit = c_rit
ic = round(rit / 400.5, 2); pwr = int((rit * ic) + (f_rec * 120))
return pwr, rit, m_rit, ic, f_rec
def genera_previsione(self):
self.table.setRowCount(0); self.results_box.clear()
ruota = self.combo_ruota.currentText(); r_idx = self.ruote_nomi.index(ruota)
mi, ma = self.ic_min.value(), self.ic_max.value()
if not os.path.exists(self.csv_path): return
with open(self.csv_path, 'r', encoding='latin1') as f:
reader = list(csv.reader(f))[1:]
est = [set([int(float(v)) for v in r[1:] if v.strip()][r_idx*5:r_idx*5+5]) for r in reader]
est_rev = est[::-1]; res = []
self.pbar.setMaximum(4005); count = 0
for ambo in combinations(range(1, 91), 2):
pwr, rit, m_rit, ic, f_rec = self.calcola_power(ambo, est_rev)
if mi <= ic <= ma:
res.append([f"{ambo[0]}-{ambo[1]}", rit, m_rit, m_rit-rit, ic, pwr, "TARGET"])
count += 1
if count % 100 == 0: self.pbar.setValue(count)
res.sort(key=lambda x: x[5], reverse=True)
for r in res[:40]:
row = self.table.rowCount(); self.table.insertRow(row)
for c in range(7):
item = QTableWidgetItem(str(r[c]))
item.setTextAlignment(Qt.AlignCenter)
item.setForeground(QColor("#000000"))
self.table.setItem(row, c, item)
self.pbar.setValue(4005)
self.results_box.append(f"

Analisi conclusa per {ruota}.")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = AmbyPredictorV122()
win.show()
sys.exit(app.exec())