Tkinter foto işlemleri

Merhabalar. tkinter da labele foto atıp, fotoyu belirli zaman aralıklarında otomatik değiştirmek istiyorum. örneğin butona bastığımda 1. foto labele gelecek 1 saniye sonra diğeri gibi. Bunu yapmak istediğimde bekliyor ve en son hangi foto gelecekse onu ekrana getiriyor. Halbuki ben geçişleri görmek istiyorum, geçişleri göremeden son fotoyu ekranda görebiliyorum sadece. Bu konuda yardım edebilir misiniz?

Merhaba, kodlarınızı paylaşabilir misiniz acaba?

Size zahmet kodlarınızı kopyalanabilir bir şekilde paylaşabilir misiniz?

Tekrar merhaba, aşağıdaki kodları bir inceleyin isterseniz.

import tkinter as tk

from os import listdir
from time import sleep
from threading import Thread

from PIL.ImageTk import PhotoImage

root = tk.Tk()

label = tk.Label(root)
label.pack()

images = [PhotoImage(file=i) for i in listdir(".") if i.endswith("jpg")]

x = 0 


def change_img():
    global x
    sleep(1)
    try:
        label.configure(image=images[x])
    except IndexError:
        x = 0
        label.configure(image=images[x])
    x += 1
        

button = tk.Button(
    root, text="Click", 
    command=lambda: Thread(target=change_img).start()
)
button.pack()

root.mainloop()
1 Beğeni

images dizisine ben elle ekleme yaptım denedim şöyle bir sonuç aldım. Butona tıkladığımda foto değişiyor evet bu da benim açımdan öğrendiğim bir adım bunun için teşekkürler. Fakat benim nihai hedefim butona 1 kere tıklamak fotoların otomatik geçişini sağlamak. Değişiklikler sonucunda kod şu şekildedir:


from os import listdir
from time import sleep
from threading import Thread

from PIL.ImageTk import PhotoImage

root = tk.Tk()

label = tk.Label(root)
label.pack()

images = []
adres1 = "C:/Users/Tugrul/Desktop/SMO Kura Programı/Fotolar/6A/yasar.jpg"
adres2 = "C:/Users/Tugrul/Desktop/SMO Kura Programı/Fotolar/6A/cemre.jpg"
foto1 = PhotoImage(file = adres1)
foto2 = PhotoImage(file = adres2)
images.append(foto1)
images.append(foto2)

x = 0 


def change_img():
    global x
    sleep(1)
    try:
        label.configure(image=images[x])
    except IndexError:
        x = 0
        label.configure(image=images[x])
    x += 1
        

button = tk.Button(
    root, text="Click", 
    command=lambda: Thread(target=change_img).start()
)
button.pack()

root.mainloop()```

Sorunu şu şekilde çözdüm :smiley: tşkler yardımlarınız için.

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

root = tkinter.Tk()
root.geometry('300x300')

adres1 = "C:/Users/Tugrul/Desktop/SMO Kura Programı/Fotolar/6A/yasar.jpg"
adres2 = "C:/Users/Tugrul/Desktop/SMO Kura Programı/Fotolar/6A/cemre.jpg"
foto1 = ImageTk.PhotoImage(file = adres1)
foto2 = ImageTk.PhotoImage(file = adres2)
fotolar = [foto1, foto2]

def thread_foto():
    label = tkinter.Label(root, image = foto1).place(x = 10, y = 10)
    time.sleep(1)
    label = tkinter.Label(root, image = foto2).place(x = 10, y = 10)

t1 = threading.Thread(target=thread_foto)

t1.start()

root.mainloop()

Altarnatif, olarak threading ve time kütüphaneleri kullanmadan onun yerine after metodu ile şu şekilde…

import tkinter as tk
from os import listdir
from PIL.ImageTk import PhotoImage

root = tk.Tk()

images = [PhotoImage(file=i) for i in listdir(".") if i.endswith("jpg")]

label = tk.Label(root)
label.pack()

x = 0
def loop():
    global x

    try:
        label["image"] = images[x]
    except IndexError:
        x = 0
        label["image"] = images[x]
    x += 1
    
    label.after(500, loop) #500ms

button = tk.Button(root, text="Click", command=loop)
button.pack()

root.mainloop()
1 Beğeni

@Tugrul_Golcu

Alternatif olarak şöyle bir değişiklik de yapabilirdiniz. Label'i bir kere tanımlamanız yeterli aslında. Buton’a her tıklandığında fonksiyon içine aldığınız Label tekrar tekrar tanımlanacak.

import tkinter as tk

from os import listdir
from time import sleep
from threading import Thread

from PIL.ImageTk import PhotoImage

root = tk.Tk()

label = tk.Label(root)
label.pack()

images = [PhotoImage(file=i) for i in listdir(".") if i.endswith("jpg")]


def change_img():
    for i in images:
        label.configure(image=i)
        sleep(1)


button = tk.Button(
    root, text="Click", 
    command=lambda: Thread(target=change_img).start()
)
button.pack()

root.mainloop()
1 Beğeni

Merhaba, threat tanımlayıp tekrardan butona bastığımda, threat bir kez çalıştırılabilir gibi bir hata aldım. Netten nasıl durdurup çalıştırabilirim diye baktım ama pek bir şey anlamadım. Yine de bakış açısı kattınız bana teşekkürler.

Merhaba, istediğim şeyi bu şekilde yapabilirim sanırım. Yardımınız için teşekkürler.

Aynı threadi iki kez çalıştıramazsınız. Ama aynı targete sahip bir thread daha oluşturmanızın önünde bir engel yok. Yine de burada thread kullanmaya ihtiyacımız yok. after metodu yeterli. Bu kod işinizi görecektir:

import tkinter as tk

from os import listdir

from PIL.ImageTk import PhotoImage

root = tk.Tk()
root.geometry("500x500")

label = tk.Label(root)
label.pack()

images = [PhotoImage(file=i) for i in listdir(".") if i.endswith("png")]


animasyon_devam_ediyormu = False
index = -1
def change_img():
    global index, animasyon_devam_ediyormu
    try:
        index += 1
        image = images[index]
    except IndexError:
        index = -1
        animasyon_devam_ediyormu = False
    else:
        label["image"] = image
        root.after(1000, change_img)
        animasyon_devam_ediyormu = True
    

button = tk.Button(
    root, text="Click", 
    command= lambda: change_img() if not animasyon_devam_ediyormu else None
)

button.pack(side= tk.BOTTOM)

root.mainloop()

1 Beğeni

Ekrem bey teşekkürler bilgiler için. Bir sorum daha olacak size müsadenizle. Şimdi ben bu programı yazdım. Pil kütüphanesini de bilgisayarıma yüklemiştim zamanında. Bu programı başka bilgisayarda çalıştırmak istediğimde bilgisayarda python yüklü olmasına rağmen çalıştıramadım. Siyah ekran geldi sonra hemen gitti. Bilgisayara sadece python yüklemek yeterli olmuyor mu çalıştırmak için illa farklı kütüphaneleri de yüklemem mi gerekiyor? Cevabınız evetse pil kodumdaki kütüphaneleri nereden indirebilirim mesela PIL kütüphanesini. pip install pillow yazılacak diyor ekrana. Ben bu satırı komut satırına da yazsam python satırına da yazsam hata alıyorum.

Bu hata komut satırına pip install pillow komutunu yazınca çıkıyorsa pip.exenin olduğu dizin PATH’a eklenmemiş olabilir.

Bilgisayarda python yüklü olması kütüphane kullanımı açısından bir şey ifade etmez. Siz nasıl kendi bilgisayarınızda PIL yüklü olmadan çalıştıramıyorsanız başka bilgisayarlarda da çalıştıramazsınız. Çünkü python programınızı uygulama (exe) haline getirmeden, betik kodu olarak aktarıyorsunuz.


Eğer kodlarınızı uygulamaya çevirerek herhangi bir ek programa veya pythona ihtiyaç duymadan çalıştırmak istiyorsanız bu videoda gösterilen aracı kullanmanızı tavsiye ederim. PyInstaller kütüphanesini kullanarak ve kullanışlı bir arayüz sağlayarak kodlarınızı uygulamaya çeviriyor.


Eğer programınızı çalıştırdığınızda gerekli kütüphane bulunmuyorsa ve otomatik yüklenmesini isterseniz kodunuzun en başına bunu koyabilirsiniz:

try:
    import PIL
except ModuleNotFoundError:
    print("PIL modülü bulunamadı.\nGerekli indirme işlemleri yapılıyor.\nİşlem bittiğinde programınız yeniden başlatılacak.")
    from sys import executable
    from sys import exit as _exit
    from os.path import dirname, join
    from os import popen, startfile
    python_path = dirname(executable)
    pip = join(python_path, "Scripts", "pip.exe")
    cmd = popen(pip+" install Pillow")
    cmd._stream.read()
    cmd.close()
    startfile(__file__)
    _exit()
1 Beğeni

Verdiğiniz bilgiler için teşekkür ederim. Okuldaki bilgisayarda denedikten sonra bir aksilik yaşarsam size yazarım.

Merhaba. Dediğiniz gibi path’a eklenmemiş. Ben elle ekleyemedim, kaldırıp tekrardan kurarken gelişmiş seçeneklerde path seçeneğini ekledim sorunu çözüm. Yardımlarınız için teşekkürler.

1 Beğeni