Topic: Passaggio oggetto immagine a funzioni  (Letto 162 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline John_Vega

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Passaggio oggetto immagine a funzioni
« il: Settembre 22, 2020, 17:17 »
Ciao a tutti,
mi sono imbattuto a cominciare a creare qualche applicazione grafica in tkinter, e stavo cercando di prendere dimestichezza con i vari widget.
Ho cercato di creare una semplice finestra con 2 bottoni, un primo apre un'immagine, il secondo la chiude.
L'idea è quella di utilizzare due funzioni, alle quali passo l'oggetto "foto da mostrare/chiudere".
Al click sul bottone °Apri", viene chiamata una funzione che chiede all utente di scegliere il percorso dell immagine da aprire, viene quindi mostrata l'immagine in una cella, e al click del bottone "Chiudi", dovrebbe chiudere l'immagine, o meglio la label che la contiene.
Beh, funziona fino all'apertura, mentre al click del pulsante di chiusura, non succede nulla.
Ovviamente lavorando senza funzioni, tutto va bene, ma quando cerco di utilizzare funzioni e passaggio parametri, qualcosa va storto, sembra che qualche oggetto non funzioni come dovrebbe.
Posto il codice, molto basic direi, ma è giusto per cercare di capire come funziona il passaggio di parametri  alle funzioni.

[codice] from tkinter import *
from PIL import ImageTk, Image
from tkinter import filedialog
from functools import partial

import tkinter as tk
import requests

window = tk.Tk()
window.geometry("500x300")
window.title("Prova")
window.grid_columnconfigure(0, weight=0)

def open_img(imm, pnl):
    x = filedialog.askopenfilename(title="open")
    imm.configure(file = x)
    panel = tk.Label(window, image = imm)
    panel.image = imm
    panel.update()
    panel.grid(row = 4, column = 4, padx=5, pady=5)
    return

def close_img(a):
    panel.grid_forget()
    #panel.configure(image=a)
    #panel.image = a
    #panel.update()
    return   

img1 = tk.PhotoImage()
panel = tk.Label(window)

open_image = tk.Button(width=15, text="Apri imm", command=partial(open_img, img1, panel))
open_image.grid(row=3, column=2, pady="5")

close_image = tk.Button(width=15, text="chiudi imm", command=partial(close_img, panel))
close_image.grid(row=3, column=3, pady="5")

if __name__== "__main__":
    window.mainloop() [codice]




Grazie per le risposte.
   

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 291
  • Punti reputazione: 0
    • Mostra profilo
Re:Passaggio oggetto immagine a funzioni
« Risposta #1 il: Settembre 23, 2020, 08:52 »
Ciao @John_Vega, ben venuto.

Intanto per il Tuo problema, prova questa variante al Tuo codice:

import tkinter as tk
from PIL import ImageTk, Image
from tkinter import filedialog
from functools import partial


window = tk.Tk()
window.geometry("500x300")
window.title("Prova")
panel = tk.Label(window)
imm = None

def open_img(pnl):
    global imm
    x = filedialog.askopenfilename(title="open")
    if not x: return
    img = Image.open(x)
    imm = ImageTk.PhotoImage(img)
    pnl.configure(image = imm)
    window.update_idletasks()
    pnl.update()

def close_img(pnl):
    pnl.configure(image = '')
    imm = None
    window.update_idletasks()
    pnl.update()
   


open_image = tk.Button(width=15, text="Apri imm", command=partial(open_img, panel))
open_image.grid(row=0, column=0, pady="5")

close_image = tk.Button(width=15, text="chiudi imm", command=partial(close_img, panel))
close_image.grid(row=0, column=2, pady="5")

panel.grid(row=1, column=0, columnspan=3, sticky='nsew')
window.grid_columnconfigure(2, weight=1)
window.grid_rowconfigure(1, weight=1)

if __name__== "__main__":
    window.mainloop()

Non ho guardato il Tuo codice con troppa attenzione ma dovrebbe funzionare.

Detto questo, alcuni suggerimenti :
1° quando posti il codice utilizza il comando "pythoncode" dell'editor per formattarlo quale codice;
2° pur funzionando, la modalità utilizzata nella stesura del codice è pessima, non Ti porta da nessuna parte, per programmare GUI è praticamente obbligatorio utilizzare le classi, acquisisci quanto più puoi circa la programmazione ad oggetti in generale ed in python in particolare, se vuoi una introduzione parti dal tutorial

Nel caso Ti serva un esempio esemplificativo, anni fa mi cimentai in un articoletto a beneficio di un amico per la definizione di un meta-widget tkinter mirato alle immagini, che non completai (dovrò decidermi a farlo, è la seconda volta che lo propongo), è rozzo, stavo appena iniziando, ma funzionava, puoi trovarlo qui, dopo esserTi fatto idea della programmazione ad oggetti, prova a dargli 'na guardata, giusto quale generica idea da migliorare.

Ciao

[Edit] ri-guardando, ora, il post mi sono accorto di aver omesso, nella funzione "close_img" di dichiarare "imm" quale global, dichiarazione necessaria per poterla "svuotare", lo "imm = None" applicato viene riferito allo scope locale alla funzione non alla "imm" globale.
« Ultima modifica: Settembre 23, 2020, 09:18 da nuzzopippo »

Offline John_Vega

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
[Risolto] Re:Passaggio oggetto immagine a funzioni
« Risposta #2 il: Settembre 23, 2020, 11:43 »
Ciao nuzzopippo,
grazie per la risposta.
Mi sa che il problema era l'utilizzo delle funzioni suggerite dall'articolo che avevo letto (forget, quit etc).
Come suggerito nel tuo esempio, dopo aver modificato imm a global nella funzione close, funziona bene.
Grazie per i suggerimenti,
so bene che non era questo il modo di scrivere il codice, l'ho fatto cosi solo per cominciare a capire come funzionava il passaggio di parametri alle funzioni, e visto che era un'interfaccia grafica, ho provato a passare un pggetto di tipo foto.
Conosco la programmazione a oggetti, classi etc, ma non l'ho mai fatta con python, immagino non sia molto diversa da quelli di altri linguaggi, i concetti sono quelli.
Più che altro, vorrei convincermi ad utilizzare python al posto di altri linguaggi anche per app grafiche. Forse l'approccio con tkinter non è dei migliori, ma non essendo esperto, non mi sento di screditarlo.
Leggerò il tuo tutorial con piacere.

Posso chiederti un'altra cosa, sperando di non finire in off topic?
Per lo sviluppo sto utilizzando Visual Studio code, ma durante il debug, mettendo dei breakpoint all'interno di una funzione, quando questa viene chiamata, il programma gira come se il breakpoint non fosse presente e non mi da la possibilità di eseguire la funzione passo passo. O meglio, si ferma sul BP quando lancio il debug, ma poi dopo continuo con l esecuazione, compila tutto, va in mainloop, e quando chiamo la funzione (per esempio Open_img), la esegue subuto. Ovviamente non riesco a vedere il valore delle variabili, o riferimenti degli oggetti, in un certo punto dell esecuzione (per esempio quando dovrei essere fermo sul breakpoint).

Grazie mille.




Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 291
  • Punti reputazione: 0
    • Mostra profilo
Re:[Risolto] Re:Passaggio oggetto immagine a funzioni
« Risposta #3 il: Settembre 23, 2020, 12:56 »
...Mi sa che il problema era l'utilizzo delle funzioni suggerite dall'articolo che avevo letto (forget, quit etc)...
Qualcosina d'altro c'era, l'insieme di quanto hai proposto è un po' incoerente, guardalo attentamente (assieme alla docs, ovvio)

Molto bene se hai conoscenze della OOP, concettualmente non sarebbe poi molto differente, provenendo da java mi ci son trovato bene per le cose "spicce", poi pian piano si impara di più.

...Più che altro, vorrei convincermi ad utilizzare python al posto di altri linguaggi anche per app grafiche. Forse l'approccio con tkinter non è dei migliori, ma non essendo esperto, non mi sento di screditarlo.
Leggerò il tuo tutorial con piacere...
Riguardo a tkinter, è uno strumento, un pochino "primitivo" ma fornito di default con python, quindi spesso è facilmente riciclabile.
Esistono altri framework grafici disponibili, i "principali" ritengo siano QT (che va per la maggiore) e WX, quest'ultimo lo sto studiando correntemente approfittando di un testo in italiano (un work in progress) pubblicato da un utente del forum.

...Per lo sviluppo sto utilizzando Visual Studio code, ma durante il debug, mettendo ...
Purtroppo, essendo quel che si dice un "linuxaro", non ho pratico Visual Studio Code, certo, so che esistono rilasci anche per linux ma non li ho utilizzati, malgrado sia attratto da quell'editor non l'ho ancora provato e non so darTi indicazioni in merito.

Credo che altri utenti del Forum, ben più capaci di me, lo utilizzino, lascio a loro eventuali indicazioni in merito.

Ciao

Offline John_Vega

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Passaggio oggetto immagine a funzioni
« Risposta #4 il: Settembre 23, 2020, 13:40 »
Perfetto.

Grazie mille per il tuo tempo.


Ciao