DOMANDA immagini scorrevoli a intervallo legate a differenti bottoni _ tkinter

Hirmia

Nuovo Utente
18
2
Ciao a tutti!

Mi sto esercitando con tkinter di python 3 e vorrei creare delle immagini scorrevoli a tempo. Su ciascuna immagine inoltre vorrei legare un bottone.

Suggerimenti su quali argomenti affrontare? Conoscete già un codice simile?

Personalmente sto studiando due codici differenti per:
- mostrare immagini che si intervallano a un tot di tempo;
- un bottone con immagini che variano ogni qual volta ci si clicca.

Ho provato a costruire un codice nuovo prendendo questi esempi ma senza alcun successo.
E vorrei magari scriverne uno almeno un po' più chiaro prima di mostrarvelo.

Nel frattempo, qualcuno sa dirmi se già conosce il codice che cerco? O suggerimenti su come costruirlo?
 

clessidra

Utente Attivo
766
272
CPU
VIA C3
GPU
Ati Rage
OS
linux - Red Hat 1.1
vorrei legare un bottone
Non si capisce bene cosa intendi: aggiungere un pulsante in qualche zona dell'immagine? Però un pulsante può avere un'immagine.

Non credo che ci siano grossi problemi nel far mostrare immagini a intervalli regolari.
 

Hirmia

Nuovo Utente
18
2
Non si capisce bene cosa intendi: aggiungere un pulsante in qualche zona dell'immagine? Però un pulsante può avere un'immagine.

Non credo che ci siano grossi problemi nel far mostrare immagini a intervalli regolari.

Ciò che intendo è inserire immagini che sono per intero dei bottoni anche.
Ho trovato un codice per mostrare immagini a intervalli regolari e lo sto studiando perché ci sono elementi per me nuovi.
Inoltre quando provo a modificarlo e a integrare bottoni non va bene. Vi mostro il codice originale.


Python:
''' tk_image_slideshow3.py
create a Tkinter image repeating slide show
tested with Python27/33  by  vegaseat  03dec2013
'''
from itertools import cycle
try:
    # Python2
    import Tkinter as tk
except ImportError:
    # Python3
    import tkinter as tk
class App(tk.Tk):
    '''Tk window/label adjusts to size of image'''
    def __init__(self, image_files, x, y, delay):
        # the root will be self
        tk.Tk.__init__(self)
        # set x, y position only
        self.geometry('+{}+{}'.format(x, y))
        self.delay = delay
        # allows repeat cycling through the pictures
        # store as (img_object, img_name) tuple
        self.pictures = cycle((tk.PhotoImage(file=image), image)
                              for image in image_files)
        self.picture_display = tk.Label(self)
        self.picture_display.pack()
    def show_slides(self):
        '''cycle through the images and show them'''
        # next works with Python26 or higher
        img_object, img_name = next(self.pictures)
        self.picture_display.config(image=img_object)
        # shows the image filename, but could be expanded
        # to show an associated description of the image
        self.title(img_name)
        self.after(self.delay, self.show_slides)
    def run(self):
        self.mainloop()
# set milliseconds time between slides
delay = 3500
# get a series of gif images you have in the working folder
# or use full path, or set directory to where the images are
image_files = [
'sfondo_cristalli_neve_gif.gif',
'img1.gif',
'img2.gif',
'img3.gif',
'img4.gif'
]
# upper left corner coordinates of app window
x = 100
y = 50
app = App(image_files, x, y, delay)
app.show_slides()
app.run()
 

clessidra

Utente Attivo
766
272
CPU
VIA C3
GPU
Ati Rage
OS
linux - Red Hat 1.1
Ciò che intendo è inserire immagini che sono per intero dei bottoni anche.
Ho trovato un codice per mostrare immagini a intervalli regolari e lo sto studiando perché ci sono elementi per me nuovi.
Inoltre quando provo a modificarlo e a integrare bottoni non va bene. Vi mostro il codice originale.
Magari puoi allegare le immagini, meglio se in archivio. Cosa non va bene? Su quale OS sei?
 

Hirmia

Nuovo Utente
18
2
Magari puoi allegare le immagini, meglio se in archivio. Cosa non va bene? Su quale OS sei?

Sono su Microsoft Windows e come ultimo errore ho ottenuto:

striscia_2_pub = Striscia_2_pub (image_files, delay)
NameError: name 'image_files' is not defined


Questa è una parte del codice:

Python:
from itertools import cycle

import tkinter as tk



class Striscia_2_pub:

    def __init__(self, master, image_files, delay):

        framePub=tk.Frame(master, height=300, width=400)
        framePub.grid(row=1, column=0, padx=10,pady=10)
        framePub.grid_propagate()

        self.delay = delay

        self.image_files = image_files

        self.pictures = cycle ((tk.PhotoImage(file=image), image)
                               for image in image_files)

        self.picture_display = tk.Label(self)
        self.picture_display.grid(row=1, column=0, padx=10,pady=10)

        delay = 3500    # set milliseconds time between slides

        image_files = ['img1', 'img2', 'img3']
        
        self.bottonePub=tk.Button(image_files[0], command=self.immagini_scorrevoli_pub)
        self.bottonePub.grid(row=1, column=0)
        self.immaginePub1= tk.PhotoImage(file="sfondo_cristalli_neve_gif.gif", width=100, height=100) 
        self.bottonePub.configure(image=self.immaginePub1, width=100, height=100)

            
        self.bottonePub=tk.Button(image_files[1], command=self.immagini_scorrevoli_pub)
        self.bottonePub.grid(row=1, column=0)
        self.immaginePub1= tk.PhotoImage(file="ag.78.gif", width=100, height=100) 
        self.bottonePub.configure(image=self.immaginePub1, width=100, height=100)

            
        self.bottonePub=tk.Button(image_files[2], command=self.immagini_scorrevoli_pub)
        self.bottonePub.grid(row=1, column=0)
        self.immaginePub1= tk.PhotoImage(file="mon.8768.gif", width=100, height=100) 
        self.bottonePub.configure(image=self.immaginePub1, width=100, height=100)
        



    def show_slides(self):

        img_object, img_name = next (self.pictures)
        self.picture_display.config(image=img_object)
        self.title(img_name)
        self.after(self.delay, self.show_slides)

    def run (self):

        self.mainloop()

striscia_2_pub = Striscia_2_pub (image_files, delay)
striscia_2_pub.slides()
striscia_2_pub.run()

'''altro codice di altre classi '''

root=tk.Tk()


striscia_2_pub = Striscia_2_pub (root)

'''...'''


root.mainloop()
 

clessidra

Utente Attivo
766
272
CPU
VIA C3
GPU
Ati Rage
OS
linux - Red Hat 1.1
striscia_2_pub = Striscia_2_pub (image_files, delay)
NameError: name 'image_files' is not defined
Premetto che non posso aiutarti più di tanto perchè uso linux, l'esperienza d'uso potrebbe essere differente.
Comunque, qull'errore dipende dal fatto che usi dei dati che non sono disponibili, li dichiari nella classe Striscia_2_pub, dovresti dichiararli prima, per esempio prima della riga
striscia_2_pub = Striscia_2_pub (image_files, delay).
 

Hirmia

Nuovo Utente
18
2
Premetto che non posso aiutarti più di tanto perchè uso linux, l'esperienza d'uso potrebbe essere differente.
Comunque, qull'errore dipende dal fatto che usi dei dati che non sono disponibili, li dichiari nella classe Striscia_2_pub, dovresti dichiararli prima, per esempio prima della riga
striscia_2_pub = Striscia_2_pub (image_files, delay).

Ho provato a seguire il tuo suggerimento e ho inserito 'self.image_files = image_files'
prima della classe Striscia_2_pub ma risulta il medesimo errore.

Non so più che altri tentativi fare, non comprendo che altro c'è da definire. Dopo tutto il codice preso da internet funziona se lo uso da solo e uso 'image_files' come è lì riportato.
Post unito automaticamente:

Aggiornamento! Ho spostato image_files e delay (perchè dopo è apparso lo stesso messaggio di errore per delay). Dovrei aver risolto questo aspetto ma ora ho TypeError: __init__() missing 1 required positional argument: 'delay'.

Questa è la parte di codice modificata, giusto per mostrare gli spostamenti:


# Per ora ho tolto la parte dei bottoni per semplificare un po' e magari comprendere meglio come sistemare il codice

Codice:
class Striscia_2_pub:

    def __init__(self, master, image_files, delay):

        framePub=tk.Frame(master, height=300, width=400, bg='thistle1') # togli colore
        framePub.grid(row=1, column=0, padx=10,pady=10)
        framePub.grid_propagate()

        self.delay = delay

        # tolti da qui delay e image_files

        self.image_files = image_files

        self.pictures = cycle ((tk.PhotoImage(file=image), image)
                               for image in image_files)

        self.picture_display = tk.Label(self)
        self.picture_display.grid(row=1, column=0, padx=10,pady=10)

      
    def show_slides(self):

        img_object, img_name = next (self.pictures)
        self.picture_display.config(image=img_object)
        self.title(img_name)
        self.after(self.delay, self.show_slides)

    def immagini_scorrevoli_pub(self):
        print('immagine scorrevole pub')

    def run (self):
        self.mainloop()
        
# inseriti qui delay e image_files

delay = 3500    # set milliseconds time between slides

image_files = [
            'sfondo_cristalli_neve_gif.gif',
            'monkey gif.gif',
            'omii76t.gif',
            'c87.gif',
            'age876.gif'
            ]

# Per ora ho tolto la parte dei bottoni per semplificare un po' e magari comprendere meglio come sistemare il codice

striscia_2_pub = Striscia_2_pub (image_files, delay)
striscia_2_pub.slides()
striscia_2_pub.run()
 
Ultima modifica:

clessidra

Utente Attivo
766
272
CPU
VIA C3
GPU
Ati Rage
OS
linux - Red Hat 1.1
No self.image_files = image_files ma image_files = ['img1', 'img2', 'img3'] .
Stesso problema con delay.
Forse ti manca qualche concetto.
 

Hirmia

Nuovo Utente
18
2
No self.image_files = image_files ma image_files = ['img1', 'img2', 'img3'] .
Stesso problema con delay.
Forse ti manca qualche concetto.

Guarda caso dopo ho spostato proprio quei due risolvendo l'errore. Anche se poi se ne è presentato uno nuovo.
Post unito automaticamente:

Comunque ora rivedo come posizionare gli argomenti. Suggerimenti?
 

clessidra

Utente Attivo
766
272
CPU
VIA C3
GPU
Ati Rage
OS
linux - Red Hat 1.1
Suggerimenti? Dovresti prima imparare il linguaggio python studiando "The python tutorial" (lo trovi nel sito ufficiale di python).
 
  • Mi piace
Reazioni: Mursey

Hirmia

Nuovo Utente
18
2
Suggerimenti? Dovresti prima imparare il linguaggio python studiando "The python tutorial" (lo trovi nel sito ufficiale di python).

Ho studiato da quel manuale e da molti altri. Tuttavia nella pratica, soprattutto quando si realizza qualcosa fuori dagli schemi (specie di base), si può incappare in errori. Di sicuro questi mi aiutano a metabolizzare meglio la teoria. Comunque una delle difficoltà che noto è il non trovare un manuale esaustivo così ricorro a codici scritti online da altri utenti e da qui ricavo nuovi spunti di studio. Ecco perché chiedo sempre un confronto, chissà, magari trovo del materiale migliore da cui studiare.

Ora, da ultimo, dopo aver risolto l'errore precedente, mi appare: generator expression must be parenthesized riferito a self.pictures = cycle((tk...
A parte il significato letterale non so come tradurlo nella pratica. E tra tentativi (che non variano nulla o che portano a un errore di sintassi) e ricerche in rete, non ho ancora trovato come risolvere la questione. E ancora, questo è uno degli esempi di cui parlavo prima: un argomento che non ho trovato nei manuali, neanche in quello da te indicato.
 

clessidra

Utente Attivo
766
272
CPU
VIA C3
GPU
Ati Rage
OS
linux - Red Hat 1.1
Non ti sei accorto di due cose prima. Uno, hai cercato di usare self all'esterno di una classe. Secondo hai utilizzato quel codice senza renderti conto che non avresti comunque risolto l'errore. Mi sono permesso di dirti di studiare perchè sono errori che non si possono commettere se si vuole fare quel semplice programma che hai in mente, almeno per quello che hai postato. Forse dovresti fermarti un attimo e esercitarti sulle basi, tra cui funzioni e classi.
Da queste parti ogni tanto si affaccia qualche programmatore professionista, ti potrebbero dare dei consigli migliori.
Per concludere, tk.PhotoImage è difficile da usare in un ciclo, e stare a perdere ore a chiederti perchè non si vedono o cambiano le immagini. La soluzione canonica in questi casi è fare diventare l'immagine una proprietà di un oggetto. Per esempio, button.image = tk.PhotoImage ecc. ecc.
 

Hirmia

Nuovo Utente
18
2
Sì stiamo sulla stessa linea. Sono consapevole che devo rafforzare le basi e sto ristudiando più attentamente i manuali. Nell'esercitarmi questo si evince talvolta quando cerco di creare qualcosa che si allontana dal testo. Grazie ancora per i suggerimenti. Come avevo già deciso, tornerò su questo codice dopo aver rivisto i manuali di base.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!