Forum >> Programmazione Python >> GUI >> [tkinter] drag and drop, ne parliamo?

Pagina: Indietro 1 2

Daniele aka Palmux said @ 2024-11-20 13:49:05:
Lo farò sicuramente, non avere fretta perché ho un "milionaio" di attività da fare, ma una promessa è un debito.
Ti ringrazio per la Tua disponibilità, prendi tranquillamente tutto il tempo che Ti serve

... comunque, ho il sospetto che il problema derivi dai decoratori "@property" e "@<metodo>.setter" utilizzati nella classe definente l'elemento "drag-drop", apparentemente non vengono ereditati correttamente.
Infatti, implementando specifici metodi getter e setter (tipo set_dragable(self, variabile) e get_dragable(self)) le variabili di classe self._dragable e self._dropable vengono variate (prima non avveniva) e si ha conformità nelle valutazioni tra classe ed oggetto.

Approfondirò, intanto grazie del Tuo interessamento.

Edit: bah ... forse non pongo domande "giuste" nelle mie ricerche, ma non ho trovato informazioni direttamente associate al caso specifico, però ho trovato più volte indicato che "l'incapsulazione delle classi non è completa in python", penso che la problematica da me riscontrata possa ricadere in tale ambito.

In effetti, utilizzando i decoratori built-in prima indicati non faccio altro che incapsulare dei metodi di classe in funzioni, forse è possibile che l'ulteriore incapsulamento che avviene utilizzando l'ereditarietà non arrivi a definire tale circostanza.

Comunque, evitando i decoratori ed utilizzando metodi diretti per l'impostazione delle proprietà _dragable e _dropable, la funzionalità dello insieme tornano nei criteri da me conosciuti.

Pur se esistono varianti possibili da studiarsi (non ultima la definizione di classi-decoratore per i widget) credo che la metodologia a "metodo diretto" raggiunga un sufficiente compromesso tra semplicità ed elasticità, permettendo di svolgere l'intero lavoro (a parte i metodi astratti) all'interno della classe-madre ...


Ri-Edit : e, pensandoci un po' e facendo qualche prova

class A:
    def __init__(self, obj):
        self.obj = obj
        self._dragable = True
        self._dropable = True
        self.obj.dragable = self.dragable

    @property
    def dragable(self):
        return self._dragable
    
    @dragable.setter
    def dragable(self, value):
        self._dragable = value

class B:
    def __init__(self):
        self.name = 'Prova'

ogg = B()
ogg.__dict__
{'name': 'Prova'}
toclass = A(ogg)
ogg.__dict__
{'name': 'Prova', 'dragable': True}
toclass.__dict__
{'obj': <__main__.B object at 0x7a3b07f63710>, '_dragable': True, '_dropable': True}
ogg.dragable = False
ogg.__dict__
{'name': 'Prova', 'dragable': False}
toclass.__dict__
{'obj': <__main__.B object at 0x7a3b07f63710>, '_dragable': True, '_dropable': True}
type(toclass.dragable)
<class 'bool'>
type(ogg.dragable)
<class 'bool'>
mi sovviene che l'eredità centra ben poco ma entra in gioco una decisa ambiguità nella istruzione


self.obj.dragable = self.dragable


la quale, ovviamente, va ad assegnare a obj il "valore" restituito dalla dal metodo con decoratore "@property", definendo per esso una nuova proprietà di tipo booleano, il setter non entra mai in gioco.




... mi son sentito un po' stupido, capendolo, il problema, tanto per cambiare ero io :angry:



--- Ultima modifica di nuzzopippo in data 2024-11-25 09:53:05 ---
Fatti non foste a viver come bruti...
Dopo aver, credo, compreso ciò che mi lasciava perplesso (e datomi dell'asino) ho ri-adeguato l'implementazione, che ritengo ora corretta, i test effettuati sembrano funzionare bene.

Quanto implementato permette di effettuare il drag & drop di oggetti a piacere tra finestre tkinter di una stessa applicazione, accoppiando widget sorgenti e destinatari per tipologia.

I widget vengono incapsulati in implementazioni reali della classe astratta "DragDropElement" e ricevono da essa quattro nuove proprietà che puntano a metodi di istanza che definiscono le capacità di invio/ricezione dati in gioco.




Date le 363 visualizzazioni avute dal post, allego, nel caso possa essere utile a qualcuno, i files di codifica della classe e test usati, vi troverete esempi d'uso della tecnica, per operare avrete bisogno anche del file json allegato in precedente post, il tutto presente nella stessa directory.




Ritengo adeguatamente conclusa la problematica in oggetto, comunque, se qualcuno riterrà di porle, sarà cosa gradita discutere su osservazioni/domande in merito.




Grazie dell'attenzione :)

Fatti non foste a viver come bruti...
Allegati


Pagina: Indietro 1 2



Esegui il login per scrivere una risposta.