Il programma non cancella e non si resetta correttamente

di il
0 risposte

Il programma non cancella e non si resetta correttamente

Ho iniziato a lavorare su un progetto con Tkinter, il programma dovrebbe caricare elementi da due file di testo, “direzioni.txt” e “strutture.txt”, per poi mostrarli con delle checkbox accanto, se poi si selezionano suddetti valori, un pulsante “cancella” dovrebbe cancellarli. Un pulsante “reset” il programma dovrebbe tornare allo stato iniziale. Ci sono anche altre funzioni che non ho menzionato ma non sono rilevanti per la risoluzione del problema. I problemi effettivi sono due: il primo occorre quando premo “reset” la lista più a destra non viene rimossa dallo schermo, il secondo avviene quando premo “cancella”, se provo a cancellare un elemento della lista a sinistra la prima volta lo cancella con successo mentre la seconda genera il seguente errore: 

line 83, in modify_list
   del main_list[main_list_copy.index(main_list[i])]
IndexError: list index out of range

mentre se provo a fare lo stesso con la lista a destra, la prima volta non cancella nulla e la seconda dà lo stesso errore

di seguito il codice:

import tkinter
from tkinter import ttk
from tkinter import *
from tkinter.ttk import *
import random
import os
from tkinter import messagebox
from turtle import color
folder_name=""
def save():
   direzioni_file = os.path.join(folder_name, "direzioni.txt")
   strutture_file = os.path.join(folder_name, "strutture.txt")
   print("Percorso del file delle direzioni:", direzioni_file)  # Stampiamo il percorso del file delle direzioni
   print("Percorso del file delle strutture:", strutture_file)  # Stampiamo il percorso del file delle strutture
   if not os.path.exists(folder_name):
       print("La cartella non esiste.")
       return  # Usciamo dalla funzione se la cartella non esiste
   with open(direzioni_file, "w") as f:
       for item in direzioni:
           f.write(item)  # Scriviamo ogni elemento della lista su una nuova riga
   #with open(direzioni_file, "a") as f:
       #f.write("\n")
   with open(strutture_file, "w") as f:
       for item in strutture:
           f.write(item)  # Scriviamo ogni elemento della lista su una nuova riga
   #with open(strutture_file, "a") as f:
       #f.write("\n")
       
def load():
   global folder_name
   folder_name = folder_name_var.get()
   print(global_folder_name)
   print(folder_name)
   direzioni_file = os.path.join(folder_name, "direzioni.txt")
   strutture_file = os.path.join(folder_name, "strutture.txt")

   if os.path.exists(direzioni_file) and os.path.exists(strutture_file):
       with open(direzioni_file, "r") as f:
           direzioni.clear()
           direzioni.extend(f.readlines())
           print(direzioni)
       update_direction_labels()
       direzione_entry.delete(0, END)
       with open(strutture_file, "r") as f:
           strutture.clear()
           strutture.extend(f.readlines())
       update_structure_labels()
       struttura_entry.delete(0, END)
       update_scenery()
       folder_name_label.grid_remove()
       folder_name_entry.grid_remove()
   else:
       messagebox.showerror("Errore", "La cartella o i file non esistono.")
   folder_name_entry.delete(0, END)
def modify_list(is_direction):
   global strutture, selectedD, selectedS, direzioni
   if is_direction:
       selected_list = selectedD
       main_list = direzioni
       entry_widget = direzione_entry
       update_function = update_direction_labels
   else:
       selected_list = selectedS
       main_list = strutture
       entry_widget = struttura_entry
       update_function = update_structure_labels
   main_list_copy = main_list.copy()  
   for i, selected_var in enumerate(selected_list):
       if selected_var.get():
           del main_list[main_list_copy.index(main_list[i])]
           selected_var.set(False)  # Deseleziona la casella di controllo
   entry_widget.delete(0, END)
   update_function()
   if not is_direction:
       update_scenery()

def delete():
   modify_list()

def rollback():
   modify_list(False)
   folder_name_var.set("")
   load_button.grid()
   folder_name_label.grid()
   folder_name_entry.grid()
   
# Aggiungi un campo di input per il nome della cartella
def show_folder_name_entry():
   folder_name_label.grid(column=3, row=3, sticky=(W, E))
   folder_name_entry.grid(column=4, row=3, columnspan=2, sticky=(W, E))
   load_button.grid_remove()
   update_scenery()
def generate():
   # Rimuove le etichette esistenti
   for widget in mainframe.winfo_children():
       if isinstance(widget, Checkbutton) and widget.winfo_ismapped():
           info = widget.grid_info()
           if info["column"] >= 4:
               widget.grid_forget()
   random_struttura = random.choice(strutture)
   random_direzione = random.choice(direzioni)
   ttk.Label(mainframe, text="output:").grid(column=4, row=1, sticky=W)
   ttk.Label(mainframe, text=random_direzione+random_struttura).grid(column=4, row=2, sticky=(W, E))
def append():
   direzioni.append(direzione.get()+"\n")
   update_direction_labels()
   direzione_entry.delete(0, END)
def update_direction_labels():
   # Rimuove tutti i widget Checkbutton esistenti
   for widget in mainframe.winfo_children():
       if isinstance(widget, Checkbutton) and widget.winfo_ismapped():
           info = widget.grid_info()
           if info["column"] == 1 and info["row"] >= 6:
               widget.grid_forget()
   # Aggiunge i widget Checkbutton aggiornati per ogni elemento della lista direzioni
   for i, x in enumerate(direzioni):
       print(x)
       if x.strip():  # Controlla se la stringa non è vuota o solo spazi vuoti
           selected_var = BooleanVar()  # Crea una nuova variabile BooleanVar per ogni Checkbutton
           Checkbutton(mainframe, text="? " + x, variable=selected_var, onvalue=True, offvalue=False).grid(column=1, row=6+i, sticky=W)
           selectedD.append(selected_var)  # Aggiungi la variabile alla lista selectedD
       else:
           Label(mainframe, text=x).grid(column=1, row=6+i, sticky=W)
   root.update()
def appens():
   strutture.append(struttura.get()+"\n")
   update_structure_labels()
   struttura_entry.delete(0, END)
def update_structure_labels():
   # Rimuove tutti i widget Label esistenti
   for widget in mainframe.winfo_children():
       if isinstance(widget, Label) and widget.winfo_ismapped():
           info = widget.grid_info()
           if info["column"] == 2 and info["row"] >= 6:
               widget.grid_forget()
   # Aggiunge i widget Label aggiornati per ogni elemento della lista strutture
   for i in enumerate(strutture):
       print("index: "+str(i))
   for i, x in enumerate(strutture):
       print("valore: "+str(x))
       print("index "+str(len(strutture)))
       if isinstance(x, str) and x.strip():
           selected_var = BooleanVar()
           Checkbutton(mainframe, text="? " + x, variable=selected_var, onvalue=True, offvalue=False).grid(column=2, row=6+i, sticky=W)
           selectedS.append(selected_var)
       else:
           Label(mainframe, text=str(x)).grid(column=2, row=6+i, sticky=W)
   root.update()
def update_scenery():
   load_button.grid_remove()
   scenery_name = folder_name_entry.get()
   Label(mainframe, text=f"Scenario:  {scenery_name}").grid(column=1, row=4, columnspan=1, sticky=(W, E))
root = Tk()
root.title("random map generator")
selectedD=[]
selectedS=[]
direzioni=[]
strutture=[]
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

direzione=StringVar()
direzione_entry=ttk.Entry(mainframe, width=7, textvariable=direzione)
direzione_entry.grid(column=1, row=2, sticky=(W, E))
struttura=StringVar()
struttura_entry=ttk.Entry(mainframe, width=7, textvariable=struttura)
struttura_entry.grid(column=2, row=2, sticky=(W, E))
# Aggiungi un campo di input per il nome della cartella
folder_name_label = ttk.Label(mainframe, text="Nome della cartella:")
folder_name_label.grid(column=3, row=1, sticky=(W, E))
folder_name_var = StringVar()
folder_name_entry = ttk.Entry(mainframe, textvariable=folder_name_var)
folder_name_entry.grid(column=3, row=2, columnspan=1, sticky=(W, E))
global_folder_name=folder_name_var.get()
load_button = ttk.Button(mainframe, text="Carica", command=load)
load_button.grid(column=3, row=3, sticky=(W, E))
ttk.Button(mainframe, text="salva", command=save).grid(column=5, row=3, sticky=(W, E))
ttk.Button(mainframe, text="aggiungi", command=append).grid(column=1, row=3, sticky=(W, E))
ttk.Button(mainframe, text="aggiungi", command=appens).grid(column=2, row=3, sticky=(W, E))
ttk.Label(mainframe, text="direzione:").grid(column=1, row=1, sticky=W)
ttk.Label(mainframe, text="struttura:").grid(column=2, row=1, sticky=W)
root.update()
ttk.Label(mainframe, text="output:").grid(column=4, row=1, sticky=W)
ttk.Button(mainframe, text="Genera", command=generate).grid(column=4, row=3, sticky=(W, E))
ttk.Button(mainframe, text="Reset", command=rollback).grid(column=4, row=4, sticky=(W, E))
ttk.Button(mainframe, text="Cancella", command=delete).grid(column=5, row=4, sticky=(W, E))
for child in mainframe.winfo_children():
   child.grid_configure(padx=5, pady=5)
def on_enter(event):
   direzione_text = direzione.get().strip()
   struttura_text = struttura.get().strip()
   folder_text = folder_name_var.get().strip()
   if direzione_text and struttura_entry.focus_get():
       append()
   elif struttura_text and struttura_entry.focus_get():
       appens()
   elif folder_text and folder_name_entry.focus_get():
       load()
   else:
       generate()
root.bind("<Return>", on_enter)
root.mainloop()
Devi accedere o registrarti per scrivere nel forum
0 risposte