Chcę wyswietlić na Canvas w TKinter dwa obrazki po kolei a Python nie wyświetla nic albo tylko ostatni!

0

Witam wszystkich.
Programowanie to moje hobby. Od kilku miesięcy próbuję ogarnąć język python. W ramach ćwiczeń chciałem napisać program zmieniający obrazki poprzez przenikanie czyli jeden powoli przechodzi w drugi. Wczesniej napisałem taki program w Delphi i w Javascript. Program który zamieszczam jest bardzo prosty ale już sprawia kłopoty.

from tkinter import *
from PIL import Image,ImageTk
import time
root = Tk()
root.geometry('1000x750')
canvas=Canvas(root,width=1000,height=750)
canvas.pack()
pilImage1=Image.open("zielony.jpg")
image1=ImageTk.PhotoImage(pilImage1)
pilImage2=Image.open("czerwony.jpg")
image2=ImageTk.PhotoImage(pilImage2)

pilobraz=Image.blend(pilImage1,pilImage2, 0.1)
obraz=ImageTk.PhotoImage(pilobraz)
canvas.create_image(500,370,image=obraz)
print ('obrazek pierwszy')

time.sleep(2)

pilobraz=Image.blend(pilImage1,pilImage2, 0.8)
obraz=ImageTk.PhotoImage(pilobraz)
canvas.create_image(500,370,image=obraz)
print('obrazek drugi')

root.mainloop()```
Problem polega na tym że program wyświetla poprawnie i w odpowiednim czasie instrukcje print ale z wyświetleniem obrazka
 czeka do końca i wyswietla tylko ten z wierszy od 21 a więc drugi czyli ostatni. Natomiast jeśli zablokuję wyświetlanie 
ostatniego obrazka to pokazuje się tylko szare okno Tkinter. Jeśli usuniemy instrukcję time.sleep(2) to obrazek w ogóle się 
nie wyświetla. W takiej sytuacji nie ma mowy o przenikaniu w jakiejkolwiek postaci. Oczywiście kod który przedstawiłem ma 
tylko ilustrować problem. Chodzi mi głównie o to żeby poznać mechanizm dlaczego tak się dzieje i dlaczego Python nie 
wykonuje instrukcji przez które przechodzi , a jeśli wykonuje to dlaczego nie wyświetla wyniku i co można zrobić aby mu 
powiedzieć że ma go wyświetlić. Pewnie należałoby przenieść operację ładowania do osobnego wątku ale na to to ja jestem 
jeszcze za słaby. Mam nadzieję że znajdzie się ktoś kto zechce poswięcić swój czas i douczyć nowego użytkownika. Pythona. 
Będę zobowiązany za każdą podpowiedź.
Pozdrawiam !
0

Wieki nie używałem tkintera, ale chyba problem jest tutaj

pilobraz=Image.blend(pilImage1,pilImage2, 0.8)
obraz=ImageTk.PhotoImage(pilobraz)
canvas.create_image(500,370,image=obraz)

Po prostu nadpisujesz 2x to samo, stąd widoczny jest drugi-ostatni obrazek na cordach 500x370

0

@dinosaur:
ledi12 napisał
Po prostu nadpisujesz 2x to samo, stąd widoczny jest drugi-ostatni obrazek
A może trochę jaśniej ?
Przed upływem 2 sekund powinien być widoczny pierwszy bo kod do drugiego jeszcze nie dotarł, ale go nie ma.

1

Problem polega na tym, że mainloop dopiero wszystko uruchamia, całe wyświetlanie okna itd. jeśli wstrzymasz program przed mainloopem to program utworzy Ci okno z pierwszym obrazkiem, potem będzie czekał 2s, potem doda drugi obrazek i dopiero potem wyświetli okno. Gdy korzystasz z TkInter to zamiast sleep używaj after.
Zobacz np. tu: https://blog.furas.pl/python-tkinter-u%C5%BCycie-after-do-wyswietlania-czasu-pl.html

Przeanalizuj też ten przykład:
https://blog.furas.pl/python-tkinter-update-image-on-canvas-with-button-click-gb.html

Jak to wszystko połączysz to wyjdzie Ci coś w miarę sensownego, np.:

from tkinter import *
from PIL import Image,ImageTk
import time

def pokaz_drugi_obraz():
    canvas.itemconfig(image_id, image=obraz2)
    print('obrazek drugi')


root = Tk()
root.geometry('1000x750')
canvas=Canvas(root,width=1000,height=750)
canvas.pack()
pilImage1=Image.open("zielony.jpg")
#image1=ImageTk.PhotoImage(pilImage1)
pilImage2=Image.open("czerwony.jpg")
#image2=ImageTk.PhotoImage(pilImage2)

pilobraz1=Image.blend(pilImage1,pilImage2, 0.1)
obraz1=ImageTk.PhotoImage(pilobraz1)

pilobraz2=Image.blend(pilImage1,pilImage2, 0.8)
obraz2=ImageTk.PhotoImage(pilobraz2)

image_id = canvas.create_image(500,370,image=obraz1)
print ('obrazek pierwszy')


root.after(2000, pokaz_drugi_obraz)
#time.sleep(2)


root.mainloop()

Tobie zostawiam analizę tego co i dlaczego się tu zadziało ;)

0

Arthan jesteś genialny . O taką właśnie odpowiedź mi chodziło.
Zabieram się za analizę tego co napisałeś i nie odpuszczę póki wszystko nie będzie jasne. Dziękuję i pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1