Merhaba, izninizle paylaştığınız koddaki yazım yanlışlarından bahsedeyim.
-
Button
nesnesi,tk.Tk
nesnesinden miras alınarak oluşturulmuş amasuper class
'ın__init__
metodu çağrılmamış.
class Button(tk.Tk):
def __init__(self, x, y, name, cmd=None, change=None):
super().__init__()
-
Button
sınıfı için, miras alınması gereken sınıfıntk.Button
sınıfı olması gerekiyor.
class Button(tk.Button):
def __init__(self, x, y, name, cmd=None, change=None, *args, **kwargs):
super().__init__(*args, **kwargs)
-
Button
sınıfını adeta bir fonksiyon gibi kullanmışsınız, sınıfa ait hiçbir nitelik veya metot tanımlanmamış.command
metodu da__init__
metodu içinde tanımlanmış. -
time.sleep(1)
programda donmaya neden olacağı içinThread
nesnesi kullanmışsınız.time.sleep(1)
'den sonraki kısmı bir fonksiyon içine alıp, bu fonksiyonuroot.after(1000, fonksiyon)
şeklinde çağırabilirsiniz. Yani özellikleThread
nesnesi kullanmaya gerek yok. - Sınıfı, birden fazla düğme oluşturmak istediğimizde, oluşturmak istediğimiz bütün düğmeler için aynı işlevleri yerine getirecek şekilde yazmamız gerekiyor. Sizin yazdığınız sınıf, maalesef sadece
güncellendi.png
resmi için çalışıyor. Böyle dosya isimlerini, kullanıcının en son aşamada girmesi gerekir. Dosya ismini hardcoded yaparsanız, o sınıf başka resimler için çalışamaz.
Ben olsaydım, resmi değişebilir Button
sınıfını şu şekilde yazardım:
import tkinter as tk
from PIL.ImageTk import Image, PhotoImage
class ChangeableButton(tk.Button):
def __init__(self, images, commands, *args, **kwargs):
super().__init__(*args, **kwargs)
if any(len(i) != 2 for i in [images, commands]):
raise IndexError(
"The length of 'images' and 'commands' "
"arguments must be 2."
)
self.images = [PhotoImage(Image.open(image)) for image in images]
self.index = 0
self.configure(
image=self.images[0],
command=lambda: self.command(commands),
borderwidth=0,
highlightthickness=0,
activebackground=self["bg"]
)
self.pack()
def command(self, commands):
if callable(commands[self.index]):
commands[self.index]()
if self.index == 1:
self.index = 0
else:
self.index += 1
self["image"] = self.images[self.index]
def main():
root = tk.Tk()
ChangeableButton(
master=root,
images=("power-on.png", "power-off.png"),
commands=(lambda: print("power on"), lambda: print("power off"))
)
ChangeableButton(
master=root,
images=("switch-on.png", "switch-off.png"),
commands=(lambda: print("switch on"), lambda: print("switch off"))
)
ChangeableButton(
master=root,
images=("start.png", "stop.png"),
commands=(lambda: print("started"), lambda: print("stopped"))
)
root.mainloop()
if __name__ == "__main__":
main()