Topic: Listbox da file editabile  (Letto 343 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline tascio

  • python erectus
  • ***
  • Post: 188
  • Punti reputazione: 0
    • Mostra profilo
Listbox da file editabile
« il: Giugno 23, 2020, 17:35 »
Ho un file in cui ogni riga contiene dei dati es:

1,pippo,cc9
2,ciccio,cc8


Vorrei permettere all'utente di modificare l'ordine di queste stringhe tramite interfaccia grafica e riscrivere poi il file con l'ordine da lui scelto ma non so bene come fare.

Al momento sto provando cosi'

def priorita(self, *argv):
        root = Tk()
        Button(root,
          text='Esegui',
          command=self.salva_priorita).grid(row=3,
                                    column=3)

        ll = self.lgrezzo.get(0, END) #il contenuto del file lo avevo già in una listbox
        i = 0
        for x in ll:
            Label(root, text=x).grid(row=i, column=1)
            Entry(root).grid(row=i, column=2)
            i = i + 1
           
        root.mainloop()

Creo tanti label quante sono le righe nel file (già inserite in una listbox) ed accanto un Entry in cui inserire un numero che rappresenti l'ordine.
Solo che poi non ho idea di come prelevare i dati dei vari Entry associati a quale label (io pensavo di basarmi sui row del frame che contiene sia il label che l'entry)
Insomma navigo in alto mare, aiuto

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:Listbox da file editabile
« Risposta #1 il: Giugno 24, 2020, 08:47 »
...
Creo tanti label quante sono le righe nel file (già inserite in una listbox) ed accanto un Entry in cui inserire un numero che rappresenti l'ordine.
Solo che poi non ho idea di come prelevare i dati dei vari Entry associati a quale label (io pensavo di basarmi sui row del frame che contiene sia il label che l'entry)
Insomma navigo in alto mare, aiuto

Come sempre, sono problemi di progettazione che vanno affrontati con le idee chiare ed a cui è difficile (e lungo) rispondere non avendo presente tutto il contesto.

In primo luogo, un "testo editabile" andrebbe affrontato con gli strumenti specifici che tkinter mette a disposizione, concedo che non sono "immediati", il widget "Text" andrebbe studiato approfonditamente per utilizzarlo appieno ma permetterebbe, magari condito da processi di copia/incolla, di far fare ai propri utenti quanto richiesto.

Ciò detto, indichi di avere in una list-box l'elenco delle righe lette ... Ti dovrebbe essere sufficiente questo per permettere lo spostamento di righe alla Tua utenza, dovrebbe esserti sufficiente utilizzare due funzioni di callback, la prima (p.e. intercettando CTRL+C) dovrebbe memorizzare l'indice delle righe al momento selezionate mentre la seconda (p.e. intercettando CTRL+V) che provveda ad individuare la riga corrente e riorganizzi la lista spostando i dati di indice memorizzato in posizione precedente. Poi elaborare.
... al momento non mi è possibile farTi un esempio in merito.

In merito alle "associazioni" di entry e label, ho fatto un esempio (discretamente complesso) in questo post, prova a guardarlo, in particolare circa il sub-classamento delle entry fatte, non è articolato in un "unicum" e non è completo ma tratta praticamente tutti gli aspetti da Te posti, anche se per uno scopo particolare; qualora Ti interessasse sono disponibile a provvedere a rendere accessibile il codice per intero.

Se quanto sopra non ti soddisfa, fai vedere il Tuo codice, in modo da capire cosa fare.

Ciao :)

Offline tascio

  • python erectus
  • ***
  • Post: 188
  • Punti reputazione: 0
    • Mostra profilo
Re:Listbox da file editabile
« Risposta #2 il: Giugno 24, 2020, 15:47 »
Sto cercando di capire come funziona il bind sulla pressione del mouse sx e rilascio per spostare le righe nella listbox, una sorta di drag & drop dentro la listbox stessa... ma sono poco abile con le GUI  ;(

Offline tascio

  • python erectus
  • ***
  • Post: 188
  • Punti reputazione: 0
    • Mostra profilo
Re:Listbox da file editabile
« Risposta #3 il: Giugno 24, 2020, 16:05 »
from tkinter import *
from tkinter import ttk

class f(object):
    def __init__(self, finestra):
        self.finestra = finestra
        self.root = ttk.Frame(self.finestra, padding="30 20 30 20")
        self.root.grid(column=18, row=0)
        self.lbox = Listbox(self.root,\
                            exportselection=0,\
                            selectmode=SINGLE,\
                            width=120, height=20)
        self.lbox.grid(column=1, row=1, columnspan=5)
        self.finestra.bind("<Button-1>", self.callback1)
        self.finestra.bind("<ButtonRelease-1>", self.callback2)
       
       
       
    def inserimento(self,lista):
        for val in lista:
            self.lbox.insert(END, val)

    def callback1(self,event):
        print("click a ", event.x, event.y)
        print(self.lbox.curselection())
    def callback2(self,event):
        print("click a ", event.x, event.y)
        print(self.lbox.curselection())


finestra = Tk()
f = f(finestra)

lista = ['1','2','3','4','5']

f.inserimento(lista)

finestra.mainloop()


Ecco un esempio. Al click recupero l'index del record selezionato, se riuscissi a recuperare allo stesso modo l'index del record sui posiziono il mouse e rilascio il bottone potrei spostare i record in lista grazie agli indici

Offline tascio

  • python erectus
  • ***
  • Post: 188
  • Punti reputazione: 0
    • Mostra profilo
Re:Listbox da file editabile
« Risposta #4 il: Giugno 24, 2020, 16:59 »
Ci stiamo arrivando... Devo gestire solo lo spostamento a fine riga, consigli intanto che ci siamo?

from tkinter import *
from tkinter import ttk

class f(object):
    def __init__(self, finestra):
        self.press_x = 0
        self.press_y = 0
        self.rel_x = 0
        self.rel_y = 0
        self.origine = 0
        self.dest = 0
       
        self.finestra = finestra
        self.root = ttk.Frame(self.finestra, padding="30 20 30 20")
        self.root.grid(column=18, row=0)
        self.lbox = Listbox(self.root,\
                            exportselection=0,\
                            selectmode=BROWSE,\
                            width=120, height=20)
        self.lbox.grid(column=1, row=1, columnspan=5)
        self.finestra.bind("<ButtonPress-1>", self.callback1)
        self.finestra.bind("<ButtonRelease-1>", self.callback2)
       
       
       
    def inserimento(self,lista):
        for val in lista:
            self.lbox.insert(END, val)

    def callback1(self,event):
        #print("click a ", event.x, event.y)
        self.press_x = event.x
        self.press_y = event.y
        self.origine = self.lbox.curselection()[0]
        #print(self.lbox.curselection())
    def callback2(self,event):
        self.rel_x = event.x
        self.rel_y = event.y
        self.dest = self.lbox.curselection()[0]
        print("press ", self.press_x, self.press_y)
        print("relesase ", self.rel_x, self.rel_y)
        #print(self.lbox.curselection())
        print('origine ', self.origine)
        print('dest ', self.dest)

        self.sposta()

        #origine = self.lbox.curselection()
        #dest = self.rel_y // 20
    def sposta(self):
        ori = self.lbox.get(self.origine)
        print("origine get ",ori)
        self.lbox.insert(self.dest, ori)
        self.lbox.delete(self.origine)


finestra = Tk()
f = f(finestra)

lista = ['1','2','3','4','5']

f.inserimento(lista)

finestra.mainloop()

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:Listbox da file editabile
« Risposta #5 il: Giugno 25, 2020, 08:07 »
Appena provato il Tuo codice, mi sembra che effettui quanto Ti sei proposto, un solo suggerimento : nel metodo "sposta" inverti l'ordine di inserimento e cancellazione
    def sposta(self):
        ori = self.lbox.get(self.origine)
        print("origine get ",ori)
        self.lbox.delete(self.origine)
        self.lbox.insert(self.dest, ori)

così com'è puoi perdere dati