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()
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 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()
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()
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ı target
e 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()
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()
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.