[Python] drag and drop in tkinter, ne parliamo?

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1650
Iscrizione: giovedì 12 ottobre 2006, 11:34

[Python] drag and drop in tkinter, ne parliamo?

Messaggio da nuzzopippo »

I miei saluti.

Sto, al momento, studiando come realizzare un "drag and drop" in tkinter, che non fornisce (a quanto ne so) una interfaccia nativa in merito, l'idea di fondo è realizzare dei widget con tale capacità, per scambio di dati tra diverse finestre di una stessa applicazione tramite trascinamento.
Con l'aiuto della documentazione, principalmente di winfo mi è riuscito di realizzare una bozza di base funzionante, sub-classando una tkinter.Entry, scambiando testo tra due oggetti di detto sub-classamento posti in finestre diverse, per trascinamento con il tasto destro del mouse premuto.
Nell'immagine sottostante un esempio del risultato del trascinamento dalla finestra principale ad una finestra secondaria, previa abilitazione a farlo, e viceversa (con abilitazione definita alla costruzione)
Immagine

... però, anche se funziona, non sono pienamente convinto della metodologia adottata, al momento, al rilascio del pulsante destro del mouse l'oggetto su cui si è avviato il "drag" esamina tutta la gerarchia dei parent sino a trovare la main-window (root per gli amici) e utilizza questa per estrarre tra i widget figli quello su cui è stato rilasciato il pulsante, se quest'ultimo ha uno specifico attributo ("dragable") vi viene aggiunto il testo del widget "draggato".

Come detto, è solo un abbozzo preliminare di studio della funzionalità, prima di integrare il concetto in vari elementi (penso almeno a treeview ed entry che si scambino oggetti) non mi dispiacerebbero consigli circa approcci migliori e/o accorgimenti da tenere.
Se qualcuno vuol provare il codice sin ora implementato (106 righe):

Codice: Seleziona tutto

import tkinter as tk


class DragEntry(tk.Entry):
    def __init__(self, parent: callable, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent
        self.dragable = True
        self.active = False
        self.bind("<Button-3>", self._on_press)
        self.bind("<B3-Motion>", self._on_motion)
        self.bind("<ButtonRelease-3>", self._on_release)

    def _on_press(self, evt):
        if not self.active: return
        x,y = self.parent.winfo_pointerxy()
        y = self.parent.winfo_pointery()
        # TODO: costruire finestra x mostrare trascinamento
        
    def _on_motion(self, evt):
        if not self.active: return
        x = self.parent.winfo_pointerx()
        y = self.parent.winfo_pointery()
        # TODO: mostrare trascinamento

    def _on_release(self, evt):
        if not self.active: return
        x = self.parent.winfo_pointerx()
        y = self.parent.winfo_pointery()
        # TODO: distruggere finestra x mostrare trascinamento
        obj = self.__verify_to_coords((x,y))
        if obj and hasattr(obj, 'dragable'):
            txt = self.get()
            obj.insert(tk.END, txt)

    def __verify_to_coords(self, c2):
        top = self.__get_top(self)
        if not top: return
        w = top.winfo_containing(*c2)
        return top._nametowidget(w)
        

    def __get_top(self, wdg):
        p = wdg.winfo_parent()
        w = wdg._nametowidget(p)
        if w:
            if isinstance(w, tk.Tk):
                top = w
            else:
                top = self.__get_top(w)
        else:
            top = None
        return top

    def activate(self):
        self.active = not self.active
        

class WinDest(tk.Toplevel):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent
        lbl = tk.Label(self, text='Casella destinazione :')
        lbl.grid(row=0, column=0, padx=5, pady=5, sticky='w')
        self.e_test = DragEntry(self)
        self.e_test.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
        self.e_test.activate()

    def message(self, msg):
        self.dida.configure(text=msg)
        self.update()
    
    
class WinTest(tk.Tk):
    def __init__(self):
        super().__init__()
        lbl = tk.Label(self, text='Casella sorgente :')
        lbl.grid(row=0, column=0, padx=5, pady=5, sticky='w')
        self.e_test = DragEntry(self)
        self.e_test.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
        pn_bt = tk.Frame(self)
        pn_bt.grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky='ew')
        self.bt_active = tk.Button(pn_bt, text='Attiva', command=self._on_active)
        self.bt_active.grid(row=0, column=0, padx=(5,2), pady=5, sticky='ew')
        bt_close = tk.Button(pn_bt, text='Chiudi', command=self.destroy)
        bt_close.grid(row=0, column=1, padx=(2,5), pady=5, sticky='ew')
        pn_bt.grid_columnconfigure(0, weight=1, uniform='bt')
        pn_bt.grid_columnconfigure(1, weight=1, uniform='bt')
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

    def _on_active(self):
        self.e_test.activate()
        if self.e_test.active:
            self.bt_active.configure(text='Disattiva')
        else:
            self.bt_active.configure(text='Attiva')

    def message(self, msg):
        self.dida.configure(text=msg)
        self.update()


if __name__ == '__main__':
    app = WinTest()
    w = WinDest(app)
    app.mainloop()
Grazie dell'attenzione :)
Fatti non foste a viver come bruti ...
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1650
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da nuzzopippo »

Ritenendo che non vi fosse interesse sull'argomento non ho aggiunto altro, anche se personalmente ho "risolto" l'argomento a modo mio, sviluppando una metodologia abbastanza semplice da applicare a qualsiasi widget.
Vedo, però, che tutt'ora proseguono visite, poche ma con una certa costanza, nel caso qualcuno sia interessato lo indichi ed integrerò in post.
Fatti non foste a viver come bruti ...
Avatar utente
OMBRA_Linux
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3245
Iscrizione: mercoledì 18 febbraio 2015, 14:24
Desktop: HP / Lenovo / Samsung
Distribuzione: Android / Linux / Windows10/11
Sesso: Maschile
Località: Napoli

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da OMBRA_Linux »

Hai dato un occhiata a:

Codice: Seleziona tutto

tkinter.dnd
Se per vivere devi strisciare, alzati e muori.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1650
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da nuzzopippo »

Si, lo avevo trovato e, visto che era deprecato, ho guardato il suo sostituto, python-tkdnd, trovato nella docs che:

Codice: Seleziona tutto

root = TkinterDnD.Tk()  # notice - use this instead of tk.Tk()
Ho escluso "a priori" il suo utilizzo, non mi va a genio un modulo che pone un suo incapsulamento dell'intero mainloop.

Ho preferito definire un mio sistema di classi (una astratta e classi reali secondo le esigenze) incapsulante dei generici widget e delle regole che rendono modellabile il set di dati trasmessi tra i widget.
:ciao:
Fatti non foste a viver come bruti ...
Avatar utente
OMBRA_Linux
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3245
Iscrizione: mercoledì 18 febbraio 2015, 14:24
Desktop: HP / Lenovo / Samsung
Distribuzione: Android / Linux / Windows10/11
Sesso: Maschile
Località: Napoli

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da OMBRA_Linux »

Si è vero ma il sostituto potrebbe essere non ancora completamente integrato.
Ho trovato qui https://github.com/rdbende/tkinterDnD/b ... NTATION.mdla documentazione a riguardo.
Inoltre elaborando il tuo codice che credo può essere migliorato includendo
Una stringa per l'Importazione della finestra di trascinamento drag window.
Un altra stringa per correggere il tipo di callback parent tk.Widget.
E una per l'Integrazione del drag-and-drop tra le finestre associate in questo modo:

Codice: Seleziona tutto

import tkinter as tk


class DragEntry(tk.Entry):
    def __init__(self, parent: tk.Widget, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent
        self.dragable = True
        self.active = False
        self.drag_window = None
        self.bind("<Button-3>", self._on_press)
        self.bind("<B3-Motion>", self._on_motion)
        self.bind("<ButtonRelease-3>", self._on_release)

    def _on_press(self, evt):
        if not self.active: return
        self.drag_window = tk.Toplevel(self)
        self.drag_window.overrideredirect(True)
        x, y = self.parent.winfo_pointerxy()
        self.drag_window.geometry(f"+{x}+{y}")
        label = tk.Label(self.drag_window, text=self.get(), bg='lightgrey')
        label.pack()

    def _on_motion(self, evt):
        if not self.active or not self.drag_window: return
        x, y = self.parent.winfo_pointerx(), self.parent.winfo_pointery()
        self.drag_window.geometry(f"+{x}+{y}")

    def _on_release(self, evt):
        if not self.active or not self.drag_window: return
        x, y = self.parent.winfo_pointerx(), self.parent.winfo_pointery()
        self.drag_window.destroy()
        self.drag_window = None
        obj = self.__verify_to_coords((x, y))
        if obj and hasattr(obj, 'dragable'):
            obj.insert(tk.END, self.get())

    def __verify_to_coords(self, c2):
        top = self.__get_top(self)
        if not top: return
        w = top.winfo_containing(*c2)
        return top._nametowidget(w)

    def __get_top(self, wdg):
        p = wdg.winfo_parent()
        w = wdg._nametowidget(p)
        if isinstance(w, tk.Tk):
            return w
        return self.__get_top(w)

    def activate(self):
        self.active = not self.active


class WinDest(tk.Toplevel):
    def __init__(self, parent: tk.Widget, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent
        lbl = tk.Label(self, text='Casella destinazione:')
        lbl.grid(row=0, column=0, padx=5, pady=5, sticky='w')
        self.e_test = DragEntry(self)
        self.e_test.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
        self.e_test.activate()


class WinTest(tk.Tk):
    def __init__(self):
        super().__init__()
        lbl = tk.Label(self, text='Casella sorgente:')
        lbl.grid(row=0, column=0, padx=5, pady=5, sticky='w')
        self.e_test = DragEntry(self)
        self.e_test.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
        pn_bt = tk.Frame(self)
        pn_bt.grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky='ew')
        self.bt_active = tk.Button(pn_bt, text='Attiva', command=self._on_active)
        self.bt_active.grid(row=0, column=0, padx=(5, 2), pady=5, sticky='ew')
        bt_close = tk.Button(pn_bt, text='Chiudi', command=self.destroy)
        bt_close.grid(row=0, column=1, padx=(2, 5), pady=5, sticky='ew')
        pn_bt.grid_columnconfigure(0, weight=1, uniform='bt')
        pn_bt.grid_columnconfigure(1, weight=1, uniform='bt')
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

    def _on_active(self):
        self.e_test.activate()
        if self.e_test.active:
            self.bt_active.configure(text='Disattiva')
        else:
            self.bt_active.configure(text='Attiva')


if __name__ == '__main__':
    app = WinTest()
    WinDest(app)
    app.mainloop()
Se per vivere devi strisciare, alzati e muori.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1650
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da nuzzopippo »

Ti ringrazio tanto per il link, quanto per i suggerimenti, domani, con calma, vedrò la Tua proposta, comunque, come avevo accennato in precedenza, ho superato quel codice iniziale nel primo post.

Attualmente, ho sviluppato una metodologia che "avvolge" un widget, gli fornisce delle proprietà e sfrutta i metodi propri di tkinter per effettuare il trascinamento e lo scambio dei dati ... lo esporrò di seguito, sperando di non tediare

Ho definito un mio modulo specifico per il drag&drop, basato su di una classe astratta, ne espongo il codice :

Codice: Seleziona tutto

class DragDropElement(abc.ABC):
    ''' Classe astratta per incapsulare un widget tkinter interessato. '''
    def __init__(self, obj: callable, tipe: str='text', *args, **kwargs):
        ''' Inizializzazione della classe astratta.
            Parametri :
            obj  - widget tkinter incapsulato dalla classe
            tipe - tipologia di dato, per confronto tra oggetti
                   sorgente/destinazione dati
        '''
        self.obj = obj
        self._dragable = True  # VERO definisce una sorgente dati
        self._dropable = True  # VERO definisce un destinatario dati
        self.obj.get_dropable = self.get_dropable
        self.obj.set_dropable = self.set_dropable
        self.obj.get_dragable = self.get_dragable
        self.obj.set_dragable = self.set_dragable
        self.tipe = tipe
        self.obj.drop_data = self.drop_data
        self.obj.drag_data = self.drag_data
        self.mwin = None
        self.obj.bind("<Button-3>", self._on_press)
        self.obj.bind("<B3-Motion>", self._on_motion)
        self.obj.bind("<ButtonRelease-3>", self._on_release)

    def get_dragable(self) -> bool:
        ''' Restituisce se sorgente dati '''
        return self._dragable
    
    def set_dragable(self, value: bool) -> None:
        ''' Imposta se sorgente dati '''
        self._dragable = value
    
    def get_dropable(self) -> bool:
        ''' Restituisce se destinatario dati '''
        return self._dropable
    
    def set_dropable(self, value: bool) -> None:
        ''' Imposta se destinatario dati '''
        self._dropable = value

    def _on_press(self, evt: callable) -> None:
        if not self._dragable: return
        x,y = self.obj.winfo_pointerxy()
        self.mwin = DragWin(self.obj)
        self.mwin.geometry(f'+{x}+{y}')
        
    def _on_motion(self, evt: callable) -> None:
        if not self._dragable: return
        x, y = self.obj.winfo_pointerxy()
        self.mwin.geometry(f'+{x}+{y}')

    def _on_release(self, evt: callable) -> None:
        if not self._dragable: return
        self.mwin.destroy()
        self.mwin = None
        x, y = self.obj.winfo_pointerxy()
        obj = self.__verify_to_coords((x,y))
        if obj and hasattr(obj, 'get_dropable'):
            data = self.drag_data()
            obj.drop_data(self.tipe, data)

    def __verify_to_coords(self, c2: tuple) -> callable:
        top = self.__get_top(self.obj)
        if not top: return
        w = top.winfo_containing(*c2)
        return top._nametowidget(w) if w else None

    def __get_top(self, wdg: callable) -> callable:
        p = wdg.winfo_parent()
        w = wdg._nametowidget(p)
        if w:
            if isinstance(w, tk.Tk):
                top = w
            else:
                top = self.__get_top(w)
        else:
            top = None
        return top

    @abc.abstractmethod
    def drop_data(self, descriptor, data: any) -> None:
        pass

    @abc.abstractmethod
    def drag_data(self) -> any:
        pass
La classe incapsula il widget destinato ad implementare il DeD e ne implementa il binding del pulsante destro del mouse, implementando i callback per la pressione, il trascinamento ed il rilascio, puntandoli a metodi interni alla classe stessa che provvedono a visualizzare il trascinamento.
Inoltre, la classe definisce alcune proprietà aggiuntive al widget :

Codice: Seleziona tutto

        self.obj.get_dropable = self.get_dropable
        self.obj.set_dropable = self.set_dropable
        self.obj.get_dragable = self.get_dragable
        self.obj.set_dragable = self.set_dragable
proprietà che puntano a metodi della classe che definiscono se il widget è una sorgente dati oppure un destinatario.
Per altro, alla classe può essere apposta una tipologia di dato (di default è "text") che controlla la tipologia di dato scambiata, lo scambio avverrà solo per tipi uguali ... questo "accorgimento" permette di scambiare qualsiasi cosa si voglia.

Al rilascio del pulsante destro del mouse, la classe esamina l'intero albero dei widget, trovando la root (tkinter.Tk() ) ed estraendo il widget su cui è stato rilasciato il pulsante del mouse (se c'è), vengono quindi invocate le implementazioni reali dei metodi astratti "dropdata" e "drag_data", in caso la tipologia del widget sia del tipo giusto verrà eseguito il passaggio dati.

Nel modulo sono implementati, oltre ad una finestra per il trascinamento, un paio di classi "reali" per passaggio di testo "puro" (per entry e label) ed una classe per un widget "generico"

Codice: Seleziona tutto

class DADGeneric(DragDropElement):
    '''Implementazione reale per drag&drop di oggetti tra widget vari'''
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    
    def drop_data(self, descriptor, data: any) -> None:
        if not self._dropable: return
        if descriptor != self.tipe: return
        self.obj.set_element(data)

    def drag_data(self) -> any:
        return self.obj.get_element()
che prevede i widget siano dotati di proprietà "set_element(data)" e "get_element()" che possono essere metodi propri del widget, ovvero riferimenti ad un metofo di oggetto contenitore.

Al fine di esemplificare, ho manipolato un test fatto, che produce questo:
Immagine

Ove un Frame viene passato ad un DADGeneric e viene assegnato un metodo della finestra madre quale proprietà "set_element" (riga 190 di test.py)

Codice: Seleziona tutto

        self.pn_loc.set_element = self.set_comune
Allego lo zip del test (tre file, posizionare nella stessa cartella), in caso lo si voglia provare, e per esemplificare, ho testato sul computer di mio diglio che funziona anche in windows, contrariamente a tkinterDnD, non so se in KDE possa dar problemi, non dovrebbe ma sai mai ... se si vorrà dare notizia non darebbe cosa sgradita.

Quanto su è pensato per una situazione dati sorgente -> ricevente. Non ho testato una eventuale situazione <->, ritenendola improbabile. Suggerimenti e commenti sono ben accetti.

@OMBRA_Linux guarderò quanto da Te suggerito, intanto se vorrai, potrai essere edotto dello stato corrente raggiunti, grazie ancora e ciao :)
Allegati
test_d_e_d.zip
(9.93 KiB) Scaricato 3 volte
Fatti non foste a viver come bruti ...
Avatar utente
OMBRA_Linux
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3245
Iscrizione: mercoledì 18 febbraio 2015, 14:24
Desktop: HP / Lenovo / Samsung
Distribuzione: Android / Linux / Windows10/11
Sesso: Maschile
Località: Napoli

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da OMBRA_Linux »

Credo che cosi come lo hai strutturato sia ben fatto.
Se per vivere devi strisciare, alzati e muori.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1650
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da nuzzopippo »

@OMBRA_Linux , ho guardato i Tuoi suggerimenti, vedo che Ti eri concentrato sull'aspetto "trascinamento", molto carina l'idea del trascinamento del testo, bene o male avevo raggiunto una implementazione analoga.
Circa la modalità di rilevamento delle coordinate del puntatore, segnalo "winfo_pointerxy" direttamente dalla docs generale di tkinter 8.6

Grazie del parere, in effetti, nei miei post cerco più che altro suggerimenti di tecniche e pareri, al fine di "indirizzarmi meglio :birra:
Fatti non foste a viver come bruti ...
Avatar utente
SaulGoodman
Prode Principiante
Messaggi: 199
Iscrizione: mercoledì 11 dicembre 2024, 0:46
Distribuzione: Ubuntu

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da SaulGoodman »

Ringrazia ChatGPT...
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2019
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da korda »

SaulGoodman ha scritto:
martedì 14 gennaio 2025, 12:57
Ringrazia ChatGPT...
Effettivamente qualche dubbio in merito, sulla paternità di alcuni contenuti, è sorto pure in me.

Non dico che occorra essere sempre orginali, ma ogni tanto non sarebbe male verificare tali contenuti (e/o parafrasarli in modo adeguato all'interlocutore finale) prima di ripubblicarli.
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
Avatar utente
SaulGoodman
Prode Principiante
Messaggi: 199
Iscrizione: mercoledì 11 dicembre 2024, 0:46
Distribuzione: Ubuntu

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da SaulGoodman »

korda ha scritto:
martedì 14 gennaio 2025, 13:17
Non dico che occorra essere sempre orginali, ma ogni tanto non sarebbe male verificare tali contenuti (e/o parafrasarli in modo adeguato all'interlocutore finale) prima di ripubblicarli.
Basterebbe specificare la fonte...
Avatar utente
OMBRA_Linux
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 3245
Iscrizione: mercoledì 18 febbraio 2015, 14:24
Desktop: HP / Lenovo / Samsung
Distribuzione: Android / Linux / Windows10/11
Sesso: Maschile
Località: Napoli

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da OMBRA_Linux »

Rosicare non serve.
Fonte: https://en.ittrip.xyz/python/tkinter-drag-drop
Studiatevelo bene.

Edit: Caso mai non riusciste a trovare la sezione giusta, seguite la freccia.
Immagine
Se per vivere devi strisciare, alzati e muori.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1650
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da nuzzopippo »

Non comprendo da questi punti in poi
korda ha scritto:
martedì 14 gennaio 2025, 13:17
SaulGoodman ha scritto:
martedì 14 gennaio 2025, 12:57
Ringrazia ChatGPT...
Effettivamente qualche dubbio in merito, sulla paternità di alcuni contenuti, è sorto pure in me.

Non dico che occorra essere sempre orginali, ma ogni tanto non sarebbe male verificare tali contenuti (e/o parafrasarli in modo adeguato all'interlocutore finale) prima di ripubblicarli.
Esprimete chiaramente cosa volete dire, prego
Fatti non foste a viver come bruti ...
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2019
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da korda »

nuzzopippo ha scritto:
martedì 14 gennaio 2025, 14:54
Non comprendo da questi punti in poi
korda ha scritto:
martedì 14 gennaio 2025, 13:17
SaulGoodman ha scritto:
martedì 14 gennaio 2025, 12:57
Ringrazia ChatGPT...
Effettivamente qualche dubbio in merito, sulla paternità di alcuni contenuti, è sorto pure in me.

Non dico che occorra essere sempre orginali, ma ogni tanto non sarebbe male verificare tali contenuti (e/o parafrasarli in modo adeguato all'interlocutore finale) prima di ripubblicarli.
Esprimete chiaramente cosa volete dire, prego
Lo ha già eloquentemente espresso l'utente interessato nel post appena precedente il tuo ;)
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1650
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python] drag and drop in tkinter, ne parliamo?

Messaggio da nuzzopippo »

Ti dispiace considerarmi un po' tardo e chiarirmi le idee?
Fatti non foste a viver come bruti ...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti